2012-08-18 194 views
5

我有一个AudioTrack通过耳机播放。我必须发送一个SoundPool到内置扬声器,而不会中断通过耳机播放的AudioTrack。任何黑客流氓黑社会?通过耳机播放音乐时播放扬声器

+0

所以SoundPool与AudioTrack分开吗? – Soham 2012-08-18 09:06:42

+0

AudioManager mAudioMgr =(AudioManager)getSystemService(Context.AUDIO_SERVICE); mAudioMgr.setSpeakerphoneOn(true); mAudioMgr.setMode(AudioManager.MODE_IN_COMMUNICATION); – 2016-03-21 12:55:38

回答

11

许多Android设备在AudioFlinger/audio HAL中为所有本地播放(耳机,扬声器,有线耳机/耳机)使用单个输出线程,使得两个轨道的不同路由不可能同时进行(这就是为什么在许多设备上媒体如果播放通知并且您连接了有线耳机,则会强制静音流,否则在播放通知时您会在扬声器中听到音乐)。

在某些设备上,如果你能做到一个setForceUse(FOR_MEDIA, FORCE_SPEAKER)和使用要在扬声器播放的东西MUSIC流类型有可能做你要找的内容,并为在VOICE_CALL流类型你想要在有线耳机中播放的东西。
我不确定是否有任何方法让应用程序执行该调用。也许你可以通过思考得到AudioService课程的handleMessage方法,并发送给我一个MSG_SET_FORCE_USE的消息..我从来没有尝试过,所以它可能会失败。

编辑:我已经测试了setForceUse强制MEDIA流到扬声器,而有线耳机连接到实际设备上的方式,它确实工作(虽然我不能保证它可以跨越所有设备)。这个实现与我上面描述的稍有不同。查看我对how to turn speaker on/off programatically in android 4.0的回答,了解我使用的代码。

+0

使用STREAM_RING有助于将声音重定向至扬声器,即使耳机已连接。但是,在耳机(AudioTrack)上播放的声音会暂停,直到此STREAM_RING完成并重新开始。我的首要任务是不中断播放耳机流。 – 2012-08-20 13:32:37

+0

是的,STREAM_RING遵循SONIFICATION路由策略,这会触发我在我的答案的第一段中描述的行为。我已经验证过,在有线耳机中强制使用扬声器+ VOICE_CALL流的MUSIC流在XPeria P上正常工作,但我没有在任何其他设备上进行测试。 – Michael 2012-08-20 14:06:07

+0

Mike,我很抱歉把你推得太紧,但是,我一直在S2和HTC One X上进行测试。他们都在暂停耳机上的音频。矿井是一个突破连续性的信号将违反系统的工作过程。 – 2012-08-22 11:37:09

相关问题