Android SoundPool 无法通过单通道播放

Android SoundPool Cannot Play Through Single Channel

我们正在通过 Android 的 SoundPool API 播放 wav 文件。我们已经创建了一种设备,它可以通过麦克风环回其中一个立体声通道,而不是另一个。

我还应该提到,我们已经用计算机测试了我们的环回设备并确认它工作正常。

但是,当我们尝试通过未环回到麦克风的通道播放声音时,我们仍然 "hearing" 麦克风上来自该通道的声音。当我们插入耳机时,似乎 Android 仍在将单声道声音的更安静版本发送到另一个声道,即使它不应该如此。

我们已经尝试过在一个通道上静音的立体声 WAV 文件和单声道声音文件——两者的播放效果相同。任何人都可以解释这个以及如何阻止它吗?我们使用的代码是:

_Pool = new SoundPool(3, Stream.Music, 0);
var beep = assets.OpenFd("beep.wav");
var beepId = _Pool.Load(beep, 1);

//later, after the sound is loaded we call:
_Pool.Play(beepId, 1, 0, 1, 0, 1);

我还应该提到我们已经尝试了不同的音量水平(0.01 而不是 0.0 和 0.99 而不是 1.0)。我们还在多个测试设备上进行了测试,包括 Google Pixel、Samsung Note 和 LG。似乎没有任何效果。给出了什么?

此 "feature" 是所有 Android.Media.* 包媒体输出中固有的,由于 Android 音频堆栈,它发生在物理和模拟设备上 Android 最多支持 8 声道音频,混合所有可用声道以产生音频输出。

即如果您创建一个 AudioFormat 屏蔽除右声道之外的所有声道,无论 AudioAttributes:

var audioFormat = new AudioFormat.Builder()
                .SetChannelIndexMask(2) // Right channel
                .SetSampleRate(8000)
                .SetEncoding(Encoding.Pcm16bit)
                .Build();

这些 API 高于 AudioFlingerlibmediaHAL 等...因此受制于 FastMixer/NormalMixer/AudioMixer 提供的最终混合,等...

您可以查看 ALSA(高级 Linux 声音架构)和 OSS(开放式声音系统)以访问硬件音频服务以绕过正常的音频处理。