首页 > 解决方案 > 使用 Oboe 库进行反馈中和的音频 I/O

问题描述

我正在开发一个需要低延迟音频 I/O 的 Android DSP 项目。出于这个原因,我正在使用双簧管库。在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;
}   

我的方法对于生成信号然后通过麦克风捕获它是否正确?如果是这样,有人可以帮我解决这个错误吗?先感谢您。

标签: androidandroid-ndkoboe

解决方案


但是,对于声反馈中和,我需要另一种方式,即首先通过内置扬声器生成白噪声信号,然后使用麦克风记录它

您仍然可以使用输出流回调和输入流上的非阻塞读取来执行此操作。这是进行同步 I/O 的更常见(且经过测试)的方式。拉森效应会以这种方式正常工作。

您的方法应该仍然有效,但是,我会坚持使用 LiveEffect 设置流的方式,因为它有效。

就您的错误而言,SIGSEGV通常意味着空指针取消引用-您是在输出流之前启动输入流吗?这可能意味着您正在尝试写入尚未打开的输出流。


推荐阅读