1. Intro
- AllJoyn은 퀄콤에서 개발된 IoT를 위한 SW 플랫폼이다.
- 플랫폼이라고 안드로이드 처럼 거대한 것은 아니며, Network 연동을 필요로하는 SW 개발 시 connection, socket open, broad cast 등의 low level 함수를 호출에 대한 전반적인 내용들을 SDK로 포함시켜 C, C++, Java(Android), Obj-C 등에서 API로 사용가능하게 했다.
- OpenSource 이며, 바이너리 SDK도 제공하고 있다.
- 여기서는 Audio Service를 다루도록 하겠다.
2. About AllJoyn Audio Service
- AllJoyn에서 Audio를 제외한 서비스 SDK(Onboarding, Control Panel, Notification 등)은 별개의 SDK로 제공하고 있으나 Audio Service는 따로 바이너리로 제공하고 있지 않다.
- WAV 포맷만 지원하고 있고, 요구 사항에 따라 다양한 개발이 필요로 해서 일까..
- 그래서 나는 MP3 디코딩를 추가했으며, MetaData Source, Image Source 도 구현해야 했다.
- Audio Service를 위해서는 두개의 앱이 필요하다. Sender(Player) 와 Receiver(Sink) 이다.
- 기본적으로 1(Sender):N(Receiver) 구현이 가능하다. 삼성에서 광고했던 여러 폰에서 동시에 플레이되는 그런것..
3. Make Sender(Player)
- 기본적으로 제공하는 포맷은 WAV이며, 각 Receiver 마다 하나의 Sender 쓰레드에서 파일을 직접 읽어서 보내주는 방식이다.
- 하지만 MP3는 그냥 보내서 플레이 할 수 없다. WAV로 디코딩을 해야한다.
- 그래서 재생 할 MP3 파일을 디코딩 -> 파일로 저장해서, 이 저장된 파일을 보내도록 했다.
- Nexus5 로 MP3 파일(3:30)초 짜리를 디코딩 할 경우 4~5초 정도 걸린다.
- MetaData 는 Android 에서 쉽게 가져올 수 있으므로 이를 JNI 로 내려보낸 후 쓰레드에서 보내도록 했다.
- Image(앨범아트) 또한 Android 에서 쉽게 가져올 수 있다. 안드로이드에서 저장 -> Player에서 보내도록 했다.
- 동기화는 기존의 알고리즘을 사용하되, 디코딩 완료를 위한 Pool을 구현해야해서, 약간 수정이 있었다.
4. Make Receiver(Sink)
- 기존의 코드를 최대한 유지하는 방향으로 잡았다. (다른 AllJoyn Audio Player와의 호환성을 위해서..는 개뿔;;;)
- Sender와 달리 MetaData, Image Sink를 위한 Object는 소스가 제공되었다.
- 이를 받아서 Android App으로 전달하는 부분을 구현했고,
- 재생 중일 때에는 다른 접속을 막도록 수정했다. (default는 항상 다른 접속을 허용토록 되어있다. 이럴 경우 기존 접속을 끈긴다.)
5. Build
- Audio Service 코드 빌드를 위해서는 AllJoyn core 소스가 있는 기본 소스가 필요하다.
# git clone https://git.allseenalliance.org/gerrit/core/alljoyn
- Audio Service 코드도 필요하겠지.
# cd alljoyn/services
# git clone https://git.allseenalliance.org/gerrit/multimedia/audio
- 빌드 시 Scons를 사용한다. (각자 환경에 맞게 할것)
# scons OS=android CPU=arm BINDINGS=core,cpp SERVICES=about,audio BUILD_SERVICES_SAMPLES=off WS=off ANDROID_NDK=/Android/android-ndk-r9d ANDROID_SRC=/JELLYBEAN_SDK VARIANT=debug
6. Ending
- 여기서는 간략하게 정리한 내용을 다뤘으며, 구체적인 구현 내용은 추후 다시 남길 예정이다.
Build Controlpanel Service application for Android (0) | 2014.10.23 |
---|