Аудио ввод / вывод для нейтрализации обратной связи с использованием библиотеки Oboe
Я работаю над проектом DSP на Android, который требует ввода-вывода аудио с низкой задержкой. По этой причине я использую библиотеку Oboe. В примере LiveEffect демонстрируется синхронная запись и воспроизведение. Однако для нейтрализации акустической обратной связи мне нужно наоборот: сначала генерировать сигнал белого шума через встроенный динамик, а затем записывать его с помощью микрофона. Я попытался изменить пример LiveEffect, используя этот заданный вопрос, т.е. установив поток записи как Master ( обратный вызов) и используя неблокирующий метод записи для потока воспроизведения. Но я получил следующую ошибку при запуске кода на 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;
}
Является ли мой подход правильным для генерации сигнала и последующей записи через микрофон? Если так, может кто-нибудь помочь мне с этой ошибкой? Заранее спасибо.
1 ответ
Однако для нейтрализации акустической обратной связи мне нужно наоборот: сначала генерировать сигнал белого шума через встроенный динамик, а затем записывать его с помощью микрофона.
Вы все еще можете сделать это, используя обратный вызов выходного потока и неблокирующее чтение входного потока. Это наиболее распространенный (и проверенный) способ выполнения синхронного ввода-вывода. Эффект Ларсена будет хорошо работать таким образом.
Ваш подход все еще должен работать, однако я бы придерживался способа настройки потоков LiveEffect, поскольку он работает.
С точки зрения вашей ошибки SIGSEGV
обычно означает разыменование нулевого указателя - вы запускаете входной поток перед выходным потоком? Это может означать, что вы пытаетесь записать в выходной поток, который еще не открыт.