1

そこで、Android アプリ用にこの記事を書きました。アイデアは簡単です:

サウンドが再生されているかどうかを検出し、再生されている場合は BluethoothSCO チャネルを開き、そこでオーディオが再生されるようにします。

これを使用して、ナビゲーションの方向情報を車のスピーカーに「ルーティング」したいと考えています。ほぼ期待どおりに動作します。

音声認識と bluethoothsco 接続の準備が整うまでに約 1 秒の「大きな」遅延があります。これにより、ナビゲーション情報のほぼ半分が失われます。

私のアイデアは、遅延を追加するか、再生を 1 秒間一時停止することでした。

現在: サウンドが検出されます -> BluethootSCO が開きます (サウンドはここで再生され続けます) -> 車のスピーカーからサウンドが聞こえます

IDEA: サウンドが検出されました -> 1 秒間の一時停止/遅延 -> BluethootSCO の開始 -> 再生の再開 -> 車のスピーカーからのサウンド

録音して後で再生することも考えましたが、「今すぐ左に曲がる」などの情報については遅いでしょう。

短い遅延は問題ありませんが、これを実装する方法がわかりません:(

アプリは自分専用なので、ルートを使用しても問題ありません。たぶん、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();
}
4

0 に答える 0