我的Android应用程序(使用NDK / OpenSL ES)中的音频回调出现了一个非常奇怪的问题。我正在以44.1 kHz和512帧的速度传输音频输出(这使我的回调时间为11.6 ms)。在回调中,我正在合成一些波形,滤波器等(如合成器)。由于优化,我从未达到超过5毫秒的回调时间。但是,当我打开特定效果(数字延迟线)时,它开始在回调中花费更长的时间。数字延迟线将从7.5 ms开始跳跃(在所有声音/滤波器处理完毕后)并跳转到100到350 ms。
这是最令人困惑的部分;在1或2秒后,数字延迟执行时间将从极高时间跳到每回调0.2 ms完成时间。
为什么Android应用程序需要很长时间才能完成我的数字延迟处理代码的前几个回调,然后消失到一个非常短暂和音频愉快的时间?我现在有点不知所措,不知道如何解决这个问题。为了确认,这仅在延迟处理方法中发生。它只是一个标准的数字延迟线(你可以在github上找到一些),我觉得算法不是这里的问题......
有关我的音频回调代码的伪代码/粗略草图:
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);
}
}
谢谢!
答案 0 :(得分:1)
对解决方案不是一个很好的答案,但这就是我所做的:
在用户能够对应用程序执行任何操作之前,我打开了延迟并让它运行2秒钟,然后再将其关闭。这允许回调在不破坏音频的情况下执行其奇怪的长300毫秒执行时间。
显然这不是一个好的答案,如果有人能够找到更合乎逻辑的解释,我会非常乐意将其标记为答案。