私のAndroidアプリ(NDK/OpenSL ESを使用しています)のオーディオコールバックで非常に特殊な問題が発生しています。私は44.1 kHzと512フレーム(私に11.6ミリ秒のコールバック時間を与える)でオーディオ出力をストリーミングしています。コールバックでは、(シンセサイザーのような)いくつかの波形、フィルターなどを合成しています。最適化のために、コールバック時間が5ミリ秒を超えることはありません。しかし、特定のエフェクト(デジタルディレイライン)をオンにすると、コールバックにはかなり長い時間がかかり始めます。デジタルディレイラインは7.5 ms(すべてのボイス/フィルターが処理された後)から100〜350 msにジャンプします。Android:初期の音声処理メソッド呼び出しに時間がかかります
これは最も混乱する部分です。おそらく1秒または2秒後に、デジタル遅延の実行時間は、コールバックごとに非常に高い時間から0.2msの完了時間にジャンプします。
なぜ、Androidアプリは最初のいくつかのコールバックをコード化して、非常に短いオーディオで幸せな時間までに、私のデジタル遅延処理を完了するのに時間がかかりますか?私はちょっとしたことで、今これを修正する方法がわからない。確認するには、これは遅延処理方法でのみ発生します。それはちょうど標準的なデジタル遅延線です(ギターの一部を見つけることができます)。アルゴリズムはここの問題ではないと感じます...
私のオーディオコールバックコードの擬似コードの概要:
static bool myAudioCallback(void *userData, short int *audIO, int numSamples, int srate) {
AudioData *data = (AudioData *)userData;
// Resets pointer array values to 0
for (int i = 0; i < numSamples; i++) data->buffer[i] = 0;
// Voice Generation Block
for (int voice = 0; voice < data->numVoices; voice++) {
// Reset voice buffers:
for (int i = 0; i < numSamples; i++) data->voiceBuffer[i] = 0;
// Generate Voice
data->voiceManager[voice]->generateVoiceBlock(data->voiceBuffer, numSamples);
// Sum voices
for (int i = 0; i < numSamples; i++) data->buffer[i] += data->voiceBuffer[i]];
}
// When app first starts, delayEnabled = false so user must click on a
// button on the UI to enable it.
// Trouble is that when we enable processDelay(double *buffer, in frames) the
// first time, we get a long execution time.
if (data->delayEnabled) {
data->delay->processDelay(data->buffer, numSamples);
}
// Conversion loop
for (int i = 0; i < numSamples; i++) {
double sample = clipOutput(data->buffer[i]);
audIO[2*i] = audIO[(2*i)+1] = CONV_FLT_TO_16BIT(sample * data->volume);
}
}
ありがとうございます!