2

Android Play ストアに 2 つのアプリがありますが、これまで問題はありませんでした。最近、HTC one と Galaxy S4 で 1 つの機能が動作しません。Android バージョン 4.1.2 で実行されている HTC で試すことができました。問題のあるコードは次のとおりです。

 public void loadsine(){
     for (int j=0; j<44100; j++){
         double val = Math.sin(twopi*j/44100);
         AndroidAudioDevice.sigBuffer[j]= (short) (val*sinemax);
    }
 }

正弦波の 1 周期を計算し、値を short として配列に入れます。twopi と sinemax は以前に定義された定数であり、sigBuffer は short 44100 long の配列です。

これは、配列がゼロで埋められている HTC 1 と S4 を除いて正常に動作します。次のように、ループ内でいくつかの処理サイクルを無駄にすることで機能させることができることがわかりました。

 public void loadsine(){
     for (int j=0; j<44100; j++){
         double val = Math.sin(twopi*j/44100); //val between -1 and +1
         AndroidAudioDevice.sigBuffer[j]= (short) (val*sinemax);
         for (int i=0; i<4; i++){}
    }
 }

役に立たないforループの代わりに、たとえばデバッグ ウィンドウに書き込むこともできます。何が起こっているのか、HTC や Samsung のオーバーレイが問題を引き起こしているのか、それとも 4.1.2 の問題なのか. ちなみに、4.1.2 エミュレーターを動作させることができません。どこにも行きません。

4

2 に答える 2

1

sigbuffer入力チャネルよりも出力チャネルのように見えることを除いて、正確に何であるかについての詳細を見つけることはできません. あなたの問題はおそらく、HTC One/S4 が速すぎsigbufferて DMA インターフェイスであるため、オーディオ サブシステムに送信される前にデータが上書きされることです。[ここの API](http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/audio/AudioDevice.html#writeSamples(short[], int, int)) を見ると、おそらくより良いでしょう:

public void loadsine(){
    short values[44100];
    for (int j=0; j<44100; j++){
         double val = Math.sin(twopi*j/44100);
         values[j] = (short) (val*sinemax);
    }
    androidAudioDevice.writeSamples(values, 0, 44100);
}
于 2013-06-26T05:21:43.117 に答える
0

これもS4で見つけました。非常に迷惑です。FloatMath はまだ動作しているようですが、遅いためリンターは推奨していません。残念ながら、より良い修正が見つかりませんでした

于 2013-09-18T21:34:09.220 に答える