안드로이드 오디오 시스템 구성 요소

Posted in 개인/ㄴAndroid by


1. 어플리케이션 프레임워크 계층 : 자바 어플리케이션들이 오디오 시스템을 사용하기 위한 자바 API들이 존재하는 곳

구성요소

설  명 

 AudioTrack(Java)

오디오 출력을 담당하는 자바 클래스이다. AudioTrack(Java)은 파일이나 네트워크로부터 PCM데이터를 추출한 후, 네이티브 계층의 AudioTrack(C++)으로 PCM데이터를 전달하여 소리를 출력한다. 

 AudioRecord(Java)

오디오 입력 장치로부터 PCM데이터를 받아오기 위한 자바 클래스이다. AudioRecord(Java)는 네이티브 계층의 AudioRecord(C++)를 통해 PCM 데이터를 획득한 후 압축 파일로 저장하거나 네트워크를 통해서 소리를 다른 곳으로 전달할 수 있다. 

 AudioManager(Java)

오디오 시스템에서 볼륨을 조정하거나 오디오 출력 장치를 결정하는 등의 오디오 시스템 제어를 위한 자바 클래스이다. 


2. JNI 계층 : 어플리케이션 프레임워크 계층의 자바 클래스들이 C++ 클래스를 사용하기 위한 인터페이스를 정의한 곳

구성요소

설  명 

android_media_AudioTrack

네이티브 계층의 AudioTrack(C++) 클래스를 사용하기 위한 JNI정의

android_media_AudioRecord

네이티브 계층의 AudioRecord(C++) 클래스를 사용하기 위한 JNI정의

android_media_AudioSystem

네이티브 계층의 AudioSystem(C++) 클래스를 사용하기 위한 JNI정의


3. 네이티브 계층 : 오디오 시스템의 핵심 동작을 수행하는 계층 / 크게 오디오 출력, 오디오 입력, 오디오 제어 동작을 수행


3-1. 네이티브 프록시 : 어플리케이션이 시스템 서비스에 접근하기 위한 방법을 정의

구성요소

설  명 

AudioTrack(C++)

오디오 출력을 담당하는 서비스 클라이언트의 클래스이다. AudioTrack(C++)는  IAudioTrack 서비스 프록시를 통해 AudioFlinger 서비스에게 오디오 출력을 요청한다.

 AudioRecord(C++)

오디오 입력을 담당하는 서비스 클라이언트의 클래스이다. AudioFlinger 서비스는 하드웨어로부터  PCM데이터를 받아 RecordTrack을 통해 애플리케이션으로 전달한다. AudioRecord(C++)는 IAudioRecord 서비스 프록시를 통해 AudioFlinger 서비스에게 오디오 입력을 요청한다.

 AudioSystem(C++)

오디오 제어 요청을 담당하는 서비스 클라이언트의 클래스이다. 오디오 라우팅, 오디오 볼륨 조정 등 제어에 관한 동작을 AudioPolicyService에게 요청한다.


3-2. 서비스 프록시 : 오디오 시스템의 네이티브 프록시가 시스템 서비스를 사용하기 위한 인터페이스

구성요소

설  명 

 IAudioFlinger

서비스 클라이언트가 서비스 서버의 AudioFlinger 클래스에 접근하기 위해 사용한다.

IAudioTrack

트랙 핸들 리모트 서비스를 사용하기 위한 서비스 프록시이다. 서비스 서버의 TrackHandle클래스에 접근하기 위해 사용한다.

IAudioRecord

레코드 트랙 핸들 리모트 서비스를 사용하기 위한 서비스 프록시이다. 서비스 서버의 RecordHandle 클래스에 접근하기 위해 사용한다.

IAudioPolicyService

서비스 서버의 AudioPolicyService 클래스에 접근하기 위해 사용한다.


3-3. 시스템 서비스 : 서비스 서버에서 오디오 시스템의 동작을 실제로 수행하는 서비스들

구성요소

설  명 

AudioFlinger

오디오 시스템의 중추적 역활을 하는 시스템 서비스이다. 크게 오디오 출력, 입력 역활을 가지고 왔으며, 오디오 HAL을 통해 오디오 하드웨어에 접근이 가능하다.

AudioPolicyService

네이티브 프록시로부터 오디오 시스템의 제어 요청(볼륨 조정, 라우팅, 포커싱 등)을 받아서 처리하는 서비스이다. 제조사 고유의 오디오 시스템 정책을 추가할 수도 있다. 그리고 실제 정책을 하드웨어 혹은 현재의 동작에 적용하도록 AudioFlinger 서비스에게 요청한다.


3-4. 트랙 핸들 리모트 서비스 : 서비스 클라이언트가 서비스 프록시를 통해 접근하는 서비스

구성요소

설  명 

TrackHandle

트랙에 접근하기 위한 트랙 핸들이다. AudioTrack(C++)은 TrackHandle 클래스를 통해 Track 클래스의 함수를 접근한다.

Track

AudioTrack(C++)이 서비스 서버로 전달한 PCM데이터를 관리하는 역활을 한다. AudioTrack(C++) 클래스를 통해 생성 가능하다.

AudioMixer

트랙들이 가진 PCM 데이터에 대한 리샘플링 작업과 믹싱작업을 한다.

MixerThread

믹서 쓰레드는 트랙들의 PCM 데이터를 얻어온 후, 오디오 믹서에게 전달한다. 또한 오디오 믹서에 의해 믹싱된 PCM 데이터를 오디오 HAL에게 전달하여 소리로 출력한다.


3-5. 레코드 핸들 리모트 서비스 : 서비스 클라이언트가 서비스 프록시를 통해 접근하는 서비스

구성요소

설  명 

RecordHandle

AudioRecord(C++)에서 트랙에 접근하기 위한 트랙 핸들이다. AudioRecord(C++)는 RecordHandle 클래스를 통해 RecordTrack 클래스의 함수에 접근한다.

RecordTrack

오디오 하드웨어가 전달한 PCM 데이터를 AudioRecord(C++)로 전달하는 역활을 한다. 서비스 서버에서 오디오 입력을 담당하는 클래스이다. AudioRecord(C++) 클래스를 통해 생성 가능하며, 단 하나의 레코드 트랙만 존재한다.

AudioResampler

오디오 입력시 PCM 데이터에 대한 리샘플링을 수행한다.

RecordThread

RecordThread는 오디오 HAL에서 PCM 데이터를 얻어 온 후 AudioResampler에게 전달한다. 오디오 입력 리셈플러에서 리샘플된 PCM 데이터는 서비스 클라이언트로 전달된다.


4. 오디오 HAL 계층 : 제조사마다 다른 오디오 하드웨어를 안드로이드 플랫폼이 동일한 인터페이스를 통해 사용할 수 있도록 해줌


5. 리눅스 커널 및 하드웨어 계층 : 오디오 입출력을 위한 오디오 하드웨어 및 이를 구동하기 위한 디바이스 드라이버가 존재하는 계층



참조 : 안드로이드 미디어 프레임워크 - 4장 안드로이드 오디오 시스템