所以我为一个安卓应用写了这篇文章。这个想法很简单:
检测声音是否正在播放,如果是,则打开 BluethoothSCO 频道,以便在那里播放音频。
我想用它将导航方向信息“路由”到我的汽车扬声器。它几乎像预期的那样工作。
在音频识别和 bluethoothsco 连接准备就绪之间有大约 1 秒的“巨大”延迟。这导致丢失了近一半的导航信息。
我的想法是添加延迟或暂停播放一秒钟。
现在:检测到声音 -> BluethootSCO 打开(声音一直在此处播放) -> 汽车扬声器发出声音
想法:检测到声音->暂停/延迟1秒->BluethootSCO打开->恢复播放->汽车扬声器发出声音
我考虑过录制它并在之后播放它,但对于“现在左转”之类的一些信息来说已经太晚了。
短暂的延迟是可以的,但我不知道要实现这个:(
由于该应用程序仅供我自己使用,因此使用 root 可以。也许有可能直接在 AudioFlinger 上?
public void checkSound() {
AudioManager localAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE);
Visualizer localVisualizer = new Visualizer(0);
localVisualizer.setEnabled(true);
Visualizer.MeasurementPeakRms localPeak = new Visualizer.MeasurementPeakRms();
boolean wasPlayingBefore=false;
while (keeprunning) //Loop to detect changes on the Media Audio Stream
{
localVisualizer.getMeasurementPeakRms(localPeak);
if(localPeak.mPeak > -8500 && !wasPlayingBefore)
{
//There is some audio output
wasPlayingBefore=true;
localAudioManager.setBluetoothScoOn(true);
localAudioManager.startBluetoothSco();
localAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
android.os.SystemClock.sleep(5000); //Route to BT Headset will exist min. 5 seconds ...
}
if(localPeak.mPeak <= -8500 && wasPlayingBefore)
{
//output (temporary) gone
android.os.SystemClock.sleep(2000);//... plus this 2 seconds
//check again
localVisualizer.getMeasurementPeakRms(localPeak);
}
if(localPeak.mPeak <= -8500 && wasPlayingBefore)
{
//Audio didn't get back in last 2 seconds...
wasPlayingBefore=false;
localAudioManager.setBluetoothScoOn(false);
localAudioManager.stopBluetoothSco();
localAudioManager.setMode(AudioManager.MODE_NORMAL);
}
android.os.SystemClock.sleep(100); //Slow down the loop
Log.d("Peak", String.valueOf(localPeak.mPeak));//Debug info - Audio peak -9600 = Silent, 0 = MAX Output
}
localVisualizer.release();
}