У меня очень странная проблема с моими обратными вызовами в моем приложении для Android (это использование NDK/OpenSL ES). Я передаю аудиовыход на 44,1 кГц и 512 кадрах (что дает мне время обратного вызова 11,6 мс). В обратном вызове я синтезирую пару осциллограмм, фильтров и т. Д. (Например, синтезатор). Из-за оптимизации я никогда не достигаю более 5 мс времени обратного вызова. Однако, когда я включаю определенный эффект (цифровая линия задержки), он начинает принимать радикально более продолжительное время в обратном вызове. Цифровая линия задержки будет сказываться с 7,5 мс (после того, как все голоса/фильтры будут обработаны) и прыгать до 100-350 мс.Android: Первый вызов метода обработки звука занимает много времени
Это самая запутанная деталь; через 1 или 2 секунды время выполнения цифровой задержки будет переходить с чрезвычайно высокого времени до 0,2 мс для завершения обратного вызова.
Почему приложение 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);
}
}
Спасибо!