Я работаю над проектом DSP на Android, который требует ввода-вывода аудио с низкой задержкой. По этой причине я использую библиотеку Oboe . В примере LiveEffect показана синхронная запись и воспроизведение. Однако для нейтрализации акустической обратной связи мне нужно наоборот: сначала генерировать сигнал белого шума через встроенный динамик, а затем записывать его с помощью микрофона. Я попытался изменить LiveEffect пример, используя этот заданный вопрос, т.е. установив поток записи в качестве Master ( callback ) и используя неблокирующий метод записи для потока воспроизведения , Но я получил следующую ошибку при запуске кода на Pixel XL (Android 9.0):
D/AudioStreamInternalCapture_Client: processDataNow() wait for valid timestamps
D/AudioStreamInternalCapture_Client: advanceClientToMatchServerPosition() readN = 0, writeN = 384, offset = -384
--------- beginning of crash
A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x5800003f666c66 in tid 2852 (AAudio_1), pid 2796 (ac.oiinitialize)
Вот мой обратный звонок:
oboe::DataCallbackResult
AudioEngine::onAudioReady(oboe::AudioStream *oboeStream, void *audioData, int32_t numFrames) {
assert(oboeStream == mRecordingStream);
int32_t framesToWrite = mPlayStream->getFramesPerBurst();
oscillator_->whiteNoise(framesToWrite); // write white noise into buffer;
oboe::ResultWithValue<int32_t> result = mPlayStream->write(oscillator_->write(), framesToWrite, 0);
// oscillator_->write() returns const void* buffer;
if (result != oboe::Result::OK) {
LOGE("input stream read error: %s", oboe::convertToText(result.error()));
return oboe::DataCallbackResult ::Stop;
}
// add Adaptive Feedback Neutralization Algorithm here....
return oboe::DataCallbackResult::Continue;
}
Правильно ли подходит мой подход для генерации сигнала и последующего захвата его через микрофон? Если так, может кто-нибудь помочь мне с этой ошибкой? Заранее спасибо.