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);
}
}
고마워요!