我正在Android上进行DSP项目,该项目需要低延迟的音频I / O。因此,我正在使用Oboe库。在LiveEffect示例中,演示了同步记录和回放。但是,对于acoustic feedback中和,我需要采取另一种方法,即首先通过内置扬声器生成白噪声信号,然后使用麦克风进行记录。我尝试使用LiveEffect提出的问题来修改this的示例,即将记录流设置为主控(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;
}
我的方法是否正确,即先生成信号然后通过麦克风捕获信号?如果是这样,有人可以帮助我解决此错误吗?先感谢您。
答案 0 :(得分:0)
但是,为了消除声音反馈,我需要采取另一种方法,即首先通过内置扬声器生成白噪声信号,然后使用麦克风进行记录
您仍然可以使用输出流回调和对输入流的非阻塞读取来执行此操作。这是执行同步I / O的更常见(且经过测试)的方法。拉森效应将以这种方式很好地起作用。
您的方法应该仍然有效,但是,我会坚持使用LiveEffect的方法来设置流,因为它可以工作。
对于您的错误SIGSEGV
,通常意味着空指针取消引用-您是在输出流之前启动输入流吗?这可能意味着您正在尝试写入尚未打开的输出流。