2016-11-07 11 views
1

私の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); 
    } 
} 

ありがとうございます!

答えて

1

未解決に多大な答えが、これは私がやったことです:ユーザーがアプリ上で何かをすることができます

前に、私は遅れをオンにし、それは前に2秒などのためにそのコースを実行してみましょうそれを切る。これにより、コールバックは、オーディオを破壊することなく、奇妙な長い300ミリ秒の実行時間を行うことができます。

明らかにこれは素晴らしい答えではなく、誰かがより論理的な説明を理解できる場合は、それを答えとしてマークするだけではありません。

関連する問題