Android - 用于在智能手机和蓝牙模块之间路由音频的功能

时间:2013-04-02 15:04:16

标签: android audio routing bluetooth

这是我在Stackoverflow上的第一篇文章。 我尝试在过去几天在Android智能手机上路由音频,但我找不到正确的功能。

用于制作蓝牙Babyphone。

我需要在智能手机和蓝牙模块之间进行路由。蓝牙模块最初用于制作手机,汽车免提,无线扬声器......

我与项目音频端的A2DP和HFP(免提)配置文件进行通信。

我可以在设备之间建立“sco”连接(与音频蓝牙交换机连接使用),并从蓝牙模块获取音频。但是当连接“sco”正常工作时,我就不能再使用智能手机上的扬声器和麦克风了。

我希望找到一种解决方案,在我的智能手机上使用音频,同时在蓝牙模块上使用音频。

我在http://developer.android.com/index.html上搜索了一个路由音频的功能。

AudioManager类有一些函数来路由音频,如setRouting或setParameters,但我还有任何结果。 http://developer.android.com/reference/android/media/AudioManager.html

您可以在下面看到我用来从babyphone端(蓝牙模块侧)获取音频的代码:

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端的麦克风上取回音频,我需要尽快知道它以改变我的项目方向。

如果可能,智能手机端的babyphone程序需要在所有最近的智能手机上运行。

英语不是我的第一语言,所以有些句子可能不正确。

我愿意接受任何解决方案。

1 个答案:

答案 0 :(得分:1)

A2DP用于媒体播放,是单向的。 SCO用于通过BT进行语音呼叫/ VoIP /录音,并且是双向的,但质量较低。

当您启用BluetoothSco并将模式设置为IN_CALLIN_COMMUNICATION时,将会发生什么(在我与之合作过的大多数/所有设备上)STREAM_VOICE_CALL将被路由到BT_SCO输出设备,输入设备将根据输出设备选择(因为模式),这意味着BT_SCO输入设备。

我的建议 - 虽然我无法保证它可以在每台设备上运行 - 但将模式设置为IN_COMMUNICATIONsetBluetoothScoOn(true)调用将在内部设置“强制使用”设置以记录到BT_SCO,并将其与使用DEFAULTVOICE_RECOGNITION AudioSource相结合,应选择BT_SCO麦克风作为录制设备。<登记/> 但是,同时从BT_SCO和内置麦克风录音可能无法以便携方式进行 对于输出,您可以使用RINGALARMMUSIC流类型,这些流类型应该在不通过语音呼叫时路由到内部扬声器而不是BT_SCO。