2012-08-18 3 views
5

나는 헤드폰을 통해 AudioTrack 스트리밍을 가지고 있습니다. SoundPool을 내장 스피커에만 보내야하며 AudioTrack 헤드폰을 재생하지 않아도됩니다. 해킹 깡패들?헤드폰을 통해 음악을 재생하면서 스피커로 소리내어 읽기

+0

SoundPool은 AudioTrack과 별도로 작동합니까? – Soham

+0

AudioManager mAudioMgr = (AudioManager) getSystemService (Context.AUDIO_SERVICE); mAudioMgr.setSpeakerphoneOn (true); mAudioMgr.setMode (AudioManager.MODE_IN_COMMUNICATION); –

답변

11

많은 안드로이드 장치는 모든 로컬 재생 (이어폰, 스피커, 유선 헤드셋/헤드폰)을 위해 AudioFlinger/audio HAL에서 단일 출력 스레드를 사용하므로 두 트랙의 다른 라우팅을 동시에 불가능하게 만듭니다 (많은 장치에서 미디어 알림이 재생되고 유선 헤드셋이 연결되어 있으면 스트림이 강제로 음소거됩니다. 그렇지 않으면 알림이 재생되는 동안 라우드 스피커에서 음악을들을 수 있기 때문에 스트림이 강제로 음소거됩니다.

일부 장치에

당신이 setForceUse(FOR_MEDIA, FORCE_SPEAKER)을하고 스피커에서 재생하고자하는 물건에 대한 MUSIC 스트림 유형을 사용하도록 관리하는 경우 당신이 찾고있는 무엇을 할 수있을, 그리고에 대한 VOICE_CALL 스트림 유형 유선 헤드셋에서 연주하고 싶은 물건.
응용 프로그램이 setForceUse 호출을 수행 할 수있는 방법이 있는지 확실하지 않습니다. 아마도 AudioService 클래스의 handleMessage 메소드를 리플렉션을 통해 가져 와서 MSG_SET_FORCE_USE 메시지를 보낼 수 있습니다. 나는 그것을 결코 시도하지 않았으므로 비참하게 실패 할 수 있습니다.

편집 :는 지금 유선 헤드셋이 실제 장치에 연결되어있는 동안 스피커에 미디어 스트림을 강제의 setForceUse 방법을 테스트했습니다, 그리고 그것을 통해 작동 할 것이라고 보장 할 수는 있지만 그것은 (작업을 수행 모든 장치). 구현은 위에서 설명한 것과 약간 다릅니다. 내가 사용한 코드는 내 대답 how to turn speaker on/off programatically in android 4.0을 참조하십시오.

+0

STREAM_RING을 사용하면 헤드폰이 연결되어 있어도 사운드가 스피커로 재전송됩니다. 그러나 헤드폰 (AudioTrack)에서 재생되는 사운드는이 STREAM_RING이 완료되고 다시 시작될 때까지 일시 중지됩니다. 내 우선 순위는 중단없이 헤드폰 스트림을 재생하는 것입니다. –

+0

예, STREAM_RING은 SONIFICATION 라우팅 전략을 따르며, 이는 내 대답의 첫 번째 단락에서 설명한 동작을 트리거합니다. 필자는 유선 헤드셋의 스피커 + VOICE_CALL 스트림에 강제로 전송되는 음악 스트림이 XPeria P에서 제대로 작동하지만 다른 장치에서는 테스트하지 않았 음을 확인했습니다. – Michael

+0

Mike, 너무 힘들게 밀어서 미안하지만, S2와 HTC One X에서 테스트를 해봤습니다. 둘 다 헤드폰에서 오디오를 일시 중지하고 있습니다. 내 것은 끊임없는 연속성으로 시스템의 작동 과정을 위반하게 될 신호입니다. –

관련 문제