What is Core Audio?
OSXDEV
Core Audios는 Mac OS X에서 필요한 모든 오디오 기능을 처리하도록 만들어졌습니다. 그러므로 이 Core Audio을 이용해서 오디오를 만들고, 녹음하고, 믹싱하고, 편집하고, 처리하고, 플레이할 수있습니다. 또한 MIDI 데이터도 그렇게 처리할 수있고, 하드웨어나 소프트웨어로 된 MIDI 장비와도 연결할 수있습니다.
Core Audio는 C 언어로 된 인터페이스를 시스템과 아주 긴밀하게 연결해 놓았는데, 결과적으로 일련의 시그널 체인(signal chain)을 통과하는 동안 낮은 지연(latency)를 유지하면서도 상당히 유연한 프로그램 환경을 가질 수있게 되었습니다. 이런 Core Audio의 몇가지 장점을 추려보자면 다음과 같습니다.
- 음향 합성(audio synthesis)와 음향 디지털 신호 처리(DSP)을 위한 Plug-in 인터페이스 제공
- 다양한 오디오 파일과 데이터 포맷에 대한 지원
- 커스텀 파일이나 데이터 포맷을 처리하기 위한 플러그인 인터페이스 지원
- 시그널 체인을 만들기 위한 모듈러한 접근 지원
- Scalable한 다채널 입출력
- 녹음이나 재생 중 쉽게 오디오와 MIDI 데이터의 동기화할 수 있음
- USB, Firewire, 혹은 PCI 같은 다양한 접속 방식에 상관하지 않고 외부 하드웨어 장비에 접속할 수있는 표준화된 인터페이스 제공
목차 |
[편집] Core Audio in Mac OS X
Core Audio 서비스는 Mac OS X에 아주 긴밀하게 통합되어 있습니다. 그들 중 대부분은 Figure 1-1에 보이는 것처럼 Hardware Abstraction Layer(HAL)와 Core MIDI위에 얹혀져 있습니다. 이때 오디오 신호들은 HAL을 통해서 하드웨어로 전달됩니다. 여기서 Core MIDI는 MIDI 데이터와 장비에 대해서 역시 비슷한 인터페이스를 제공해 줍니다.
Figure 1-1 Core Audio architecture
다음의 섹션에서는 Core Audio의 기본 기능에 대해서 알아보겠습니다.
[편집] A Little About Digital Audio and Linear PCM
추측하셨다시피, Core Audio는 오디오 데이터를 디지털 형태로 처리합니다. 대부분의 Core Audio 생성자들은 오디오 데이터를 선형적 pulse-code-modulated (linear PCM) 형식으로 처리하는데, 이 형식은 압축하지 않은 디지털 오디오를 처리하는 가장 보편적인 방법입니다. Pulse code modulation(PCM)은 일정 간격(sampling rate) 동안 오디오 신호의 세기를 측정하고, 각 샘플들을 숫자로 표현하는 것입니다. 예를 들어, 표준 CD 오디오는 44.1kHz의 샢를링 레이트를 사용하며, 신호의 세기로 65,536의 다른 레벨을 표현하기 위해서 16비트를 사용합니다. Core Audio의 데이터 구조들은 선형적 PCM이 어떤 레이트와 비트를 가지고 있다고 해도 다 표현 가능합니다. 심지어 정수나 실수의 샘플 값도 지원합니다.
Core Audio는 오디오 데이터가 native-endian으로 된 32비트의 실수 선형 PCM 포맷으로 되어 있다고 보통 가정합니다. 하지만 다른 선형 PCM으로 된 오디오 데이터를 변환할 수있는 오디오 컨버터를 만들 수 있습니다. 이런 컨버터를 이용하면 선형 PCM과, MP3나 Apple Lossless처럼 압축된 오디오 포맷으로 된 데이터간의 상호 변환이 가능합니다. Core Audio는 기본적으로 거의 모든 디지털 오디오 포맷을 변환하는 것을 지원합니다. 단 MP3로 변환을 시키는 인코더는 제공하지 않습니다.
Core Audio는 또한 오디오 데이터를 저장하기 위한 대부분의 파일 포맷도 지원합니다.
[편집] Audio Units
Audio units은 오디오 데이터를 처리해 주는 플러그인입니다.
Mac OS X 프로그램 내에서, 거의 모든 오디오 데이터의 처리와 조작은 이런 오디오 유닛을 이용해서 할 수있습니다. 하지만 꼭 그렇게 하라라는 것은 아닙니다. 시그널을 나누거나 하드웨어와 연결해주는 것은 개발자들이 쉽게 할 수있도록 유닛으로 제공지만, 다른 것들은 사용자들이 시그널 패스(path)에 삽입할 수있도록 화면에서 시그널 프로세서로 나타납니다. 예를 들어, 소프트웨어로 된 효과 프로세서(effect processor)들은 종종 실제의 그런 장비들, 예를 들자면 distortion box과 같은 모습으로 스크린에 그려지기도 합니다. 어떤 오디오 유닛들은 그 자체에서 프로그래밍을 해서 혹은 MIDI의 입력에 준수하여 시그널을 만들어 내기도 합니다. 오디오 유닛으로 구현한 몇몇 예는 다음과 같습니다.
- high-pass 필터나, flanger, 압축기, distortion box같은 시그널 프로세서 효과 유닛(effect unit)은 오디오 시그널을 처리해 주는데, 흡사 effect box나 외장 시그널 프로세서랑 비슷합니다.
- 악기나 소프트웨어 신서사이저
이런 악기 유닛은, 때때로 뮤직 디바이스 오디오 유닛이라고 부르기도 하는데, MIDI 입력에 따라 소리를 발생합니다. 이런 악기 유닛은 파일이나 외부 MIDI 장비에서 오든 MIDI 데이터를 이해할 수있습니다.
- 신호 소스(signal source)
신호 발생 유닛(generator unit)을 이용하면 오디오 유닛이 신호를 발생할 수있도록 만들 수있습니다. 악기 유닛과는 달리, 이 유닛은 MIDI 입력에 의해 활성화되지 않고, 코드에 의해서 활성화됩니다. 예를들어 발생기는 사인파(sine wave)를 계산해서 만들어 낼 수있습니다. 혹은 파일이나 네트워크에서 오든 데이터를 공급해 줄 수있습니다.
- 하드웨어 입력이나 출력에 대한 인터페이스
이에 대해서 더 자세히 알고 싶으시면 The Hardware Abstraction Layer와 Interfacing with Hardware Devices을 참조하시기 바랍니다.
- 신호 변환기(signal converter)는 오디오 변환기를 이용해서 여러 종류의 선형 PCM 방식으로 된 데이터를 변환 시켜 줍니다. Audio Converters and Codecs를 참조하시기 바랍니다.
- 믹서나 스플리터(splitter)
예를 들어, 믹서 유닛은 트랙을 합치거나, 스테레오 효과를 주거나, 3D panning 효과를 줄 수있습니다. 그리고 스플리터 유닛은 모노 신호를 두 채널로 나눈다음에 comb 필터링을 적용해서 스테레오로 만들 수있습니다.
- 오프라인 효과 유닛
오프라인 효과는 너무 프로세서를 혹사시키거나 혹은 실시간에 적용하기 어려운 것들입니다. 예를 들자면, 파일에 있는 샘플을 반대로 돌리는 것이 있겠습니다. (음악이 거꾸로 재생됩니다.)
오디오 유닛이 모듈러하기 때문에, 필요한 조합대로 적용시킬 수 있습니다. Figure 1-2에선 일련의 오디오 유닛을 적용한 예를 볼 수있습니다. 이 체인(chain)에서는 한 악기 유닛을 이용해서 오디오 신호를 만들어 내고, 그것은 효과 유닛을 통과하면서 bandpass 필터링과 distortion이 적용됩니다.
Figure 1-2 A simple audio unit chain
만약 다른 프로그램에서 사용할 오디오 DSP 코드를 만든다면, 오디오 유닛으로 패키징을 해야만 합니다.
만약 여러분이 오디오 프로그램 개발자라면, 오디오 유닛을 사용하십시오. 그러면 애플이나 기타 개발자들이 만든 기존의 오디오 유닛을 사용해서 여러분의 프로그램의 기능을 손쉽게 확장할 수있습니다.
애플은 통상적으로 수행하는 작업을 처리해주기 위한 오디오 유닛을 다수 제공하고 있습니다. 즉 필터링, 지연, reverberation, 그리고 믹싱이나 입출력 장비를 의미한 유닛을 제공하고 있습니다. 심지어 네트워크를 통해서 전송되는 오디오 데이타를 처리해 줄 수있는 유닛도 제공합니다. System-Supplied Audio Units에 그런 오디오 유닛들의 목록이 나와 있습니다.
이러한 오디오 유닛들을 시험해 보고 싶으면, AU Lab 프로그램을 사용해 보십시오. 이것은 /Developer/Applications/Audio에 있는 Xcode Tools 디렉토리에 있습니다. AU Lab은 여러 오디오 유닛들을 섞어보고 매칭시켜 볼 수 있습니다. 이런 식으로 오디오 소스에서 출력 장비까지 시그널 체인을 만들 수있습니다.
[편집] The Hardware Abstraction Layer
Core Audio는 하드웨어 추상 계층(HAL)을 사용해서 프로그램들이 하드웨어와 일관성있고 예측 가능한 방식으로 소통을 할 수있도록 해줍니다. HAL은 또한 동기화나 지연 정도를 조정해 주기위해 시간 정보를 제공해 주기도 합니다.
여러 경우에 있어서, HAL을 직접 다룰 필요는 없습니다. 애플은 AUHAL이라는 특별한 오디오 유닛을 제공하는데, 그것을 이용하면 오디오 데이터를 다른 오디오 유닛에서 하드웨어 장비로 직접 전달해 줄 수있습니다. 또한 그와 비슷하게, 하드웨어 장비에서 오는 입력을 다른 오디오 유닛으로 전달해 줄수도 있습니다. 이것은 Figure 1-3에 도식화되어 있습니다.
Figure 1-3 Hardware input through the HAL and the AUHAL unit
AUHAL은 또한 오디오 유닛과 하드웨어 간에 오디오 데이터를 변환할때 필요한 채널 매핑이나 어떠한 데이터 변환도 처리해 줍니다.
[편집] MIDI Support
Core MIDI는 MIDI 프로토콜을 지원하는 Core Audio의 한 부분입니다. Core MIDI는 키보드나 기타 같은 MIDI 장비와 여러분의 프로그램이 서로 통신할 수있게 해 줍니다. MIDI 장비로부터 오는 입력은 MIDI 데이터로 저장되거나 악기 유닛을 거쳐서 오디오 신호로 바꿀 수있습니다. 응용프로그램은 또한 출력 정보를 MIDI 장비로 뽑아낼 수있습니다. Core MIDI는 MIDI 장비를 추상적으로 표시해 주며, 지연이 적게 되는 I/O를 제공하면서도 표준적인 MIDI 케이블 커넥션, 즉 MIDI In, MIDI Out, 그리고 MIDI Thru와 같은 것을 모사합니다. 또한 Core Audio를 이용하면 MIDI 데이터를 재생할 때 사용할 수 있는 뮤직 플레이어 프로그래밍 인터페이스도 제공합니다. MIDI에 대해서 더 알아 보시고 싶으시다면 다음의 MIDI 제작자 사이트를 참조하십시오. www.midi.org
[편집] The Audio MIDI Setup Application
Mac OS X에서 오디오를 사용할때, 오디오와 MIDI를 세팅하려면 Audio MIDI Setup 프로그램을 사용하시면 됩니다. 그 프로그램을 이용하면 다음과 같은 것을 할 수있습니다.
- 기본 오디오 입력과 출력 장비를 설정
- 입출력 장비의 속성 세팅. 예를 들어 샘플링 레이트나 비트 수등
- 오디오 채널을 스피커에 매핑. 예를 들어 스테레오나 5.1 서라운드 같은..
- 통합 장비(aggregate device) 생성 ( 이에 대한 설명은 Using Aggregate Devices을 참조하시기 바랍니다.)
- MIDI 네트워크와 장비를 구성
Audio MIDI Setup 프로그램은 Mac OS X v10.2 이후의 버젼에서 /Applications/Utilities에 있습니다.
[편집] A Core Audio Recording Studio
Core Audio가 무엇을 하는지 알아보려면, 비록 그 기능이 단순히 오디오를 녹음하고 재생하는 것 이상의 것을 하지만, 레코딩 스튜디오의 구성과 비교해 보면 이해를 한층 쉽게 할 수있습니다. 하드웨어만을 사용한 간단한 레코딩 스튜디오는 Figure 1-4에 보이는 것처럼, MIDI 키보드 같은 거 외에도 아마도 믹싱 덱에 효과를 전달해 주는 효과 유닛을 가지는 몇몇 장비를 구비하고 있을 것입니다. 믹서는 시그널을 테이프 덱이나 하드 드라이브같은 녹음 장비는 물론이고 스튜디오 모니터에도 전달해 줍니다.
Figure 1-4 A simple recording studio
스튜디오에서 사용하는 많은 하드웨어들은 소프트웨어에 기반한 장비들로 대치될 수있습니다. 특화된 뮤직 스튜디오 프로그램은 오디오를 녹음하고, 합성하고, 편집하고, 믹싱하고, 처리하며, 또한 재생할 수있습니다. 하드웨어와 소프트웨어로 된 MIDI 악기와 연결하여 MIDI 데이터에 대해서도 그렇게 할 수있습니다. Mac OS X에서 프로그램들은 이런 작업을 하기 위해서 Figure 1-5에 보이는 것처럼 Core Audio 서비스를 사용할 수있습니다.
Figure 1-5 A Core Audio "recording studio"
보시다시피, 오디오 유닛의 많은 부분이 시그널 체인을 커버해 주고 있습니다. 다른 Core Audio 인터페이스들은 응용 프로그램 수준에서 지원을 해 주는데, 이를 통해서 다양한 포맷으로 오디오나 MIDI 데이터를 얻을 수있고, 또한 파일이나 다른 출력 장비들로 뽑아낼 수있습니다. Core Audio Programming Interfaces에선 Core Audio의 인터페이스에 대해서 더 자세하게 설명을 합니다.
하지만 Core Audio는 단순하게 컴퓨터에서 레코딩 스튜디오를 모사하지만은 않습니다. Core Audio를 이용해서 시스템 사운드와 같은 간단한 소리를 재생하는거에서 부터 게임 플레이어들을 위해서 대단한 음향효과를 제공하기 위한 압축된 오디오 파일들을 만들 수도 있습니다.
[편집] Development Using the Core Audio SDK
오디오 개발자들을 돕기 위해서, 애플은 소프트웨어 개발 킷(SDK)를 제공합니다. 이 Core Audio SDK는 오디오와 MIDI 서비스는 물론 여러 진단이나 테스트 툴을 제공합니다. 예를 들자면 다음과 같은 것이 들어 있습니다.
- 부착된 하드웨어 장비를 포함해서, 시스템의 전역적인 오디오 상태를 알아내거나 세팅할 수있는 테스트 프로그램 (HALLab)
- 오디오 유닛을 로딩하고 조작할 수있도록 해주는 호스트 프로그램 (AudioUnitHosting.) 실제로 오디오 뉴닛을 테스팅하기 위해선, Audio Units에서 언급된 AU Lab 프로그램을 사용해야만 합니다.
- 오디오 파일을 로딩하고 재생할 수있는 샘플 코드 (PlayFile)와 MIDI 파일을 로딩하고 재생할 수있는 샘플코드 (PlaySequence)
이 문서는 보통 자주 하는 작업을 어떻게 하는지 설명해 주는 Core Audio SDK내의 예제에 대한 링크를 가지고 있습니다.
그 SDK는 오디오 유닛을 만들기 위한 C++ 프레임워크도 가지고 있습니다. 이 프레임워크는 Component Manger의 플러그인 인터페이스에 대해서 자세히 알지 않고도 오디오 유닛을 만들 수있도록 해 줍니다. 또한 이 SDK는 통상적으로 쓰이는 오디오 유닛 타입들에 대한 템플렛도 가지고 있습니다. 대개 여러분의 오디오 유닛을 만들려면, 그저 이렇게 제공되는 메소드를 오버라이딩만 해도 될겁니다. 예제 프로젝트 중 어떤 것을 보시면 이런 템플렛과 프레임워크를 어떻게 쓰는지 배울 수있습니다. 오디오 유닛에 대한 정보는 Audio Unit Programming Guide을 참조하십시오.
Core Audio SDK는 개발환경으로 Xcode를 쓰는 것을 가정하고 있습니다.
최신 버젼의 SDK는 http://developer.apple.com/sdk/ 에서 다운 받으십시오. 설치되는 위치는 /Developer/Examples/CoreAudio입니다.




