android - 使用 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;
}
我的方法对于生成信号然后通过麦克风捕获它是否正确?如果是这样,有人可以帮我解决这个错误吗?先感谢您。
解决方案
但是,对于声反馈中和,我需要另一种方式,即首先通过内置扬声器生成白噪声信号,然后使用麦克风记录它
您仍然可以使用输出流回调和输入流上的非阻塞读取来执行此操作。这是进行同步 I/O 的更常见(且经过测试)的方式。拉森效应会以这种方式正常工作。
您的方法应该仍然有效,但是,我会坚持使用 LiveEffect 设置流的方式,因为它有效。
就您的错误而言,SIGSEGV
通常意味着空指针取消引用-您是在输出流之前启动输入流吗?这可能意味着您正在尝试写入尚未打开的输出流。
推荐阅读
- java - 在 Springboot Java 中维护键值映射对的最佳方法
- android - 无法理解 () -> 调用
- r - 如何为 R 中的每一列创建一个单独的数据框,然后将所有栅格图层栅格化并将其绑定到多层栅格中?
- azure - 扩展 Azure SQL 弹性池存储时是否存在停机时间?
- php - 如何使用多个 php-fpm docker 容器设置单个 nginx 服务器
- flutter - 如何将小部件嵌入图像并将其保存到设备
- java - 使用 Apache POI HSSF 在 Excel 中存储 ArrayList
- laravel - Laravel 更新单列
- python - 生成所有连续子数组的算法
- networking - K8s中不同集群中的Pod之间使用yaml进行通信