2015-01-04 5 views
8

기본적으로, 지금 당장은 안드로이드 장치를 A2DP 수신기로 사용하고 페어링이 설정되면 안드로이드가 송신기에서 수신 한 사운드를 재생합니다. STP 프로필을 사용하면 스트리밍이 지연 될 수 있습니다. 그래서 A2DP를 사용하고 싶지만 안드로이드 장치를 A2DP의 수신자로 사용할 수 있습니까? 어떻게해야합니까?안드로이드 장치를 A2DP 프로파일 수신 장치로 사용합니다.

+1

[Android에서 블루투스를 통해 오디오 받기] (http://stackoverflow.com/questions/15557933/receive-audio-via-bluetooth-in-android) – virtualxtc

답변

9

Android L이므로 BlueDriod 스택은 A2DP 싱크를 지원하지만 기본적으로 사용되지 않습니다.

은 다음과 같이 사용하려면 다음 /external/bluetooth/bluedroid/include/bt_target.h에서

/* Enable bluetooth av sink. */ 
#define BTA_AV_SINK_INCLUDED TRUE 

합니다. 이렇게하면 Bluetooth 스택에서 싱크 지원이 활성화됩니다. /packages/apps/Bluetooth/res/values/config.xml에서

<!-- Enable sink support. --> 
<bool name="profile_supported_a2dp_sink">true</bool> 

:

또한이 변화를해야한다. 이것은 특정 UI를 가능하게합니다.

이제 기기를 페어링하고 스트리밍을 시작할 수 있습니다. 불행히도 패킷을 받겠지만 소리는 들리지 않습니다. 그 이유는 A2DP 싱크를위한 오디오 경로가 없다는 것입니다. 이 패치의 커밋 메시지에서 https://android-review.googlesource.com/#/c/98161/을 수정하는 방법에 대한 샘플 구현을 찾을 수 있습니다.

+2

Android 6에서이 기능을 사용할 수 있는지 알고 있나요? – rob

+0

당신이 게시 한 @nilo 패치는 android android-4.4_r1'을위한 것이며 안드로이드의'base' 클래스 (패치와의 비교)는 다릅니다. 예 :'platform/external/bluetooth/bluedroid/audio_a2dp_hw/audio_a2dp_hw.c' 파일에 이미'struct a2dp_stream_in * input; '이 있습니다. [audio_a2dp_hw.c 라인 87] (https://android.googlesource.com/platform/external /bluetooth/bluedroid/+/android-5.0.0_r1/audio_a2dp_hw/audio_a2dp_hw.c) – tchelidze

+0

싱크 기능이 스택의 상위 레이어에서 구현되는지는 알지 못하지만 ESP32 IC의 esp-idf에도 유효합니다. –

2

예. 것이 가능하다. 나는 JB에서 해냈다. Android는 내부적으로 Bluetooth 용 Broadcomm의 "Bluedroid"스택을 사용합니다. 이전에이 스택은 A2DP 싱크 역할 (당신이 수신기로 언급 한)을 지원하지 않았습니다. Lollipop 릴리스에서 A2DP Sink 역할 프로필이 Bluedroid에 추가되었습니다. 하지만 프레임 워크/상위 레이어 (응용 프로그램)에서 사용할 수 없습니다. 활성화하거나 사용하려면 프레임 워크를 변경해야합니다. 다음 파일 및 Android 소스 코드의 관련 파일을 참조하여 활성화 할 수 있습니다.

audio.h - put a new audio source 
audio_policy.conf - put a new input source for a2dp 'inputs' 
AudioManager.java 
AudioPolicyManagerBase.cpp 
AudioService.java 
AudioSystem.java 
BluetoothA2dp.java 
MediaRecorder.java 
A2DPStateMachine.java 

등을 구현하고 구현하십시오 (이 파일 목록은 포괄적이지는 않지만 관련 분야에 경험이있는 경우 알아낼 수 있습니다). 스트림 연결이 설정되면 a2dp 상태 시스템에서 콜백을 받게되며 거기에서 '새'오디오 소스에서 디코딩 된 PCM 바이트를 읽고 스레드를 시작하여 미디어 플레이어로 보내야합니다. SBC 코덱 대 PCM 디코딩은 'bluedroid'sbc 디코더 계층에서 수행됩니다.

빌드하고 휴대 전화로 플래시하고 음악을 즐기십시오.

EDIT : 또한 블루 레이드 스택의 A2DP SDP 레코드를 변경하여 A2DP 싱크 역할을 알릴 수 있습니다.

+0

가능한 작은 복제본을 작성할 수 있습니까? . 나는 "관련 분야에서의 경험"을 가지고 있지 않지만 컴파일하고 응용 프로그램을 작성할 수 있습니다. 나는 의견과 심지어 pm에 감사 할 것이다. –

1

당신은-하지 않을 수 있습니다 B : 여기

이러한 변화의 목록입니다 전자는 두 대의 전화기 사이에서 수동으로 처리 할 수 ​​있기 때문에 하나의 장치를 스트리밍하기 위해서는 A2DP 싱크 및 기타 다른 A2DP 소스가 필요합니다. 전화기는 일반적으로 소스 장치 (싱크 장치로 스트리밍 할 수있는 스트림의 원본)이며 싱크는 헤드셋 또는 Bluetooth 스피커입니다 .