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

问题描述:

这是我在*上的第一篇文章。 我尝试在Android智能手机上路由音频过去几天,但我没有找到正确执行此操作的功能。Android - 在智能手机和蓝牙模块之间路由音频的功能

它用于制造蓝牙婴儿手机。

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

我与项目音频端的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() 

如果我不能音频路由到智能手机的扬声器,并使用了“上海合作组织”的连接同时从婴儿手机侧的麦克风取回音频,我需要尽快知道它改变我的项目的方向。

如果可能的话,智能手机侧的婴儿电话程序需要在所有最近使用的智能手机上运行。

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

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

+0

运气好吗?我试图将蓝牙耳机的麦克风用作扩声系统,换句话说,播放应该在插孔(输出)上,(我猜测其他蓝牙设备是不可能的)。这似乎是不可能tho – Diego

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

会发生什么(在大多数/我曾经使用过的所有设备至少)当您启用BluetoothSco和模式设置为IN_CALLIN_COMMUNICATIONSTREAM_VOICE_CALL将被路由到BT_SCO输出设备,输入设备将根据输出设备选择(由于模式),这意味着BT_SCO输入设备。

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

+0

@ user2235813也许AudioSource.CAMCORDER可以做的伎俩来打开使用内部麦克风的第二个录音机。 – Schlangi