2017-10-04 117 views
1

我們正在通過Android的SoundPool API播放wav文件。我們已經創建了一種設備,通過麥克風將其中一個立體聲通道環回,但不是其他設備。Android SoundPool無法通過單個頻道播放

我還應該提到,我們已經使用計算機測試了我們的回送設備,並確認它可以正常工作。但是,當我們嘗試通過未環回麥克風的通道播放聲音時,我們仍然「聽到」麥克風上該通道發出的聲音。當我們插入耳機時,看起來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。似乎沒有任何工作。是什麼賦予了?

回答

1

這種「特徵」,是在所有的Android.Media.*封裝介質輸出所固有的,它由於在Android音頻堆棧發生在物理和仿真設備由於Android的最多8個信道的音頻和混音所有可用信道支持這樣的事實產生音頻輸出。

即如果創建的AudioFormat掩蓋了所有信道,除了右聲道,則仍然有在左聲道一些輸出(假定使用的是一個2信道輸出裝置),而不管​​的:

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

這些API是AudioFlingerlibmedia上述情況,HAL,等等,因而受到最終混合由FastMixer/NormalMixer/AudioMixer提供,等等

你可以看一下ALSA(高級Linux聲音體系結構)和OSS(開放式聲音系統m)以便訪問硬件音頻服務以繞過正常的音頻處理。

enter image description here

+0

謝謝你的回答。我們最終通過修改硬件來修復這個問題。 –