2016-11-07 5 views
1

Android 앱 (NDK/OpenSL ES 사용)의 오디오 콜백과 관련하여 매우 특이한 문제가 있습니다. 44.1 kHz 및 512 프레임 (11.6 ms의 콜백 시간을 제공)에서 오디오 출력을 스트리밍하고 있습니다. 콜백에서 두 개의 파형, 필터 등을 합성합니다 (예 : 신디사이저). 최적화로 인해 콜백 시간이 5ms를 넘지 않습니다. 그러나 특정 효과 (디지털 지연 선)를 켜면 콜백에서 근본적으로 더 긴 시간이 걸리기 시작합니다. 디지털 딜레이 라인은 7.5ms에서 점프하고 (모든 보이스/필터가 처리 된 후) 100에서 350ms까지 점프합니다.Android : 초기 오디오 처리 방법을 호출하는 데 오랜 시간이 걸립니다.

이것은 가장 혼란스러운 부분입니다. 어쩌면 1 초 또는 2 초 후에 디지털 지연 실행 시간이 매우 높은 시간에서 콜백 당 0.2 밀리 초 완료 시간으로 점프합니다.

왜 안드로이드 앱이 처음 몇 번의 콜백 코드를 처리하고 디지털 시간 지연 처리를 완료하는 데 오랜 시간이 걸리고 왜 매우 짧고 오디오 해피 타임까지 죽을까요? 나는 지금 당장 실망스럽고 이것을 고치는 법을 모릅니다. 확인하려면 지연 처리 방법에서만 발생합니다. 그냥 표준 디지털 지연 라인 (당신은 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 초 후에 등에 그 과정을 실행하자 그것을 끈다. 이것은 콜백이 오디오를 파괴하지 않으면 서 이상한 긴 300ms 실행 시간을 수행 할 수있게합니다.

물론 이것은 위대한 답변이 아니며 누구든지 더 논리적 인 설명을 이해할 수 있다면 그 질문을 답으로 표시하는 것이 더 이상 행복 할 것입니다.