Android Audio System: AudioTrack, AudioRecord의 내부 동작 원리
Android의 오디오 시스템은 다양한 구성 요소로 이루어져 있으며, 그중에서도 AudioTrack과 AudioRecord는 각각 오디오 출력과 입력을 담당하는 핵심 API입니다. 이 글에서는 AudioTrack과 AudioRecord의 내부 동작 원리를 깊이 있게 분석하고, 이를 활용한 오디오 입출력의 흐름을 설명하겠습니다.
1. AudioTrack 개요 및 내부 동작
1.1 AudioTrack의 역할
AudioTrack은 애플리케이션이 PCM(Pulse Code Modulation) 데이터를 오디오 하드웨어로 출력하는 기능을 제공합니다. 즉, 앱이 생성한 오디오 데이터를 직접 하드웨어에 전달하는 역할을 수행합니다. 이를 활용하여 멀티미디어 애플리케이션, 게임 오디오, 음성 처리 시스템 등을 구현할 수 있습니다.
1.2 AudioTrack의 생성 과정
AudioTrack 객체는 일반적으로 다음과 같은 과정을 통해 생성됩니다.
AudioTrack track = new AudioTrack(
AudioManager.STREAM_MUSIC, // 오디오 스트림 타입
sampleRate, // 샘플링 레이트 (Hz)
AudioFormat.CHANNEL_OUT_STEREO, // 채널 설정 (모노/스테레오)
AudioFormat.ENCODING_PCM_16BIT, // 오디오 포맷 (16bit PCM 등)
bufferSize, // 버퍼 크기
AudioTrack.MODE_STREAM // 스트리밍 또는 정적 모드
);
AudioTrack의 생성 과정에서 중요한 요소는 버퍼 크기(Buffer Size) 입니다. 이는 내부에서 오디오 데이터를 보관하는 공간을 설정하는 것이며, 적절한 크기로 설정하지 않으면 지연(Latency)이나 언더런(Underrun) 문제가 발생할 수 있습니다.
1.3 AudioTrack의 동작 흐름
AudioTrack의 동작 과정은 크게 다음과 같이 나눌 수 있습니다.
오디오 데이터 작성
write()
메서드를 통해 오디오 데이터를 전달합니다.write()
를 호출하면 내부 버퍼에 데이터를 저장하며,MODE_STREAM
모드에서는 연속적으로 데이터를 입력해야 합니다.
AudioFlinger와 상호작용
- AudioTrack은 AudioFlinger의
PlaybackThread
와 통신하며, 이를 통해 커널 레벨의 ALSA 드라이버 또는 OpenSL ES를 이용한 오디오 하드웨어에 접근합니다. - AudioTrack에서
write()
가 호출되면, AudioFlinger의ClientProxy
를 통해 데이터를 전달하고, 이를AudioMixer
가 처리합니다.
- AudioTrack은 AudioFlinger의
Mixer 및 하드웨어 출력
- AudioFlinger의
MixerThread
는 여러 AudioTrack에서 받은 PCM 데이터를 혼합한 후, 이를OutputStream
을 통해 하드웨어로 전송합니다. AudioHwDevice
가 하드웨어 드라이버(보통 ALSA)에 전달하여 실제 사운드를 출력합니다.
- AudioFlinger의
1.4 AudioTrack의 주요 내부 구성 요소
- ClientProxy: 애플리케이션과 AudioFlinger 간의 IPC(Inter-Process Communication) 역할을 수행합니다.
- BufferQueue: 오디오 데이터를 저장하는 버퍼로,
write()
를 통해 데이터가 입력됩니다. - MixerThread: 여러 AudioTrack의 출력을 혼합하여 최종적인 PCM 스트림을 생성합니다.
- AudioHwDevice: 하드웨어 드라이버와 직접 통신하여 사운드를 출력합니다.
2. AudioRecord 개요 및 내부 동작
2.1 AudioRecord의 역할
AudioRecord는 오디오 입력을 위한 API로, 마이크로부터 입력된 오디오 데이터를 애플리케이션에서 처리할 수 있도록 합니다. 이를 활용하여 음성 인식, 오디오 녹음, 실시간 오디오 분석 등의 기능을 구현할 수 있습니다.
2.2 AudioRecord의 생성 과정
AudioRecord 객체는 다음과 같은 과정으로 생성됩니다.
AudioRecord record = new AudioRecord(
MediaRecorder.AudioSource.MIC, // 오디오 입력 소스 (마이크)
sampleRate, // 샘플링 레이트
AudioFormat.CHANNEL_IN_MONO, // 입력 채널 설정
AudioFormat.ENCODING_PCM_16BIT, // 오디오 포맷
bufferSize // 버퍼 크기
);
AudioRecord는 MediaRecorder.AudioSource
를 통해 다양한 입력 소스를 사용할 수 있습니다. 예를 들어, MIC
, VOICE_COMMUNICATION
, VOICE_RECOGNITION
등으로 마이크의 특성을 조정할 수 있습니다.
2.3 AudioRecord의 동작 흐름
오디오 데이터 수집
startRecording()
을 호출하면 내부적으로 AudioFlinger의CaptureThread
가 작동을 시작합니다.read()
를 통해 오디오 데이터를 애플리케이션에서 가져올 수 있습니다.
AudioFlinger와의 상호작용
- AudioFlinger의
RecordThread
는 AudioRecord의 요청을 받아 마이크 입력 데이터를 처리합니다. RecordThread
는 HAL을 통해 실제 하드웨어로부터 데이터를 수집하고, 이를 애플리케이션에 제공하는 역할을 수행합니다.
- AudioFlinger의
오디오 버퍼 처리
- AudioRecord의
read()
메서드는 내부BufferQueue
에서 오디오 데이터를 읽어와 애플리케이션에서 사용할 수 있도록 합니다. - 데이터가 충분하지 않으면 블로킹(blocking) 모드에서 대기하거나, 비블로킹(non-blocking) 모드에서는 즉시 반환됩니다.
- AudioRecord의
2.4 AudioRecord의 주요 내부 구성 요소
- ClientProxy: AudioRecord와 AudioFlinger 간의 IPC를 담당합니다.
- BufferQueue: 입력된 오디오 데이터를 저장하는 버퍼입니다.
- RecordThread: 마이크로부터 데이터를 수집하고 처리하는 AudioFlinger의 내부 쓰레드입니다.
- AudioHwDevice: 마이크 입력을 담당하는 하드웨어 인터페이스입니다.
3. AudioTrack과 AudioRecord의 공통점과 차이점
요소 | AudioTrack | AudioRecord |
---|---|---|
역할 | 오디오 출력 | 오디오 입력 |
데이터 흐름 | 앱 → AudioFlinger → 하드웨어 | 하드웨어 → AudioFlinger → 앱 |
주요 스레드 | PlaybackThread | RecordThread |
주요 메서드 | write() , play() , stop() |
read() , startRecording() , stop() |
AudioTrack과 AudioRecord는 각각 반대 방향의 오디오 처리를 수행하며, 내부적으로 AudioFlinger와 상호작용하여 오디오 데이터를 처리합니다.
결론
Android의 오디오 시스템에서 AudioTrack과 AudioRecord는 각각 오디오 재생과 녹음을 담당하는 중요한 API입니다. 내부적으로 AudioFlinger와 협력하여 동작하며, ClientProxy, BufferQueue, MixerThread, RecordThread 등 다양한 구성 요소를 통해 오디오 데이터를 효율적으로 처리합니다. 이러한 구조를 이해하면 Android에서 오디오 애플리케이션을 더욱 효과적으로 개발할 수 있습니다.
'Android > Android Audio' 카테고리의 다른 글
Android AudioFlinger: 오디오 리샘플링 및 효과 적용 (0) | 2025.06.16 |
---|---|
Android Audio System - MixerThread, TrackThread 구조 분석 (0) | 2025.06.15 |
AudioFlinger 개요 및 주요 역할 (0) | 2025.06.13 |
Android Audio System: Audio HAL과 Audio Flinger의 관계 (0) | 2025.06.12 |
Android Audio System에서의 데이터 흐름 (0) | 2025.06.11 |