2016-11-07 7 views
1

У меня очень странная проблема с моими обратными вызовами в моем приложении для 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); 
    } 
} 

Спасибо!

ответ

1

Не большой ответ на решение, но это то, что я сделал:

Прежде чем пользователь в состоянии сделать что-либо на приложение, я включил задержки и дайте ему свой курс как 2 секунды до отключив его. Это позволяет callback выполнять свое странное длительное время выполнения 300 мс, не разрушая звук.

Очевидно, что это не очень хороший ответ, и если кто-то может найти более логичное объяснение, я был бы более чем счастлив отметить это как ответ.

Смежные вопросы