2013-04-02 10 views
5

これは私の最初の投稿Stackoverflowです。 私は過去数日間アンドロイドスマートフォンで音声をルーティングしようとしていますが、私はそれを正しく行う機能が見つかりません。Android - スマートフォンとBluetoothモジュール間で音声をルーティングする機能

Bluetoothの赤ちゃんを作るためのものです。

スマートフォンとBluetoothモジュールの間でルーティングを行う必要があります。 Bluetoothモジュールは、当初、ハンドセット、車のハンズフリー、ワイヤレススピーカーを作るために使用されます。

私はプロジェクトのオーディオ側のA2DPとHFP(Handfree)プロファイルと通信します。

デバイス間で「sco」接続(オーディオBluetooth交換で使用される接続)を確立し、Bluetoothモジュールから音声を戻すことができます。しかし、接続「sco」が機能しているときは、私のスマートフォンでスピーカーとマイクを使用することはできません。

スマートフォンで音声を使用するソリューションと、同時にBluetoothモジュールで音声を使用するソリューションを見つけることを希望します。

http://developer.android.com/index.htmlで、音声をルーティングする機能を検索しました。

AudioManagerクラスには、setRoutingやsetParametersのようなオーディオをルーティングする関数がありますが、まだ結果があります。

boolean isRecording=true; 
int buffersize = 8000; 
byte[] buffer = new byte[buffersize]; 

//audio configuration and SCO Bluetooth connection. 
AudioManager aManager = (AudioManager) getSystemService(AUDIO_SERVICE); 
android.os.Process.setThreadPriority(
      android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 
aManager.startBluetoothSco(); 
aManager.setBluetoothScoOn(true); 
aManager.setMode(AudioManager.MODE_IN_COMMUNICATION); 

//AudioRecord configuation for recording audio from babyphone. 
AudioRecord arec = new AudioRecord(
      MediaRecorder.AudioSource.VOICE_COMMUNICATION, 
      8000, 
      AudioFormat.CHANNEL_IN_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, 
      buffersize); 

//AudioTrack configuation for sending audio to smartphone speaker.     
AudioTrack atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 
       8000, 
       AudioFormat.CHANNEL_OUT_MONO, 
       AudioFormat.ENCODING_PCM_16BIT, 
       buffersize, 
       AudioTrack.MODE_STREAM); 

atrack.setPlaybackRate(8000); 

//start audio recording and playing. 
arec.startRecording(); 
atrack.play(); 

while(isRecording) { 
    arec.read(buffer, 0, buffersize); 

    atrack.write(buffer, 0, buffer.length); 
} 

arec.stop(); 
atrack.stop() 

私はスマートフォンのスピーカーへのルートのオーディオができず、中に「SCO」接続を使用する場合:あなたは、私がbabyphone側(Bluetoothモジュール側)からオーディオを取得するために使用したコードの下に見ることができます http://developer.android.com/reference/android/media/AudioManager.html

ベビーフォンのマイクから音声を取り戻すのと同じ時間に、私は自分のプロジェクトの方向を変えるためにできるだけ早くそれを知る必要があります。

可能であれば、スマートフォン側のベビーフォンプログラムは最近のすべてのスマートフォンで実行する必要があります。

英語は第1言語ではないため、一部の文章が正しくない可能性があります。

私はどのソリューションにも対応しています。

+0

運がいいですか?私はPAシステムとしてBluetoothヘッドセットのマイクを使用しようとしています。つまり、再生はジャック(出力)上になければなりません(別のブルートゥースデバイスでは不可能と思われます)。 – Diego

答えて

1

A2DPはメディア再生用であり、片方向です。 SCOはBT経由の音声通話/ VoIP /録音に使用され、双方向ですが低品質です。

あなたがBluetoothScoを有効にしてIN_CALLにモードを設定するか、IN_COMMUNICATIONSTREAM_VOICE_CALLがBT_SCO出力デバイスにルーティングされることがあり、そしてとき(ほとんどのON /私が一緒に働いてきたすべてのデバイスは、少なくとも)の入力デバイスは、意志どうなりますかBT_SCO入力デバイスを意味する出力デバイス(モードのため)に基づいて選択することができます。

私の提案 - すべてのデバイスで動作することを保証できませんが、にはありません。は、IN_COMMUNICATIONにモードを設定しています。 setBluetoothScoOn(true)コールは、BT_SCOへの録音のための「強制使用」設定を内部で設定し、DEFAULTまたはVOICE_RECOGNITION AudioSourceを使用してこれを組み合わせると、録音デバイスとしてBT_SCOマイクが選択されます。
しかし、BT_SCOと内蔵マイクから同時に録音することは、ポータブルな方法では不可能であると考えられます。
RING,ALARMまたはMUSICのストリームタイプを使用することができます。これらのストリームタイプは、音声コールに含まれていないときはBT_SCOではなく内蔵スピーカーにルーティングする必要があります。

+0

@ user2235813おそらく、AudioSource.CAMCORDERは、内蔵マイクを使用する2台目のレコーダーを開くというトリックを行う可能性があります。 – Schlangi

関連する問題