аудио ввод / вывод для нейтрализации обратной связи с использованием библиотеки Oboe - PullRequest
0 голосов
/ 14 января 2019

Я работаю над проектом 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;
}   

Правильно ли подходит мой подход для генерации сигнала и последующего захвата его через микрофон? Если так, может кто-нибудь помочь мне с этой ошибкой? Заранее спасибо.

1 Ответ

0 голосов
/ 15 января 2019

Однако для нейтрализации акустической обратной связи мне нужно наоборот: сначала генерировать сигнал белого шума через встроенный динамик, а затем записывать его с помощью микрофона

Вы все еще можете сделать это, используя обратный вызов выходного потока и неблокирующее чтение входного потока. Это наиболее распространенный (и проверенный) способ выполнения синхронного ввода-вывода. Эффект Ларсена будет хорошо работать таким образом.

Ваш подход все еще должен работать, однако я бы придерживался способа настройки потоков LiveEffect, поскольку он работает.

С точки зрения вашей ошибки SIGSEGV обычно означает разыменование нулевого указателя - вы запускаете свой входной поток перед выходным потоком? Это может означать, что вы пытаетесь записать в выходной поток, который еще не открыт.

...