Core Audio Overview

Core Audio Overview

Introduction

Important: This document is no longer being updated. For the latest information about Apple SDKs, visit the documentation website.

Core Audio는 iOS 및 OS X 용으로 만든 응용 프로그램에서 오디오 기능을 구현하기위한 소프트웨어 인터페이스를 제공합니다.이 기능은 각 플랫폼에서 오디오의 모든 측면을 처리합니다. iOS에서 Core Audio 기능에는 녹음, 재생, 음향 효과, 위치 지정, 형식 변환 및 파일 스트림 구문 분석과 다음이 포함됩니다.

  • 응용 프로그램에서 사용할 수있는 내장 이퀄라이저 및 믹서
  • 오디오 입력 및 출력 하드웨어에 대한 자동 액세스
  • 전화를 걸 수있는 장치의 컨텍스트에서 응용 프로그램의 오디오 측면을 관리 할 수있게 해주는 API
  • 오디오 품질에 영향을 미치지 않으면 서 배터리 수명 연장을위한 최적화

Mac에서 Core Audio는 녹음, 편집, 재생, 압축 및 압축 해제, MIDI, 신호 처리, 파일 스트림 구문 분석 및 오디오 합성을 포함합니다. 이 도구를 사용하여 기존 제품에서 작동하는 독립 실행 형 응용 프로그램이나 모듈 식 효과 및 코덱 플러그 인을 작성할 수 있습니다.

Core Audio는 C 및 Objective-C 프로그래밍 인터페이스와 긴밀한 시스템 통합을 결합하여 신호 체인을 통해 낮은 대기 시간을 유지하는 유연한 프로그래밍 환경을 제공합니다.

Note: Core Audio는 오디오 디지털 권한 관리 (DRM)를 직접 지원하지 않습니다. 오디오 파일에 대한 DRM 지원이 필요한 경우 직접 구현해야합니다.

Core Audio 개요는 오디오 소프트웨어 제작에 관심이있는 모든 개발자를위한 것입니다. 이 문서를 읽기 전에 일반 오디오, 디지털 오디오 및 MIDI 용어에 대한 기본 지식이 있어야합니다. 또한 객체 지향 프로그래밍 개념과 Apple의 개발 환경 인 Xcode에 대해 어느 정도 익숙해 져야합니다. iOS 기반 기기 용으로 개발하는 경우 Start Developing iOS Apps Today (Retired).에서 소개 한 Cocoa Touch 개발에 익숙해야합니다.

Organization of This Document

이 문서는 다음 장으로 구성되어 있습니다.

  • What Is Core Audio? Core Audio의 기능과 그 용도에 대해 설명합니다.
  • Core Audio Essentials는 Core Audio의 아키텍처를 설명하고 프로그래밍 패턴과 숙어를 소개하며 응용 프로그램에서이를 사용하는 방법의 기본 사항을 보여줍니다.
  • Common Tasks in OS X은 Core Audio를 사용하여 OS X에서 여러 가지 오디오 작업을 수행하는 방법을 설명합니다.

이 문서에는 네 개의 부록도 들어 있습니다.

See Also

For more detailed information about audio and Core Audio, see the following resources:

What Is Core Audio?

Core Audio는 iOS 및 OS X의 디지털 오디오 인프라로서 응용 프로그램의 오디오 요구 사항을 처리하도록 설계된 일련의 소프트웨어 프레임 워크를 포함합니다. 이 장을 읽고 Core Audio로 수행 할 수있는 작업을 배우십시오.

Core Audio in iOS and OS X

Core Audio는 iOS 및 OS X에 긴밀하게 통합되어 고성능 및 낮은 지연 시간을 제공합니다.

OS X에서, 대부분의 Core Audio 서비스는 그림 1-1에서 볼 수 있듯이 HAL (Hardware Abstraction Layer) 위에 계층화되어 있습니다. 오디오 신호는 하드웨어를 통해 HAL을 통과합니다. 실시간 오디오가 필요한 경우 Core Audio 프레임 워크에서 오디오 하드웨어 서비스를 사용하여 HAL에 액세스 할 수 있습니다. Core MIDI (Musical Instrument Digital Interface) 프레임 워크는 MIDI 데이터 및 장치 작업을위한 유사한 인터페이스를 제공합니다.

Mac OS X Core Audio architecture

Figure 1-1  OS X Core Audio architecture

Audio Toolbox 및 Audio Unit 프레임 워크에서 Core Audio 응용 프로그램 수준 서비스를 찾을 수 있습니다.

  • Audio Queue Services를 사용하여 오디오를 녹음, 재생, 일시 중지, 반복 및 동기화하십시오.
  • 오디오 파일, 변환기 및 코덱 서비스를 사용하여 디스크에서 읽고 쓸 수 있으며 오디오 데이터 형식 변환을 수행 할 수 있습니다. OS X에서는 사용자 정의 코덱을 만들 수도 있습니다.
  • 오디오 유닛 서비스 및 오디오 처리 그래프 서비스 (그림에서 “오디오 장치”로 표시)를 사용하여 응용 프로그램에서 오디오 장치 (오디오 플러그 인)를 호스팅 할 수 있습니다. OS X에서는 응용 프로그램에서 사용하거나 다른 응용 프로그램에서 사용할 수 있도록 사용자 지정 오디오 장치를 만들 수도 있습니다.
  • 음악 시퀀싱 서비스를 사용하여 MIDI 기반 컨트롤 및 음악 데이터를 재생합니다.
  • 오디오 및 MIDI 동기화 및 시간 형식 관리를 위해 Core Audio Clock Services를 사용하십시오.
  • 시스템 소리 서비스 (그림에서 “시스템 소리”로 표시)를 사용하여 시스템 소리와 사용자 인터페이스 음향 효과를 재생합니다.

iOS의 Core Audio는 배터리 기반 모바일 플랫폼에서 사용할 수있는 컴퓨팅 리소스에 최적화되어 있습니다. 운영 체제에서 매우 긴밀하게 관리해야하는 서비스, 특히 HAL 및 I / O Kit에 대한 API는 없습니다. 그러나 OS X에없는 iOS의 추가 서비스가 있습니다. 예를 들어 오디오 세션 서비스를 사용하면 휴대 전화 및 iPod 기능을하는 장치의 컨텍스트에서 응용 프로그램의 오디오 동작을 관리 할 수 있습니다. 그림 1-2는 iOS의 오디오 아키텍처에 대한 높은 수준의 정보를 제공합니다.

iOS Core Audio Architecture

Figure 1-2  iOS Core Audio architecture

A Little About Digital Audio and Linear PCM

대부분의 Core Audio 서비스는 가장 일반적인 비 압축 디지털 오디오 데이터 형식 인 선형 펄스 코드 변조 (선형 PCM) 형식으로 오디오를 사용하고 조작합니다. 디지털 오디오 녹음은 일정한 간격 (샘플링 속도)으로 아날로그 (실제) 오디오 신호의 크기를 측정하고 각 샘플을 숫자 값으로 변환하여 PCM 데이터를 만듭니다. 표준 CD (컴팩트 디스크) 오디오는 44.1 kHz의 샘플링 속도를 사용하며 해상도 또는 비트 심도를 구성하는 각 샘플을 설명하는 16 비트 정수가 사용됩니다.

  • 샘플은 단일 채널에 대한 단일 숫자 값입니다.
  • 프레임은 시간 일치 샘플의 모음입니다. 예를 들어, 스테레오 사운드 파일에는 프레임 당 두 개의 샘플이 있는데 하나는 왼쪽 채널 용이고 다른 하나는 오른쪽 채널 용입니다.
  • 패킷은 하나 이상의 인접한 프레임의 모음입니다. 선형 PCM 오디오에서 패킷은 항상 단일 프레임입니다. 압축 형식에서는 일반적으로 더 많이 사용됩니다. 패킷은 주어진 오디오 데이터 형식에 대해 프레임의 가장 작은 의미있는 집합을 정의합니다.

선형 PCM 오디오에서 샘플 값은 해당 신호가 나타내는 원래 신호의 진폭에 따라 선형 적으로 변합니다. 예를 들어, 표준 CD 오디오의 16 비트 정수 샘플은 무음과 최대 레벨 사이에서 65,536 개의 가능한 값을 허용합니다. 하나의 디지털 값에서 다음 디지털 값까지의 진폭 차이는 항상 동일합니다.

CoreAudioTypes.h 헤더 파일에 선언 된 Core Audio 데이터 구조는 모든 샘플 속도 및 비트 심도에서 선형 PCM을 설명 할 수 있습니다. 이 주제에 대한 자세한 내용은  Audio Data Formats을 참조하십시오.

OS X에서 Core Audio는 오디오 데이터가 네이티브 엔디안의 32 비트 부동 소수점 선형 PCM 형식이어야합니다. 오디오 변환기 서비스를 사용하여 서로 다른 선형 PCM 변형간에 오디오 데이터를 변환 할 수 있습니다. 또한 이러한 변환기를 사용하여 선형 PCM과 MP3 및 Apple Lossless와 같은 압축 오디오 형식간에 변환 할 수 있습니다. OS X의 Core Audio는 가장 일반적인 디지털 오디오 포맷을 변환하는 코덱을 제공합니다 (MP3로 변환하기위한 인코더는 제공하지 않음).

iOS는 정수 및 고정 소수점 오디오 데이터를 사용합니다. 그 결과 오디오 처리시 계산이 빨라지고 배터리 소모가 줄어 듭니다. iOS는 변환기 오디오 장치를 제공하며 오디오 변환기 서비스의 인터페이스를 포함합니다. iOS 및 OS X 용 소위 표준 오디오 데이터 형식에 대한 자세한 내용은 Canonical Audio Data Formats을 참조하십시오.
 iOS 및 OS X에서 Core Audio는 iPhone Audio File FormatsSupported Audio File and Data Formats in OS X. 설명 된대로 오디오 데이터 저장 및 재생을위한 가장 일반적인 파일 형식을 지원합니다.

Audio Units

Audio units 는 오디오 데이터를 처리하는 소프트웨어 플러그 인입니다. OS X에서는 단일 audio unit를 무제한의 채널 및 응용 프로그램에서 동시에 사용할 수 있습니다.

iOS는 모바일 플랫폼에서 효율성과 성능을 위해 최적화 된 audio units세트를 제공합니다. iOS 응용 프로그램에서 사용할 audio units를 개발할 수 있습니다. 맞춤 audio unit 코드를 정적으로 애플리케이션에 연결해야하기 때문에 개발 한 audio units는 iOS의 다른 애플리케이션에서 사용할 수 없습니다.

iOS에서 제공되는 audio units에는 사용자 인터페이스가 없습니다. 주요 용도는 애플리케이션에 지연 시간이 짧은 오디오를 제공하는 것입니다. iPhone 오디오 유닛에 대한 자세한 내용은  Core Audio Plug-ins: Audio Units and Codecs을 참조하십시오.

개발 한 Mac 응용 프로그램에서 시스템 제공 또는 타사 제공 오디오 장치를 사용할 수 있습니다. 오디오 유닛을 자체 제품으로 개발할 수도 있습니다. 사용자는 GarageBand 및 Logic Studio와 같은 응용 프로그램뿐만 아니라 다른 많은 오디오 장치 호스팅 응용 프로그램에서 오디오 장치를 사용할 수 있습니다.

일부 Mac 오디오 장치는 백그라운드에서 신호를 분리하거나 하드웨어와 인터페이스하는 등 일반적인 작업을 단순화합니다. 다른 것들은 자신의 사용자 인터페이스와 함께 화면에 나타나 신호 처리 및 조작을 제공합니다. 예를 들어, 이펙트 장치는 기타리스트의 왜곡 상자와 같은 실제 요소를 모방 할 수 있습니다. 다른 오디오 장치는 프로그램 방식으로 또는 MIDI 입력에 대한 응답으로 신호를 생성합니다.

audio units의 몇 가지 예는 다음과 같습니다.:

  • 신호 프로세서 (예 : 하이 패스 필터, 리버브, 컴프레서 또는 왜곡 유닛). 이들 각각은 일반적으로 효과 유닛이며 하드웨어 효과 상자 또는 외부 신호 프로세서와 비슷한 방식으로 디지털 신호 처리 (DSP)를 수행합니다.
  • 악기 또는 소프트웨어 신디사이저. 이것들은 악기 (instrument) 단위 (때로는 음악 장치)라고 불리며 일반적으로 MIDI 입력에 따라 음표를 생성합니다.
  • 신호 원. 악기 유닛과 달리 generator unit은 MIDI 입력에 의해 활성화되지 않고 코드를 통해 활성화됩니다. 예를 들어, generator unit가 사인파를 계산하고 생성하거나 파일 또는 네트워크 스트림에서 데이터를 소스로 보낼 수 있습니다.
  • 하드웨어 입력 또는 출력에 대한 인터페이스. I / O 장치에 대한 자세한 내용은 The Hardware Abstraction Layer  및 Interfacing with Hardware.을 참조하십시오.
  • 형식 변환기. 변환 장치는 두 개의 선형 PCM 변형간에 데이터를 변환하거나 오디오 스트림을 병합하거나 분할하거나 시간 및 피치 변경을 수행 할 수 있습니다. 자세한 내용은  Core Audio Plug-ins: Audio Units and Codecs 을 참조하십시오.
  • 믹서 또는 패너. 믹서 유닛은 오디오 트랙을 결합 할 수 있습니다. 패너 장치는 스테레오 또는 3D 패닝 효과를 적용 할 수 있습니다.
  • 오프라인으로 작동하는 효과 유닛. 오프라인 효과 장치는 너무 많은 프로세서를 사용하거나 실시간으로 단순히 불가능한 작업을 수행합니다. 예를 들어, 파일에서 시간 역전을 수행하는 효과는 오프라인으로 적용되어야합니다.

OS X에서는 귀 하나 귀하의 최종 사용자가 필요로하는 순열대로 오디오 유닛을 믹스 앤 매치 할 수 있습니다. 그림 1-3은 간단한 오디오 장치 체인을 보여줍니다. 아웃 보드 MIDI 키보드에서 수신 한 컨트롤 데이터를 기반으로 오디오 신호를 생성하는 악기 유닛이 있습니다. 그런 다음 생성 된 오디오는 효과 유닛을 통과하여 대역 통과 필터링 및 왜곡을 적용합니다. audio units의 체인을 audio processing graph라고합니다.

Three audio units, connected in series

Figure 1-3  A simple audio processing graph

여러 응용 프로그램에서 사용할 수 있도록하려는 오디오 DSP 코드를 개발하는 경우 코드를 audio units로 패키지해야합니다.

Mac 오디오 응용 프로그램을 개발하는 경우 audio units를 지원하면 사용자와 사용자가 기존 audio units 라이브러리 (타사 및 Apple 제공 업체 모두)를 활용하여 응용 프로그램의 기능을 확장 할 수 있습니다.

OS X에서 오디오 장치를 실험하려면 /Developer/Applications/Audio 설치에서 사용할 수있는 AU Lab 응용 프로그램을 참조하십시오. AU Lab을 사용하면 오디오 장치를 결합하여 오디오 장치에서 출력 장치를 통해 신호 체인을 구축 할 수 있습니다.

OS X v10.5 및 iOS 2.0과 함께 제공되는 오디오 장치 목록은 System-Supplied Audio Units in OS X를 참조하십시오.

The Hardware Abstraction Layer

Core Audio는 하드웨어 추상화 계층 (HAL)을 사용하여 응용 프로그램이 하드웨어와 상호 작용할 수 있도록 일관되고 예측 가능한 인터페이스를 제공합니다. 또한 HAL은 응용 프로그램에 타이밍 정보를 제공하여 동기화를 단순화하거나 대기 시간을 조정할 수 있습니다.

대부분의 경우 코드는 HAL과 직접 상호 작용하지 않습니다. Apple은 OS X의 AUHAL 장치 및 iOS의 AURemoteIO 장치라는 특수 audio unit를 제공하여 다른 audio unit의 오디오를 하드웨어로 전달할 수 있습니다. 마찬가지로, 하드웨어에서 들어오는 입력은 AUHAL 유닛 (또는 iOS의 AURemoteIO 유닛)을 통해 라우팅되고 Figure 1-4와 같이 후속 audio units에서 사용할 수 있습니다.

A microphone whose signal reaches the computer through the AUHAL unit

Figure 1-4  Hardware input through the HAL and the AUHAL unit

AUHAL 장치 (또는 AURemoteIO 장치)는 또한 audio units와 하드웨어 간의 오디오 데이터를 변환하는 데 필요한 데이터 변환 또는 채널 매핑을 처리합니다.

MIDI Support in OS X

Core MIDI는 MIDI 프로토콜을 지원하는 Core Audio의 일부입니다. (MIDI는 iOS에서 사용할 수 없습니다.) Core MIDI는 응용 프로그램이 키보드 및 기타와 같은 MIDI 장치와 통신 할 수있게합니다. MIDI 장치의 입력은 MIDI 데이터로 저장하거나 악기 기기를 제어하는 데 사용할 수 있습니다. 응용 프로그램은 MIDI 데이터를 MIDI 장치로 보낼 수도 있습니다.

Core MIDI는 낮은 대기 시간의 입출력을 제공하면서 추상화를 사용하여 MIDI 장치를 나타내고 표준 MIDI 케이블 연결 (MIDI In, MIDI Out 및 MIDI Thru)을 모방합니다. Core Audio는 MIDI 기반 컨트롤이나 음악 데이터를 재생할 때 사용할 수있는 음악 플레이어 프로그래밍 인터페이스도 지원합니다.

MIDI 프로토콜의 기능에 대한 자세한 내용은 MIDI Manufacturers Association 사이트 ( http://midi.org)를 참조하십시오.

The Audio MIDI Setup Application

Audio MIDI Setup 응용 프로그램을 사용하면 다음을 수행 할 수 있습니다.

  • 기본 오디오 입력 및 출력 장치를 지정하십시오.
  • 샘플링 속도 및 비트 심도와 같은 입력 및 출력 장치의 속성을 구성합니다.
  • 오디오 채널을 사용 가능한 스피커에 매핑합니다 (스테레오, 5.1 서라운드 등).
  • 집계 장치를 만듭니다. (집계 장치에 대한 자세한 내용은 Using Aggregate Devices 을 참조하십시오.)
  • MIDI 네트워크 및 MIDI 장치를 구성하십시오.

/Applications/Utilities 폴더에서 Audio MIDI Setup을 찾습니다.

A Mac Core Audio Recording Studio

전통적인 컴퓨터가 아닌 레코딩 스튜디오는 Core Audio에 접근하기위한 개념적 프레임 워크로 사용될 수 있습니다. 이러한 스튜디오에는 그림 1-5와 같이 믹싱 데스크에 공급되는 몇 가지 “실제”악기 및 효과 장치가있을 수 있습니다. 믹서는 출력을 스튜디오 모니터와 녹음 장치로 라우팅 할 수 있습니다 (테이프 레 코더처럼 다소 복고적으로 표시됨).

Connections in a traditional, non-computer based recording studio, centered on a mixing desk.

Figure 1-5  A simple non-computer-based recording studio

기존 스튜디오의 많은 부분을 소프트웨어 기반의 대체물로 대체 할 수 있습니다.이 모든 내용은이 장에서 이미 다뤘습니다. 데스크톱 컴퓨팅 플랫폼에서 디지털 오디오 응용 프로그램은 오디오를 녹음, 합성, 편집, 믹싱, 처리 및 재생할 수 있습니다. 또한 MIDI 데이터를 녹음, 편집, 처리 및 재생할 수 있으며 하드웨어 및 소프트웨어 MIDI 악기와 인터페이스 할 수 있습니다. Mac 응용 프로그램은 Core Audio 서비스를 사용하여 그림 1-6과 같이 이러한 모든 작업을 처리합니다.

Connections in a a software-based recording studio, centered on a mixer audio unit.

Figure 1-6  A Core Audio “recording studio”

보시다시피 audio units는 오디오 신호 체인을 구성 할 수 있습니다. 다른 Core Audio 인터페이스는 응용 프로그램 수준의 지원을 제공하므로 응용 프로그램에서 다양한 형식의 오디오 또는 MIDI 데이터를 가져 와서 파일이나 출력 장치로 출력 할 수 있습니다. Core Audio Services는 Core Audio의 구성 인터페이스를보다 자세히 설명합니다.

Core Audio를 사용하면 데스크탑 컴퓨터에서 녹음 스튜디오를 모방하는 것보다 훨씬 많은 작업을 수행 할 수 있습니다. 사운드 효과 재생에서부터 압축 오디오 파일 생성, 게임 플레이어에게 몰입 형 음향 경험 제공에 이르기까지 모든 작업에 사용할 수 있습니다.

iPhone 또는 iPod touch와 같은 모바일 장치에서 오디오 환경과 컴퓨팅 리소스는 배터리 수명을 연장하도록 최적화되어 있습니다. 결국 iPhone의 가장 핵심적인 정체성은 전화입니다. 개발이나 사용자 관점에서 볼 때 iPhone을 가상 녹음 스튜디오의 중심에 배치하는 것은 의미가 없습니다. 반면에 극도의 이식성, 내장 된 Bonjour 네트워킹, 멀티 터치 인터페이스 및 가속도계 및 위치 API를 포함한 iPhone의 특수 기능을 사용하면 데스크톱에서는 불가능했던 오디오 응용 프로그램을 상상하고 만들 수 있습니다.

Mac Development Using the Core Audio SDK

오디오 개발자를 돕기 위해 Apple은 OS X의 Core Audio 용 SDK (소프트웨어 개발 키트)를 제공합니다. SDK에는 오디오 및 MIDI 서비스는 물론 진단 도구 및 테스트 응용 프로그램을 포함하는 많은 코드 샘플이 포함되어 있습니다. 예 :

  • 연결된 하드웨어 장치 (HALLab)를 포함하여 시스템의 전역 오디오 상태와 상호 작용하는 테스트 응용 프로그램입니다.
  • 참조 오디오 유닛 호스팅 애플리케이션 (AU Lab). AU Lab 응용 프로그램은  Audio Units에서 설명한대로 사용자가 만든 오디오 유닛를 테스트하는 데 필수적입니다.
  • 오디오 파일 (PlayFile) 및 MIDI 파일 (PlaySequence)을로드하고 재생하기위한 샘플 코드.

이 문서에서는 일반적인 작업을 수행하는 방법을 보여주는 Core Audio SDK의 추가 예제를 보여줍니다.

SDK에는 OS X 용 오디오 장치를 제작하기위한 C 프레임 워크가 포함되어 있습니다.이 프레임 워크는 Component Manager 플러그인 인터페이스의 세부 사항으로부터 당신을 격리시킴으로써 수행해야하는 작업을 단순화합니다. SDK에는 일반적인 오디오 장치 유형에 대한 템플릿도 포함되어 있습니다. 대부분의 경우 사용자 지정 오디오 장치에 적용되는 메서드 만 재정의하면됩니다. 일부 샘플 오디오 프로젝트에서는 이러한 템플릿과 프레임 워크를 사용하고 있습니다. 프레임 워크 및 템플릿 사용에 대한 자세한 내용은 Audio Unit Programming Guide를 참조하십시오.

Note: Apple은 C ++ 오디오 유닛 프레임 워크를 오디오 유닛 개발을 지원하는 샘플 코드로 제공합니다. 필요에 따라 프레임 워크를 수정하고 적용하십시오.

Core Audio SDK는 Xcode를 개발 환경으로 사용한다고 가정합니다.

http://developer.apple.com/sdk/에서 최신 SDK를 다운로드 할 수 있습니다. 설치 후 SDK 파일은 / Developer / Examples / CoreAudio에 있습니다. HALLab 및 AU Lab 응용 프로그램은 / Developer / Applications / Audio에 있습니다.

Core Audio Essentials

Apple은 Core Audio에 대한 소프트웨어 인터페이스를 계층 적, 협업적, 작업 중심의 방식으로 설계했습니다. 이 장의 처음 두 절을 읽고이 인터페이스에 대한 간략한 소개와 인터페이스가 어떻게 작동 하는지를 확인하십시오. Core Audio에 퍼져있는 디자인 원리, 사용 패턴 및 프로그래밍 관용구를 이해하려면 계속 읽으십시오. 이 장의 뒷부분에서는 Core Audio가 파일, 스트림, 녹음 및 재생 및 플러그인과 함께 작동하는 방법을 소개합니다.

API Architectural Layers

Core Audio의 프로그래밍 인터페이스는 그림 2-1과 같이 세 개의 레이어로 배열됩니다.

The three layers of Core Audio

Figure 2-1  The three API layers of Core Audio

최하위 계층에는 다음이 포함됩니다.

  • 드라이버와 상호 작용하는 I / O 키트
  • 오디오 하드웨어 추상화 계층 (오디오 HAL)은 하드웨어에 장치 독립적이며 드라이버 독립적 인 인터페이스를 제공합니다.
  • Core MIDI는 MIDI 스트림 및 장치 작업을위한 소프트웨어 추상화를 제공합니다.
  • 컴퓨터의 시계에 대한 액세스를 제공하는 호스트 시간 서비스

가능한 한 높은 실시간 성능이 요구되는 경우 Mac 응용 프로그램에서 이러한 기술을 직접 사용할 수 있습니다. 그러나 많은 오디오 응용 프로그램은이 계층에 액세스하지 않습니다. 실제로 iOS의 Core Audio는 더 높은 수준의 인터페이스를 사용하여 실시간 오디오를 구현할 수있는 방법을 제공합니다. 예를 들어, OpenAL은 게임에서 실시간 오디오를 위해 직접 I / O를 사용합니다. 그 결과는 모바일 플랫폼에 적합한 상당히 작고 조정 된 API 세트입니다.

Core Audio의 중간 계층에는 데이터 형식 변환, 디스크 읽기 및 쓰기, 스트림 구문 분석 및 플러그 인 작업이 포함됩니다.

  • 오디오 변환기 서비스를 사용하면 응용 프로그램에서 오디오 데이터 형식 변환기를 사용할 수 있습니다.
  • 오디오 파일 서비스는 디스크 기반 파일에서 오디오 데이터 읽기 및 쓰기를 지원합니다.
  • 오디오 유닛 서비스 및 오디오 처리 그래프 서비스를 사용하면 응용 프로그램에서 이퀄라이저 및 믹서와 같은 DSP (Digital Signal Processing) 플러그인을 사용할 수 있습니다.
  • 오디오 파일 스트림 서비스를 사용하면 네트워크 연결을 통해 스트리밍 된 파일을 재생하는 등 스트림을 구문 분석 할 수있는 응용 프로그램을 작성할 수 있습니다.
  • Core Audio Clock Services는 오디오 및 MIDI 동기화는 물론 시간 기반 변환을 지원합니다.
  • Audio Format Services (작은 API, 그림에 표시되지 않음)는 응용 프로그램에서 오디오 데이터 형식을 관리하는 데 도움을줍니다.

iOS의 Core Audio는 그림 1-2에서 볼 수 있듯이 대부분의 서비스를 지원합니다.

Core Audio의 최상위 계층은 하위 계층의 기능을 결합하는 streamlined 인터페이스를 포함합니다.

  • Audio Queue Services를 사용하면 오디오를 녹음, 재생, 일시 중지, 반복 및 동기화 할 수 있습니다. 압축 된 오디오 형식을 처리하는 데 필요한 코덱을 사용합니다.
  • AVAudioPlayer 클래스는 오디오 재생 및 반복 및 되감기 및 빨리 감기 구현을위한 간단한 Objective-C 인터페이스를 제공합니다.
  • 확장 오디오 파일 서비스는 오디오 파일 서비스 및 오디오 변환기 서비스의 기능을 결합합니다. 압축되지 않은 압축 사운드 파일을 읽고 쓸 수있는 통일 된 인터페이스를 제공합니다.
  • OpenAL은 위치 오디오 용 오픈 소스 OpenAL 표준의 Core Audio 구현입니다. 시스템에서 제공하는 3D 믹서 오디오 유닛 위에 제작되었습니다. 모든 응용 프로그램은 게임 개발에 가장 적합하지만 OpenAL을 사용할 수 있습니다.

Frameworks

/System/Library/Frameworks/에있는 API 프레임 워크를 고려하여 Core Audio에 대한 다른 견해를 얻을 수 있습니다. 이 섹션에서는 코어 오디오 레이어를 구성하는 부분을 찾을 수있는 위치를 알려주기 위해 해당 항목을 빠르게 나열합니다.

Core Audio 프레임 워크는 여기 다른 프레임 워크의 우산이 아니라 오히려 하나의 피어입니다.

  • Audio Toolbox 프레임 워크 (AudioToolbox.framework)는 Core Audio의 중급 및 고급 서비스 용 인터페이스를 제공합니다. iOS에서이 프레임 워크는 휴대 전화 및 iPod 기능을하는 장치의 컨텍스트에서 응용 프로그램의 오디오 동작을 관리하기위한 인터페이스 인 오디오 세션 서비스를 포함합니다.
  • Audio Unit 프레임 워크 (AudioUnit.framework)를 사용하면 오디오 장치 및 코덱을 비롯한 오디오 플러그 인과 함께 응용 프로그램을 사용할 수 있습니다.
  • AVFoundation 프레임 워크 (AVFoundation.framework)는 오디오 재생을위한 간소화되고 간단한 Objective-C 인터페이스 인 AVAudioPlayer 클래스를 제공합니다. 또한보다 정교한 오디오 처리를위한 AVAudioEngine 클래스를 제공합니다.
  • Core Audio 프레임 워크 (CoreAudio.framework) 는 Core Audio에서 사용되는 데이터 유형과 하위 레벨 서비스 용 인터페이스를 제공합니다.
  • Core Audio Kit 프레임 워크  (CoreAudioKit.framework) 는 오디오 장치 용 사용자 인터페이스를 만들기위한 작은 API를 제공합니다. 이 프레임 워크는 iOS에서 사용할 수 없습니다.
  • Core MIDI 프레임 워크(CoreMIDI.framework)를 사용하면 응용 프로그램에서 MIDI 데이터를 처리하고 MIDI 네트워크를 구성 할 수 있습니다. 이 프레임 워크는 iOS에서 사용할 수 없습니다.
  • Core MIDI Server 프레임 워크 (CoreMIDIServer.framework)를 사용하면 MIDI 드라이버가 OS X MIDI 서버와 통신 할 수 있습니다. 이 프레임 워크는 iOS에서 사용할 수 없습니다.
  • OpenAL 프레임 워크 (OpenAL.framework)는 오픈 소스의 위치 오디오 기술인 OpenAL에서 작동 할 수있는 인터페이스를 제공합니다.

부록 Core Audio Frameworks는 이러한 모든 프레임 워크와 함께 포함 된 각 헤더 파일을 설명합니다.

Proxy Objects

Core Audio는 파일, 스트림, 오디오 플레이어 등과 같은 것을 표현하기 위해 프록시 객체의 개념을 사용합니다. 예를 들어, 응용 프로그램이 디스크상의 오디오 파일로 작업하기를 원한다면, 첫 번째 단계는 AudioFileID 유형의 오디오 파일 객체를 인스턴스화하는 것입니다. 이 객체는 AudioFile.h 헤더 파일에서 은폐 데이터 구조로 선언됩니다.

typedef struct OpaqueAudioFileID *AudioFileID;

AudioFileCreateWithURL 함수를 호출하여 오디오 파일 객체를 인스턴스화하고 해당 객체에 연결된 실제 오디오 파일을 만듭니다. 이 함수는 새로운 오디오 파일 객체에 대한 참조를 제공합니다. 이 시점부터 프록시 객체와 통신하여 실제 오디오 파일을 작업합니다.

이러한 유형의 패턴은 오디오 파일, iPhone 오디오 세션 ( Audio Sessions: Cooperating with Core Audio) 또는 하드웨어 장치로 작업하는 경우에도 Core Audio 전체에서 일관됩니다.)

Properties, Scopes, and Elements

대부분의 Core Audio 인터페이스는 객체 상태를 관리하거나 객체 동작을 수정하기 위해 속성 메커니즘을 사용합니다. 속성은 키 – 값 쌍입니다.

  • 프로퍼티 키는 일반적으로, kAudioFilePropertyFileFormat 또는 kAudioQueueDeviceProperty_NumberChannels와 같은 니모닉 이름을 가지는 열거자 정수입니다.
  • 프로퍼티 값은 프로퍼티의 목적에 적합한 특정 데이터 타입 (void *, Float64, AudioChannelLayout 구조체 등)입니다.

Apple에서 정의한 많은 속성이 있습니다. 다양한 Core Audio 프레임 워크 헤더 파일에서 정의를 찾을 수 있습니다. Audio Unit Services와 같은 일부 Core Audio 인터페이스를 사용하면 자신의 속성도 정의 할 수 있습니다.

Core Audio 인터페이스는 객체에서 속성 값을 검색하고 쓰기 가능한 속성의 경우 해당 값을 변경하기 위해 접근자 함수를 사용합니다. 또한 속성에 대한 정보를 얻기위한 세 번째 접근 자 함수를 찾을 수 있습니다. 예를 들어 Audio Unit Services 기능 AudioUnitGetPropertyInfo는 주어진 속성 값 데이터 유형의 크기와 변경 여부를 알려줍니다. 오디오 대기열 서비스 기능 AudioQueueGetPropertySize는 지정된 속성 값의 크기를 가져옵니다.

Core Audio 인터페이스는 응용 프로그램에 속성이 변경되었음을 알리는 메커니즘을 제공합니다. 다음 섹션 인 콜백 함수 :Callback Functions: Interacting with Core Audio에서 이 내용을 읽을 수 있습니다.

경우에 따라 오디오 객체 전체에 속성이 적용됩니다. 예를 들어, 재생 오디오 큐 개체에서 오디오 레벨 미터링을 사용하려면 kAudioQueueProperty_EnableLevelMetering 속성 값을 true로 설정합니다.

다른 Core Audio 객체에는 내부 구조가 있으며, 각 부분에는 고유 한 속성 집합이있을 수 있습니다. 예를 들어, 오디오 장치에는 입력 범위, 출력 범위 및 전역 범위가 있습니다. 오디오 장치의 입력 또는 출력 범위는 하나 이상의 요소로 구성되며 각 요소는 오디오 하드웨어의 채널 버스와 유사합니다. kAudioUnitProperty_AudioChannelLayout 속성을 사용하여 AudioUnitGetProperty 함수를 호출하면 정보를 원하는 오디오 단위뿐만 아니라 범위 (입력 또는 출력) 및 요소 (0, 1, 2 등)도 지정합니다.

Callback Functions: Interacting with Core Audio

많은 Core Audio 인터페이스는 콜백 기능을 사용하여 애플리케이션과 통신 할 수 있습니다. Core Audio는 다음과 같은 작업에 콜백을 사용합니다.

  • 응용 프로그램에 새로운 오디오 데이터 세트를 제공하면 (예 : 녹음의 경우 콜백은 새 데이터를 디스크에 씁니다).
  • 응용 프로그램에서 새로운 오디오 데이터 세트를 요청 (예 : 재생, 콜백은 디스크에서 읽고 데이터 제공).
  • 소프트웨어 객체가 상태를 변경했다는 것을 응용 프로그램에 알리면 (콜백이 적절한 조치를 취함)

콜백을 이해하는 한 가지 방법은 누구에게 누가 전화하는지에 대한 관점을 바꾸는 것입니다. AudioQueueNewOutput과 같은 일반적인 함수 호출에서 응용 프로그램은 운영 체제 구현시 Apple에서 정의한 비헤이비어를 호출합니다. 당신은 알지 못합니다. 그리고 알 필요가 없습니다. 응용 프로그램에서 재생 오디오 대기열 객체를 요청하고이를 다시 가져옵니다. 이 함수는 호출 할 때 함수의 헤더 파일에 지정된 함수 인터페이스를 따르기 때문에 작동합니다.

콜백의 경우, 운영 체제가 선택하면 응용 프로그램에서 구현 한 비헤이비어를 호출합니다. 템플릿에 따라 응용 프로그램에서 콜백을 정의하면 운영 체제에서 성공적으로 호출 할 수 있습니다. 예를 들어 오디오 대기열 서비스는 구현할 수있는 콜백 용 템플릿을 지정하여 오디오 대기열 객체 속성이 변경 될 때 메시지를 가져와 반응 할 수 있도록합니다. AudioQueue.h 헤더 파일에 선언되어있는이 콜백 템플릿은 Listing 2-1과 같다.

Listing 2-1  A template for a callback function

typedef void    (*AudioQueuePropertyListenerProc) (
                   void *                  inUserData,
                   AudioQueueRef           inAQ,
                   AudioQueuePropertyID    inID
               );

응용 프로그램에서 콜백을 구현하고 사용하려면 다음 두 가지 작업을 수행해야합니다.

  1. 콜백 함수를 구현하십시오. 예를 들어, 오디오 큐 객체가 실행 중인지 또는 중지되었는지에 따라 오디오 큐 등록 정보 수신기 콜백을 구현하여 사용자 인터페이스의 제목 및 활성화 / 비활성화 상태를 업데이트 할 수 있습니다.
  2. 상호 작용하려는 객체에 콜백 함수를 등록하십시오. 콜백을 등록하는 한 가지 방법은 일반적으로 오디오 데이터를 보내거나받는 콜백에 사용되는 개체 생성 과정입니다. 개체를 만드는 함수 호출에서 함수 매개 변수로 콜백에 대한 참조를 전달합니다. 속성 리스너에 일반적으로 사용되는 다른 방법은이 단원의 뒷부분에서 볼 수 있듯이 전용 함수 호출을 사용하는 것입니다.

코드 2-2는 재생 오디오 큐 객체의 속성 변경에 응답하기 위해 속성 수신기 콜백 함수를 구현할 수있는 한 가지 방법을 보여줍니다.

Listing 2-2  A property listener callback implementation

static void propertyListenerCallback (
   void                    *inUserData,
   AudioQueueRef           queueObject,
   AudioQueuePropertyID    propertyID
) {
   AudioPlayer *player = (AudioPlayer *) inUserData;
       // gets a reference to the playback object
   [player.notificationDelegate updateUserInterfaceOnAudioQueueStateChange: player];
       // your notificationDelegate class implements the UI update method
}

Objective-C 클래스 정의에서는이 콜백 정의를 클래스 구현 외부에 배치하므로이 함수의 본문에는 재생 객체에 대한 참조를 가져 오는 구문이 있습니다 (이 예제에서는 inUserData 매개 변수 이 참조는 콜백을 등록 할 때 콜백에서 사용할 수 있도록 다음에 설명합니다.

Listing 2-3처럼이 콜백을 등록 할 수있다.

Listing 2-3  Registering a property listener callback

AudioQueueAddPropertyListener (
   self.queueObject,                // the object that will invoke your callback
   kAudioQueueProperty_IsRunning,   // the ID of the property you want to listen for
   propertyListenerCallback,        // a reference to your callback function
   self
);

Audio Data Formats

Core Audio는 오디오 데이터 형식에 대한 자세한 지식을 필요로하지 않도록합니다. 이렇게하면 코드에서 특정 형식을 쉽게 처리 할 수있을뿐 아니라 한 세트의 코드가 운영 체제에서 지원하는 모든 형식으로 작동 할 수 있습니다.

Note:오디오 데이터 형식은 샘플 속도, 비트 심도 및 패킷 화와 같은 오디오 데이터 자체를 설명합니다. 오디오 파일 형식은 사운드 파일의 오디오 데이터, 오디오 메타 데이터 및 파일 시스템 메타 데이터가 디스크에 정렬되는 방법을 설명합니다. 일부 오디오 파일 형식에는 한 종류의 오디오 데이터 형식 만 포함될 수 있습니다 (예 : MP3 파일에는 MP3 오디오 데이터 만 포함될 수 있음). Apple의 CAF 형식과 같은 다른 파일 형식에는 다양한 오디오 데이터 형식이 포함될 수 있습니다.

Universal Data Types in Core Audio

Core Audio에서는 두 가지 범용 데이터 유형을 사용하여 오디오 데이터 형식을 나타냅니다. 이러한 유형은 CoreAudioTypes.h 헤더 파일에 선언되고  Core Audio Data Types Reference에 설명 된 데이터 구조 AudioStreamBasicDescription (목록 2-4) 및 AudioStreamPacketDescription (목록 2-5)입니다.

Listing 2-4  The AudioStreamBasicDescription data type

struct AudioStreamBasicDescription {
   Float64 mSampleRate;
   UInt32  mFormatID;
   UInt32  mFormatFlags;
   UInt32  mBytesPerPacket;
   UInt32  mFramesPerPacket;
   UInt32  mBytesPerFrame;
   UInt32  mChannelsPerFrame;
   UInt32  mBitsPerChannel;
   UInt32  mReserved;
};
typedef struct AudioStreamBasicDescription  AudioStreamBasicDescription;

이 구조에서 mReserved 멤버는 항상 0 값을 가져야합니다. 다른 멤버도 0 값을 가질 수 있습니다. 예를 들어, 압축 오디오 포맷은 샘플 당 다양한 비트 수를 사용합니다. 이러한 형식의 경우 mBitsPerChannel 멤버의 값은 0입니다.

About the name: 이 데이터 유형은 이름에 “스트림”이 있지만 코어 오디오에서 오디오 데이터 형식을 나타낼 필요가있는 모든 인스턴스에서 사용합니다 (비 스트리밍 표준 파일 포함). “오디오 형식 기본 설명”데이터 형식이라고 생각할 수 있습니다. 이름의 “스트림”은 하드웨어 또는 소프트웨어에서 오디오 데이터를 이동 (즉, 스트리밍)해야 할 때마다 오디오 형식이 재생된다는 사실을 나타냅니다.

Core Audio와 관련된 토론에서는이 문서에서도 “ASBD”로 축약 된 “audio stream basic description”을 자주 듣게됩니다.

오디오 스트림 패킷 설명 유형은 Audio Data Packets에 설명 된대로 특정 압축 오디오 데이터 형식에 적용됩니다.

Listing 2-5  The AudioStreamPacketDescription data type

struct  AudioStreamPacketDescription {
   SInt64  mStartOffset;
   UInt32  mVariableFramesInPacket;
   UInt32  mDataByteSize;
};
typedef struct AudioStreamPacketDescription AudioStreamPacketDescription;

일정한 비트율 오디오 데이터 ( Audio Data Packets)의 경우이 구조체에있는 mVariableFramesInPacket 멤버의 값은 0입니다.)

Obtaining a Sound File’s Data Format

코드에서 손으로 ASBD의 멤버를 채울 수 있습니다. 그렇게하면 구조체 구성원 중 일부 (또는 일부)에 대한 올바른 값을 알 수 없습니다. 이 값을 0으로 설정 한 다음 Core Audio 인터페이스를 사용하여 구조를 완성하십시오.

예를 들어, 오디오 파일 서비스를 사용하면 목록 2-6과 같이 디스크의 사운드 파일에 대한 완전한 오디오 스트림 기본 설명을 제공 할 수 있습니다.

Listing 2-6  Obtaining an audio stream basic description for playing a sound file

- (void) openPlaybackFile: (CFURLRef) soundFile {
   AudioFileOpenURL (
       (CFURLRef) self.audioFileURL,
       0x01,                  // read only
       kAudioFileCAFType,
       &audioFileID
   );
   UInt32 sizeOfPlaybackFormatASBDStruct = sizeof ([self audioFormat]);
   AudioFileGetProperty (
       [self audioFileID],
       kAudioFilePropertyDataFormat,
       &sizeOfPlaybackFormatASBDStruct,
       &audioFormat          // the sound file's ASBD is returned here
   );
}

Canonical Audio Data Formats

플랫폼에 따라 Core Audio는 이러한 형식이 다음과 같을 수 있다는 점에서 하나 또는 두 개의 “표준”오디오 데이터 형식을 가지고 있습니다.

  • 전환에서 중간 형식으로 필요합니다
  • Core Audio의 서비스가 최적화되는 형식
  • ASBD를 달리 지정하지 않은 경우 기본 또는 가정 된 형식

Core Audio의 정식 형식은 다음과 같습니다.

  • 16 비트 정수 샘플을 사용하는 iOS 입출력 선형 PCM
  • iOS 오디오 유닛 및 기타 오디오 프로세싱 8.24 비트 고정 소수점 샘플을 사용하는 비 인터리브 선형 PCM
  • Mac 입력 및 출력 32 비트 부동 소수 샘플을 사용하는 선형 PCM
  • Mac 오디오 장치 및 기타 오디오 프로세싱 32 비트 부동 소수점 샘플을 사용하는 비 인터리브 선형 PCM

다음은 44.1 kHz 샘플 속도의 표준 iPhone 오디오 유닛 샘플 형식 인 2 채널을 보여주는 완전한 오디오 스트림 기본 설명 예제입니다.

struct AudioStreamBasicDescription {
   mSampleRate       = 44100.0;
   mFormatID         = kAudioFormatLinearPCM;
   mFormatFlags      = kAudioFormatFlagsAudioUnitCanonical;
   mBitsPerChannel   = 8 * sizeof (AudioUnitSampleType);                    // 32 bits
   mChannelsPerFrame = 2;
   mBytesPerFrame    = mChannelsPerFrame * sizeof (AudioUnitSampleType);    // 8 bytes
   mFramesPerPacket  = 1;
   mBytesPerPacket   = mFramesPerPacket * mBytesPerFrame;     // 8 bytes
   mReserved         = 0;
};

여기에 값으로 사용되는 상수 및 데이터 유형은 CoreAudioTypes.h 헤더 파일에 선언되어 있으며 Core Audio Data Types Reference에 설명되어 있습니다. 여기서 AudioUnitSampleType 데이터 유형 (및 오디오 입출력을 처리 할 때 AudioSampleType 데이터 유형)을 사용하면 ASBD가 플랫폼에 영향을받지 않습니다.

코어 오디오의 오디오 데이터 포맷 소개 : 마술 쿠키와 패킷.

Magic Cookies

Core Audio의 영역에서, 매직 쿠키는 압축 된 사운드 파일 또는 스트림에 첨부 된 불투명 한 메타 데이터 집합입니다. 메타 데이터는 파일 또는 스트림의 압축을 적절하게 복원하는 데 필요한 세부 정보를 디코더에 제공합니다. 마법의 쿠키를 블랙 박스로 취급하고 Core Audio 함수를 사용하여 포함 된 메타 데이터를 복사, 읽기 및 사용합니다.

예를 들어, 목록 2-7은 사운드 파일에서 마법 쿠키를 가져 와서 재생 오디오 대기열 객체에 제공하는 메소드를 보여줍니다.

Listing 2-7  Using a magic cookie when playing a sound file

- (void) copyMagicCookieToQueue: (AudioQueueRef) queue fromFile: (AudioFileID) file {
   UInt32 propertySize = sizeof (UInt32);
   OSStatus result = AudioFileGetPropertyInfo (
                           file,
                           kAudioFilePropertyMagicCookieData,
                           &propertySize,
                           NULL
                       );
if (!result && propertySize) {
       char *cookie = (char *) malloc (propertySize);
       AudioFileGetProperty (
           file,
           kAudioFilePropertyMagicCookieData,
           &propertySize,
           cookie
       );
AudioQueueSetProperty (
           queue,
           kAudioQueueProperty_MagicCookie,
           cookie,
           propertySize
       );
       free (cookie);
   }
}

Audio Data Packets

이전 장에서는 패킷을 하나 이상의 프레임 모음으로 정의했습니다. 이것은 주어진 오디오 데이터 형식에 대한 가장 작은 의미있는 프레임 세트입니다. 이러한 이유로 오디오 파일에서 시간 단위를 나타낼 때 오디오 데이터의 가장 좋은 단위입니다. Core Audio의 동기화는 패킷을 계산하여 작동합니다. 패킷을 사용하여 유용한 오디오 데이터 버퍼 크기를 계산할 수 있습니다 (코드 2-8 참조).

모든 오디오 데이터 형식은 패킷의 구성 방식에 따라 부분적으로 정의됩니다. 오디오 스트림 기본 설명 데이터 구조는 목록 2-4와 같이 mBytesPerPacket 및 mFramesPerPacket 멤버의 형식 패킷에 대한 기본 정보를 설명합니다. 추가 정보가 필요한 형식의 경우, 잠시 설명한대로 오디오 스트림 패킷 설명 데이터 구조를 사용합니다.

오디오 데이터 형식에는 다음 세 가지 종류의 패킷이 사용됩니다

  • 선형 PCM 및 IMA / ADPCM과 같은 CBR (고정 비트 전송률) 형식에서 모든 패킷은 동일한 크기입니다.
  • AAC, Apple Lossless 및 MP3와 같은 VBR (가변 비트 전송률) 형식에서는 모든 패킷의 프레임 수가 동일하지만 각 샘플 값의 비트 수가 다를 수 있습니다.
  • VFR (가변 프레임 속도) 형식에서 패킷의 프레임 수는 다양합니다. 이 유형에는 일반적으로 사용되는 형식이 없습니다.

Core Audio에서 VBR 또는 VFR 형식을 사용하려면 오디오 스트림 패킷 설명 구조 (목록 2-5)를 사용합니다. 이러한 각 구조는 사운드 파일의 단일 패킷을 설명합니다. VBR 또는 VFR 사운드 파일을 녹음하거나 재생하려면 파일의 각 패킷에 하나씩 이러한 구조의 배열이 필요합니다.

오디오 파일 서비스 및 오디오 파일 스트림 서비스의 인터페이스를 통해 패킷을 처리 할 수 있습니다. 예를 들어 AudioFile.h의 AudioFileReadPackets 함수는 디스크의 사운드 파일에서 읽은 패킷 집합을 버퍼에 저장합니다. 동시에 각 패킷을 설명하는 AudioStreamPacketDescription 구조체 배열을 제공합니다.

CBR 및 VBR 형식 (일반적으로 사용되는 모든 형식)에서 주어진 오디오 파일 또는 스트림에 대한 초당 패킷 수는 고정되어 있습니다. 여기서 유용한 의미가 있습니다. 패킷 화는 형식에 대한 시간 단위를 의미합니다. 응용 프로그램의 실제 오디오 데이터 버퍼 크기를 계산할 때 패킷 화를 사용할 수 있습니다. 예를 들어, 다음의 메소드는, 지정된 오디오 데이터 지속 시간으로 버퍼를 채우기 위해서 (때문에) 읽어내는 패킷의 수를 결정합니다.

Listing 2-8  Calculating playback buffer size based on packetization

- (void) calculateSizesFor: (Float64) seconds {
    UInt32 maxPacketSize;
    UInt32 propertySize = sizeof (maxPacketSize);
    AudioFileGetProperty (
                          audioFileID,
                          kAudioFilePropertyPacketSizeUpperBound,
                          &propertySize,
                          &maxPacketSize
                          );
    static const int maxBufferSize = 0x10000;   // limit maximum size to 64K
    static const int minBufferSize = 0x4000;    // limit minimum size to 16K
    if (audioFormat.mFramesPerPacket) {
        Float64 numPacketsForTime =
        audioFormat.mSampleRate / audioFormat.mFramesPerPacket * seconds;
        [self setBufferByteSize: numPacketsForTime * maxPacketSize];
    } else {
        // if frames per packet is zero, then the codec doesn't know the
        // relationship between packets and time. Return a default buffer size
        
        [self setBufferByteSize:
         maxBufferSize > maxPacketSize ? maxBufferSize : maxPacketSize];
    }
    // clamp buffer size to our specified range
    if (bufferByteSize > maxBufferSize && bufferByteSize > maxPacketSize) {
        [self setBufferByteSize: maxBufferSize];
    } else {
        if (bufferByteSize < minBufferSize) {
            [self setBufferByteSize: minBufferSize];
        }
    }
    [self setNumPacketsToRead: self.bufferByteSize / maxPacketSize];
}

Data Format Conversion

한 형식에서 다른 형식으로 오디오 데이터를 변환하려면 오디오 변환기를 사용합니다. 샘플 속도 변경 또는 인터리빙 / 디인터리빙과 같은 간단한 변환을 수행 할 수 있습니다. 오디오 압축 또는 압축 해제와 같은 복잡한 변환을 수행 할 수도 있습니다. 세 가지 유형의 전환을 사용할 수 있습니다.

  • 오디오 형식 (예 : AAC (고급 오디오 코딩))을 선형 PCM 형식으로 디코딩합니다.
  • 선형 PCM 데이터를 다른 오디오 형식으로 변환.
  • 선형 PCM의 다른 변형 사이의 변환 (예 : 16 비트 부호있는 선형 PCM을 8.24 고정 소수점 선형 PCM으로 변환).

오디오 대기열 서비스 ( Recording and Playback using Audio Queue Services에 설명되어 있음)를 사용하면 적절한 변환기가 자동으로 제공됩니다. 오디오 코덱 서비스 (Mac에만 해당)를 사용하면 디지털 권한 관리 (DRM) 또는 독점 오디오 형식을 처리하는 등의 특수 오디오 코덱을 만들 수 있습니다. 사용자 지정 코덱을 만든 후에는 오디오 변환기를 사용하여 액세스하고 사용할 수 있습니다.)

OS X에서 명시 적으로 오디오 변환기를 사용하면 특정 변환기 인스턴스와 함께 변환 함수를 호출하여 입력 데이터를 찾을 위치와 출력을 쓸 위치를 지정합니다. 대부분의 변환에는 정기적으로 입력 데이터를 변환기에 제공하는 콜백 함수가 필요합니다. 오디오 변환기를 사용하는 방법의 예는 Core Audio SDK의 Services / AudioFileTools에있는 SimpleSDK / ConvertFile 및 AFConvert 명령 줄 도구를 참조하십시오.

Supported Audio File and Data Formats in OS X은 압축 된 형식과 선형 PCM간에 변환 할 수있는 표준 Core Audio 코덱을 나열합니다. 코덱에 대한 자세한 내용은 Codecs을 참조하십시오.

Sound Files

응용 프로그램에서 사운드 파일을 사용하여 작업 할 때마다 Core Audio의 중간 수준 서비스 중 하나 인 오디오 파일 서비스를 사용할 수 있습니다. 오디오 파일 서비스는 파일에 포함 된 오디오 데이터와 메타 데이터에 액세스하고 사운드 파일을 생성하기위한 강력한 추상화 기능을 제공합니다.

고유 한 파일 ID, 파일 유형 및 데이터 형식을 사용하여 작업 할 수있을뿐 아니라 오디오 파일 서비스를 사용하여 영역 및 마커, 반복, 재생 방향, SMPTE 타임 코드 등을 작업 할 수 있습니다.

또한 오디오 파일 서비스를 사용하여 시스템 특성을 찾습니다. 사용하는 함수는 AudioFileGetGlobalInfoSize (원하는 정보를 저장하기 위해 메모리를 할당 할 수있게 해줌)와 AudioFileGetGlobalInfo (정보를 얻기 위해)입니다. AudioFile.h에 선언 된 속성의 긴 목록을 사용하면 프로그래밍 방식으로 다음과 같은 시스템 특성을 얻을 수 있습니다.

  • Readable file types
  • Writable file types
  • 쓰기 가능한 각 유형에 대해 파일에 넣을 수있는 오디오 데이터 형식

이 섹션에서는 두 가지 다른 Core Audio 기술에 대해서도 소개합니다.

  • 오디오 스트림 분석 서비스 인 오디오 파일 스트림 서비스를 사용하면 디스크 나 네트워크 스트림에서 오디오 데이터를 읽을 수 있습니다.
  • 확장 오디오 파일 서비스 (Mac 전용)는 오디오 파일 서비스 및 오디오 변환기 서비스의 기능을 캡슐화하여 코드를 단순화합니다.

Creating a New Sound File

녹음 할 새 사운드 파일을 만들려면 다음이 필요합니다.

  • 파일의 파일 시스템 경로 (CFURL 또는 NSURL 객체 형식).
  • AudioFile.h의 오디오 파일 형식 열거 형에 선언 된대로 만들려는 파일 형식의 식별자입니다. 예를 들어, CAF 파일을 작성하려면 kAudioFileCAFType ID를 사용하십시오.
  • AudioFile.h의 오디오 파일 형식 열거 형에 선언 된대로 만들려는 파일 형식의 식별자입니다. 예를 들어, CAF 파일을 작성하려면 kAudioFileCAFType ID를 사용하십시오.

이 세 가지 정보를 AudioFileCreateWithURL 함수에 대한 매개 변수로 Audio File Services에 제공합니다.이 함수는 파일을 만들고 AudioFileID 객체를 다시 제공합니다. 그런 다음이 객체를 사용하여 사운드 파일과의 추가 상호 작용을 수행합니다. 함수 호출은 코드 2-9와 같다.

Listing 2-9  Creating a sound file

AudioFileCreateWithURL (
   audioFileURL,
   kAudioFileCAFType,
   &audioFormat,
   kAudioFileFlags_EraseFile,
   &audioFileID   // the function provides the new file object here
);

Opening a Sound File

재생을 위해 사운드 파일을 열려면 AudioFileOpenURL 함수를 사용합니다. 이 함수는 파일의 URL, 파일 유형 힌트 상수 및 사용할 파일 액세스 권한을 제공합니다. AudioFileOpenURL은 파일의 고유 ID를 다시 제공합니다.

그런 다음 AudioFileGetPropertyInfo 및 AudioFileGetProperty 함수와 함께 속성 식별자를 사용하여 파일에 대해 알아야 할 내용을 검색합니다. 상당히 자주 사용되는 몇 가지 속성 식별자는 다음과 같습니다.

  • kAudioFilePropertyFileFormat
  • kAudioFilePropertyDataFormat
  • kAudioFilePropertyMagicCookieData
  • kAudioFilePropertyChannelLayout

오디오 파일 서비스에는 이러한 식별자를 사용하여 지역 마커, 저작권 정보 및 재생 템포와 같이 파일에있을 수있는 메타 데이터를 얻을 수 있습니다.

VBR 파일이 길면 Podcast가 전체 패킷 테이블을 가져 오는 데 상당한 시간이 걸릴 수 있습니다. 이 경우 kAudioFilePropertyPacketSizeUpperBound 및 kAudioFilePropertyEstimatedDuration이라는 두 가지 속성 식별자가 특히 유용합니다. VBR 사운드 파일의 지속 시간 또는 패킷 수를 대략적으로 대략적으로 비교하여 전체 파일을 구문 분석하여 정확한 숫자를 얻을 수 있습니다.

Reading From and Writing To a Sound File

iOS에서는 일반적으로 오디오 파일 서비스를 사용하여 사운드 파일에서 오디오 데이터를 읽고 사운드 파일에 씁니다. 읽기와 쓰기는 오디오 파일 서비스를 사용할 때 본질적으로 서로의 이미지를 비 춥니 다. 두 작업 모두 완료 될 때까지 차단되며 두 작업 모두 바이트 또는 패킷을 사용하여 작업 할 수 있습니다. 그러나 특별한 요구 사항이 없으면 항상 패킷을 사용하십시오.

  • 패킷을 읽고 쓰는 것이 VBR 데이터의 유일한 옵션입니다.
  • 패킷 기반 작업을 사용하면 재생 시간을 훨씬 쉽게 계산할 수 있습니다.

iOS에서 오디오 데이터를 디스크에서 읽는 또 다른 옵션은 오디오 파일 스트림 서비스입니다. 이 기술에 대한 소개는이 장 뒷부분의 Sound Streams을 참조하십시오.

Audio Queue Services는 Audio Toolbox 프레임 워크의 AudioQueue.h 헤더 파일에 선언되어 있으며 녹음 및 재생을위한 Core Audio 인터페이스입니다. 오디오 대기열 서비스에 대한 개요는이 장 뒷부분의 Recording and Playback using Audio Queue Services을 참조하십시오.

Extended Audio File Services

Core Audio는 Extended Audio File Services라고하는 편리한 API를 제공합니다. 이 인터페이스는 오디오 파일 서비스 및 오디오 변환기 서비스의 필수 기능을 포함하여 선형 PCM에서 자동 데이터 변환을 제공합니다. 자세한 내용은  Reading and Writing Audio Data를 참조하십시오.

iPhone Audio File Formats

iOS는 표 2-1에 나열된 오디오 파일 형식을 지원합니다. iOS에서 사용할 수있는 오디오 데이터 포맷에 대한 정보는  Codecs을 참조하십시오.

Format nameFormat filename extensions
AIFF.aif, .aiff
CAF.caf
MPEG-1, layer 3.mp3
MPEG-2 or MPEG-4 ADTS.aac
MPEG-4.m4a, .mp4
WAV.wav
AC-3 (Dolby Digital).ac3
Enhanced AC-3 (Dolby Digital Plus).ec3

CAF Files

iOS 및 OS X에는 기본 오디오 파일 형식 인 Core Audio Format (또는 CAF) 파일 형식이 있습니다. CAF 형식은 OS X v10.4 “Tiger”에 도입되었으며 iOS 2.0 이상에서 사용할 수 있습니다. 이것은 플랫폼에서 지원되는 모든 오디오 데이터 형식을 포함 할 수 있다는 점에서 독특합니다.

CAF 파일에는 AIFF 및 WAVE 파일과 달리 크기 제한이 없으며 채널 정보 및 텍스트 주석과 같은 다양한 메타 데이터를 지원할 수 있습니다. CAF 파일 형식에 대한 자세한 내용은 Apple Core Audio Format Specification 1.0을 참조하십시오.

Sound Streams

디스크 기반 사운드 파일과는 달리 오디오 파일 스트림은 시작과 끝이 사용자가 액세스 할 수없는 오디오 데이터입니다. 예를 들어, 인터넷 라디오 플레이어 응용 프로그램을 만들 때 스트림이 발생합니다. 공급자는 일반적으로 스트림을 연속적으로 보냅니다. 사용자가 Play를 눌러들을 때, 오디오 패킷의 시작, 중간 또는 끝 또는 마술 쿠키와 같은 현재 어떤 데이터가 진행 중인지에 관계없이 응용 프로그램이 이동해야합니다.

또한 사운드 파일과 달리 스트림의 데이터를 안정적으로 사용할 수 없습니다. 스트림을 가져 오는 네트워크의 바리 아에 따라 드롭 아웃, 불연속 또는 일시 중지가 발생할 수 있습니다.

Audio File Stream Services를 사용하면 스트림과 모든 복잡한 작업을 응용 프로그램에서 처리 할 수 ​​있습니다. 파싱을 처리합니다.

오디오 파일 스트림 서비스를 사용하려면 AudioFileStreamID 유형의 오디오 파일 스트림 객체를 만듭니다. 이 객체는 스트림 자체의 프록시 역할을합니다. 또한이 객체를 사용하면 속성을 통해 스트림에서 진행중인 작업을 응용 프로그램에 알릴 수 있습니다 (Properties, Scopes, and Elements 참조). 예를 들어, 오디오 파일 스트림 서비스가 스트림의 비트 전송률을 결정하면 오디오 파일 스트림 객체에 kAudioFileStreamProperty_BitRate 속성을 설정합니다.).

Audio File Stream Services는 구문 분석을 수행하므로 오디오 데이터 세트 및 기타 정보 집합에 응답하는 응용 프로그램의 역할이됩니다. 두 가지 콜백 함수를 정의하여 응용 프로그램을 이러한 방식으로 응답하게 만듭니다.

먼저 오디오 파일 스트림 객체의 속성 변경에 대한 콜백이 필요합니다. 최소한이 콜백을 작성하면 kAudioFileStreamProperty_ReadyToProducePackets 속성의 변경 내용에 응답 할 수 있습니다. 이 속성을 사용하는 일반적인 시나리오는 다음과 같습니다.

  1. 사용자가 Play를 누르거나 그렇지 않으면 스트림 재생이 시작되도록 요청합니다.
  2. 오디오 파일 스트림 서비스가 스트림 구문 분석을 시작합니다.
  3. 충분한 오디오 데이터 패킷이 응용 프로그램에 함께 보내져 구문 분석이 될 때, 오디오 파일 스트림 서비스는 오디오 파일 스트림 객체 (1의 값으로 실제로) true로 kAudioFileStreamProperty_ReadyToProducePackets 속성을 설정합니다.
  4. Audio File Stream Services는 속성 ID 값이 kAudioFileStreamProperty_ReadyToProducePackets 인 응용 프로그램의 property listener 콜백을 호출합니다.
  5. property listener 콜백은 스트림 재생을위한 오디오 대기열 객체 설정과 같은 적절한 조치를 취합니다.

둘째, 오디오 데이터에 대한 콜백이 필요합니다. 오디오 파일 스트림 서비스는 일련의 완전한 오디오 데이터 패킷을 수집 할 때마다이 콜백을 호출합니다. 이 콜백을 정의하여 수신 된 오디오를 처리합니다. 일반적으로 Audio Queue Services로 보내면 즉시 재생됩니다. 재생에 대한 자세한 내용은 다음 섹션 인 Recording and Playback using Audio Queue Services.을 참조하십시오.,

Audio Sessions: Cooperating with Core Audio

iOS에서 애플리케이션은 전화 통화와 같이 중요한 일을하는 경우가 종종 있습니다. 응용 프로그램이 소리를 내고 전화가 오는 경우, iPhone은 올바른 일을해야합니다.

첫 번째 단계에서이 “옳은 일”은 사용자의 기대를 충족시키는 것을 의미합니다. 두 번째 단계에서는 경쟁 요구를 해결할 때 iPhone이 실행중인 각 애플리케이션의 현재 상태를 고려해야한다는 것을 의미합니다.

오디오 세션은 애플리케이션과 iOS 사이의 매개체입니다. 각 iPhone 응용 프로그램에는 정확히 하나의 오디오 세션이 있습니다. 응용 프로그램의 오디오 의도를 나타내도록 구성합니다. 시작하려면 애플리케이션의 동작 방식에 대한 몇 가지 질문에 답해야합니다.

  • 응용 프로그램이 전화와 같은 중단에 어떻게 응답하도록 하시겠습니까?
  • 응용 프로그램의 사운드를 다른 실행중인 응용 프로그램의 사운드와 혼합하거나 침묵 시키려고합니까?
  • 예를 들어 사용자가 헤드셋을 꽂거나 뽑을 때와 같이 응용 프로그램이 오디오 경로 변경에 어떻게 응답해야합니까?

답변을 얻으려면 AudioToolbox / AudioServices.h에 선언 된 오디오 세션 인터페이스를 사용하여 오디오 세션과 응용 프로그램을 구성합니다. 표 2-2는이 인터페이스에서 제공하는 세 가지 프로그래밍 기능을 설명합니다.

Table 2-2  Features provided by the audio session interface

Audio session featureDescription
Categoriescategory 는 응용 프로그램에 대한 일련의 오디오 동작을 식별하는 키입니다. 카테고리를 설정하면 화면 잠금시 오디오를 계속할지 여부와 같은 iOS에 대한 오디오 의도를 나타냅니다.
Interruptions and route changes오디오 세션은 오디오가 중단되거나 중단이 종료되거나 하드웨어 오디오 경로가 변경 될 때 알림을 게시합니다. 이러한 알림을 사용하면 수신 전화 통화로 인한 중단과 같은 더 큰 오디오 환경의 변화에 효과적으로 대응할 수 있습니다.
Hardware characteristics오디오 세션을 쿼리하여 하드웨어 샘플 속도, 하드웨어 채널 수 및 오디오 입력 사용 가능 여부와 같이 응용 프로그램이 실행중인 장치의 특성을 검색 할 수 있습니다.

Audio Session Default Behavior

오디오 세션에는 몇 가지 기본 동작이 있습니다. 구체적으로 :

  • 사용자가 벨소리 / 무음 스위치를 무음으로 움직이면 오디오가 음소거됩니다.
  • 사용자가 잠자기 / 깨우기 단추를 눌러 화면을 잠 그거나 자동 잠금 기간이 만료되면 오디오가 음소거됩니다.
  • 오디오가 시작되면 이미 재생중인 iPod 오디오와 같이 장치의 다른 오디오가 음소거됩니다.

이 동작 세트는 기본 오디오 세션 카테고리, 즉 kAudioSessionCategory_SoloAmbientSound에 의해 지정됩니다. iOS는 VOIP (Voice over Internet Protocol) 응용 프로그램에 사용되는 것처럼 사용자 인터페이스 음향 효과에서 동시 오디오 입출력에 이르는 광범위한 오디오 요구 사항에 대한 범주를 제공합니다. 시작시 및 응용 프로그램이 실행되는 동안 원하는 범주를 지정할 수 있습니다.

오디오 세션 기본 동작으로 iPhone 오디오 개발을 시작할 수 있습니다. 그러나 특정 특수한 경우를 제외하고는 기본 동작이 다음 설명과 같이 운송 응용 프로그램에 적합하지 않습니다.

Interruptions: Deactivation and Activation

명백하게 기본 오디오 세션에서 빠진 기능 중 하나는 중단 후 자체를 다시 활성화하는 기능입니다. 오디오 세션에는 활성 및 비활성의 두 가지 기본 상태가 있습니다. 오디오는 오디오 세션이 활성화 된 경우에만 응용 프로그램에서 작동 할 수 있습니다.

시작되면 기본 오디오 세션이 활성화됩니다. 그러나 전화가 오면 세션이 즉시 비활성화되고 오디오가 중지됩니다. 이를 인터럽트라고합니다. 사용자가 전화 통화를 무시하도록 선택하면 응용 프로그램이 계속 실행됩니다. 그러나 오디오 세션이 비활성 상태이면 오디오가 작동하지 않습니다.

OpenAL, I / O 오디오 장치 또는 오디오 대기열 서비스를 응용 프로그램에서 사용하는 경우 중단 청취자 콜백 기능을 작성하고 중단이 끝나면 오디오 세션을 명시 적으로 다시 활성화해야합니다. Audio Session Programming Guide에서는 자세한 내용과 코드 예제를 제공합니다.

AVAudioPlayer 클래스를 사용하면 클래스가 오디오 세션 재활성을 처리합니다.

Determining if Audio Input is Available

iOS 기반 장치의 녹음 응용 프로그램은 하드웨어 오디오 입력이 가능한 경우에만 녹음 할 수 있습니다. 이를 테스트하려면 오디오 세션 kAudioSessionProperty_AudioInputAvailable 속성을 사용합니다. 적절한 액세서리 하드웨어가 연결되어있을 때만 오디오 입력을받는 iPod touch (2 세대)와 같은 장치에서 응용 프로그램을 실행하는 경우 중요합니다. 코드 2-10은 테스트 수행 방법을 보여줍니다.

Listing 2-10  Determining if a mobile device supports audio recording

UInt32 audioInputIsAvailable;
UInt32 propertySize = sizeof (audioInputIsAvailable);
AudioSessionGetProperty (
   kAudioSessionProperty_AudioInputAvailable,
   &propertySize,
   &audioInputIsAvailable // A nonzero value on output means that
                          // audio input is available
);

Using Your Audio Session

응용 프로그램에는 한 번에 하나의 오디오 세션 범주 만 있으므로 주어진 시간에 모든 오디오가 활성 범주의 특성을 따릅니다. 이 규칙의 한 가지 예외는 경고 및 사용자 인터페이스 사운드 효과 용 API 인 System Sound Services를 사용하여 재생하는 오디오로, 우선 순위가 가장 낮은 오디오 세션 범주를 항상 사용합니다. Audio Session Programming GuideResponding to Interruptions은 모든 카테고리를 설명합니다.

응용 프로그램에 오디오 세션 지원을 추가하면 개발 및 테스트를 위해 시뮬레이터에서 응용 프로그램을 실행할 수 있습니다. 그러나 시뮬레이터는 세션 동작을 시뮬레이션하지 않습니다. 오디오 세션 코드의 동작을 테스트하려면 장치에서 실행해야합니다.

Note: 오디오 세션 서비스를 무시해도 응용 프로그램이 실행되는 것을 막을 수는 없지만 응용 프로그램이 원하는 방식으로 작동하지 않을 수 있습니다. 대부분의 경우이 섹션의 앞부분에서 설명한 것처럼이 인터페이스를 사용하지 않고 오디오를 사용하는 iPhone 또는 iPod touch 응용 프로그램을 제공하지 않아야합니다.

Playback using the AVAudioPlayer Class

AVAudioPlayer 클래스는 오디오 재생을위한 간단한 Objective-C 인터페이스를 제공합니다. 애플리케이션에 스테레오 포지셔닝이나 정밀한 동기화가 필요하지 않고 네트워크 스트림에서 캡처 한 오디오를 재생하지 않는 경우 재생할 때이 클래스를 사용하는 것이 좋습니다.

오디오 플레이어를 사용하면 다음을 수행 할 수 있습니다.

  • 어떤 지속 시간의 소리도 재생하십시오.
  • 파일 또는 메모리 버퍼에서 사운드 재생
  • 루프 사운드
  • 여러 사운드 동시 재생
  • 재생중인 각 사운드의 상대 재생 레벨 제어
  • 빨리 감기 및 되감기와 같은 응용 프로그램 기능을 지원하는 사운드 파일의 특정 지점을 찾습니다.
  • 오디오 레벨 미터링에 사용할 수있는 데이터 얻기

AVAudioPlayer 클래스를 사용하면 iOS에서 사용할 수있는 모든 오디오 형식으로 사운드를 재생할 수 있습니다. 이 클래스의 인터페이스에 대한 자세한 내용은 AVAudioPlayer Class Reference를 참조하십시오.

OpenAL, I / O 오디오 장치 및 오디오 대기열 서비스와 달리 AVAudioPlayer 클래스에서는 오디오 세션 서비스를 사용할 필요가 없습니다. 오디오 플레이어가 중단되면 다시 활성화됩니다. 화면이 잠길 때 오디오를 중지하는 등 기본 오디오 세션 범주 ( Audio Sessions: Cooperating with Core Audio참조)에서 지정한 동작을 원할 경우 오디오 플레이어에서 기본 오디오 세션을 성공적으로 사용할 수 있습니다.

재생을 위해 오디오 플레이어를 구성하려면 사운드 파일을 할당하고 재생 준비를하고 대리자 개체를 지정합니다. Listing 2-11의 코드는 일반적으로 애플리케이션의 컨트롤러 클래스에 대한 초기화 메소드로 들어간다.

Listing 2-11  Configuring an AVAudioPlayer object

NSString *soundFilePath =
               [[NSBundle mainBundle] pathForResource: @"sound"
                                               ofType: @"wav"];
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
AVAudioPlayer *newPlayer =
               [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL
                                                      error: nil];
[fileURL release];
self.player = newPlayer;
[newPlayer release];
[self.player prepareToPlay];
[self.player setDelegate: self];

대리자 객체 (컨트롤러 객체 일 수 있음)를 사용하여 중단을 처리하고 사운드 재생이 끝나면 사용자 인터페이스를 업데이트합니다. AVAudioPlayer 클래스의 위임 메서드는 AVAudioPlayerDelegate Protocol Reference에서 설명합니다. Listing 2-12는 하나의 델리게이트 메소드의 간단한 구현을 보여준다. 이 코드는 사운드 재생이 끝나면 재생 / 일시 중지 토글 버튼의 제목을 업데이트합니다.

Listing 2-12  Implementing an AVAudioPlayer delegate method

- (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player
                       successfully: (BOOL) flag {
   if (flag == YES) {
       [self.button setTitle: @"Play" forState: UIControlStateNormal];
   }
}

AVAudioPlayer 객체를 재생, 일시 중지 또는 중지하려면 재생 제어 메서드 중 하나를 호출하십시오. playing 속성을 사용하여 재생이 진행 중인지 여부를 테스트 할 수 있습니다. 코드 2-13은 재생을 제어하고 UIButton 객체의 제목을 업데이트하는 기본 재생 / 일시 중지 토글 메소드를 보여줍니다.

Listing 2-13  Controlling an AVAudioPlayer object

- (IBAction) playOrPause: (id) sender {
   // if already playing, then pause
   if (self.player.playing) {
       [self.button setTitle: @"Play" forState: UIControlStateHighlighted];
       [self.button setTitle: @"Play" forState: UIControlStateNormal];
       [self.player pause];
   // if stopped or paused, start playing
   } else {
       [self.button setTitle: @"Pause" forState: UIControlStateHighlighted];
       [self.button setTitle: @"Pause" forState: UIControlStateNormal];
       [self.player play];
   }
}

AVAudioPlayer 클래스는 Objective-C 선언 속성을 사용하여 사운드 타임 라인 내의 재생 지점과 같은 볼륨에 대한 정보를 관리하고 볼륨 및 반복과 같은 재생 옵션에 액세스합니다. 예를 들어 다음과 같이 오디오 플레이어의 재생 볼륨을 설정합니다.

[self.player setVolume: 1.0];    // available range is 0.0 through 1.0

AVAudioPlayer 클래스에 대한 자세한 내용은 AVAudioPlayer Class Reference를 참조하십시오.

Recording and Playback using Audio Queue Services

Audio Queue Services는 오디오를 기록하고 재생할 수있는 간단하고 낮은 오버 헤드 방법을 제공합니다. 이를 통해 응용 프로그램은 하드웨어 인터페이스에 대한 지식 없이도 하드웨어 녹음 및 재생 장치 (예 : 마이크 및 라우드 스피커)를 사용할 수 있습니다. 또한 코덱 작동 방식에 대한 지식 없이도 정교한 코덱을 사용할 수 있습니다.

고급 인터페이스이지만 Audio Queue Services는 몇 가지 고급 기능을 지원합니다. 스케줄링 된 재생 및 동기화를 지원하는 세분화 된 타이밍 제어 기능을 제공합니다. 이 기능을 사용하여 여러 오디오 대기열의 재생을 동기화하고, 동시에 사운드를 재생하고, 여러 사운드의 재생 레벨을 독립적으로 제어하고, 루핑을 수행 할 수 있습니다. 오디오 대기열 서비스 및 AVAudioPlayer 클래스 (Playback using the AVAudioPlayer Class 참조)는 iPhone 또는 iPod touch에서 압축 오디오를 재생하는 유일한 방법입니다.

일반적으로 오디오 파일 서비스 (Sound Files에 설명되어 있음) 또는 오디오 파일 스트림 서비스 (Sound Streams에서 설명 함)와 함께 오디오 대기열 서비스를 사용합니다.).

Audio Queue Callback Functions for Recording and Playback

Audio File Stream Services의 경우와 마찬가지로 콜백 및 속성을 사용하여 오디오 대기열 객체와 상호 작용합니다. 녹음의 경우 녹음 오디오 큐 객체에서 제공하는 오디오 데이터 버퍼를 허용하는 콜백 함수를 구현하여 디스크에 씁니다. 오디오 큐 객체는 녹음 할 데이터의 새 버퍼가있을 때 콜백을 호출합니다. 그림 2-2는이 프로세스의 단순화 된보기를 보여줍니다.

An audio queue object feeds buffers of fresh audio data to your callback, which writes the buffers to disk.

Figure 2-2  Recording with an audio queue object

재생시 오디오 콜백은 반대의 역할을합니다. 재생 오디오 큐 객체가 재생할 다른 버퍼의 오디오를 필요로 할 때 호출됩니다. 그런 다음 콜백은 디스크에서 주어진 수의 오디오 패킷을 읽어 오디오 대기열 객체의 버퍼 중 하나로 전달합니다. 오디오 큐 객체는 해당 버퍼를 차례로 재생합니다. 그림 2-3은이를 보여줍니다.

An audio queue object requests audio data from your callback, which reads from disk. The callback then hands the data off to an audio queue buffer, which is eventually played by the audio queue object.

Figure 2-3  Playing back using an audio queue object

Creating an Audio Queue Object

오디오 대기열 서비스를 사용하려면 두 가지 유형의 오디오 대기열 객체를 먼저 생성해야합니다. 두 가지 유형 모두 AudioQueueRef 데이터 유형이 있습니다.

  • AudioQueueNewInput 함수를 사용하여 녹음 오디오 큐 객체를 만듭니다.
  • AudioQueueNewOutput 함수를 사용하여 재생 오디오 큐 객체를 만듭니다.

재생할 오디오 큐 객체를 만들려면 다음 세 단계를 수행하십시오.

  1. 오디오 큐에 필요한 정보 (예 : 재생할 데이터의 오디오 형식)를 관리하기위한 데이터 구조를 만듭니다.
  2. 오디오 대기열 버퍼를 관리하기위한 콜백 함수를 정의하십시오. 콜백은 오디오 파일 서비스를 사용하여 재생할 파일을 읽습니다.
  3. AudioQueueNewOutput 기능을 사용하여 재생 오디오 큐를 인스턴스화.

Listing 2-14 illustrates these steps:

Listing 2-14  Creating an audio queue object

static const int kNumberBuffers = 3;
// Create a data structure to manage information needed by the audio queue
struct myAQStruct {
    AudioFileID                     mAudioFile;
    CAStreamBasicDescription        mDataFormat;
    AudioQueueRef                   mQueue;
    AudioQueueBufferRef             mBuffers[kNumberBuffers];
    SInt64                          mCurrentPacket;
    UInt32                          mNumPacketsToRead;
    AudioStreamPacketDescription    *mPacketDescs;
    bool                            mDone;
};
// Define a playback audio queue callback function
static void AQTestBufferCallback(
                                 void                   *inUserData,
                                 AudioQueueRef          inAQ,
                                 AudioQueueBufferRef    inCompleteAQBuffer
                                 ) {
    myAQStruct *myInfo = (myAQStruct *)inUserData;
    if (myInfo->mDone) return;
    UInt32 numBytes;
    UInt32 nPackets = myInfo->mNumPacketsToRead;
    AudioFileReadPackets (
                          myInfo->mAudioFile,
                          false,
                          &numBytes,
                          myInfo->mPacketDescs,
                          myInfo->mCurrentPacket,
                          &nPackets,
                          inCompleteAQBuffer->mAudioData
                          );
    if (nPackets > 0) {
        inCompleteAQBuffer->mAudioDataByteSize = numBytes;
        AudioQueueEnqueueBuffer (
                                 inAQ,
                                 inCompleteAQBuffer,
                                 (myInfo->mPacketDescs ? nPackets : 0),
                                 myInfo->mPacketDescs
                                 );
        myInfo->mCurrentPacket += nPackets;
    } else {
        AudioQueueStop (
                        myInfo->mQueue,
                        false
                        );
        myInfo->mDone = true;
    }
}
// Instantiate an audio queue object
AudioQueueNewOutput (
                     &myInfo.mDataFormat,
                     AQTestBufferCallback,
                     &myInfo,
                     CFRunLoopGetCurrent(),
                     kCFRunLoopCommonModes,
                     0,
                     &myInfo.mQueue
                     );

Controlling Audio Queue Playback Level

오디오 대기열 객체는 재생 레벨을 제어하는 ​​두 가지 방법을 제공합니다.

재생 레벨을 직접 설정하려면, Listing 2-15와 같이 kAudioQueueParam_Volume 매개 변수와 함께 AudioQueueSetParameter 함수를 사용하십시오. 레벨 변경은 즉시 적용됩니다.

Listing 2-15  Setting playback level directly

Float32 volume = 1;
AudioQueueSetParameter (
   myAQstruct.audioQueueObject,
   kAudioQueueParam_Volume,
   volume
);

AudioQueueEnqueueBufferWithParameters 함수를 사용하여 오디오 대기열 버퍼의 재생 레벨을 설정할 수도 있습니다. 이렇게하면 오디오 큐 버퍼를 대기열에 넣을 때 사실상 오디오 큐 버퍼에있는 오디오 큐 설정을 할당 할 수 있습니다. 이러한 변경은 오디오 대기열 버퍼가 재생되기 시작할 때 적용됩니다.

두 경우 모두 오디오 큐의 레벨 변경 사항은 다시 변경할 때까지 유효합니다.

Indicating Audio Queue Playback Level

kAudioQueueProperty_CurrentLevelMeterDB 속성을 쿼리하여 오디오 큐 객체에서 현재 재생 레벨을 얻을 수 있습니다. 이 속성의 값은 채널 당 하나씩 AudioQueueLevelMeterState 구조체의 배열입니다. 코드 2-16은이 구조를 보여줍니다.

Listing 2-16  The AudioQueueLevelMeterState structure

typedef struct AudioQueueLevelMeterState {
   Float32     mAveragePower;
   Float32     mPeakPower;
};  AudioQueueLevelMeterState;

Playing Multiple Sounds Simultaneously

여러 사운드를 동시에 재생하려면 각 사운드에 대해 하나의 재생 오디오 큐 객체를 만듭니다. 각 오디오 대기열에 대해 AudioQueueEnqueueBufferWithParameters 함수를 사용하여 오디오의 첫 번째 버퍼가 동시에 시작되도록 예약합니다.

iPhone 또는 iPod touch에서 동시에 사운드를 재생할 때 오디오 포맷이 중요합니다. 이는 iOS에서 특정 압축 형식을 재생할 때 효율적인 하드웨어 코덱을 사용하기 때문입니다. 한 번에 다음 형식 중 하나의 단일 인스턴스 만 장치에서 재생할 수 있습니다.

  • AAC
  • ALAC (Apple Lossless)
  • MP3

고품질의 동시 사운드를 재생하려면 리니어 PCM 또는 IMA4 오디오를 사용하십시오.

다음 목록은 iOS가 개별 또는 다중 재생을위한 오디오 포맷을 지원하는 방법을 설명합니다.

  • 선형 PCM 및 IMA / ADPCM (IMA4) 오디오 CPU 리소스 문제없이 iOS에서 여러 개의 선형 PCM 또는 IMA4 형식 사운드를 동시에 재생할 수 있습니다.
  • AAC, MP3 및 Apple Lossless (ALAC) 오디오 용 Apple Lossless (ALAC) 오디오 재생은 iPhone 및 iPod touch에서 효율적인 하드웨어 기반 디코딩을 사용합니다. 한 번에 하나의 사운드 만 재생할 수 있습니다.

코드 샘플을 포함하여 녹음 및 재생을 위해 오디오 대기열 서비스를 사용하는 방법에 대한 전체 설명은  Audio Queue Services Programming Guide를 참조하십시오..

Playback with Positioning Using OpenAL

오픈 소스 프레임 워크에서 사용할 수 있으며 코어 오디오 위에 구축 된 오픈 소스 OpenAL 오디오 API는 재생 중 사운드 포지셔닝에 최적화되어 있습니다. OpenAL은 OpenGL을 모델로 한 인터페이스를 사용하여 소리를 재생, 배치, 믹싱 및 이동하기가 쉽습니다. OpenAL과 OpenGL은 공통 좌표계를 공유하여 사운드 및 화면상의 그래픽 객체의 움직임을 동기화 할 수 있습니다. OpenAL은 Core Audio의 I / O 오디오 장치 ( Audio Units 참조)를 직접 사용하므로 대기 시간이 가장 짧습니다.

이러한 모든 이유로 OpenAL은 iPhone 및 iPod touch의 게임 응용 프로그램에서 음향 효과를 재생할 때 최고의 선택입니다. OpenAL은 일반적인 iOS 응용 프로그램 재생 요구에 적합한 선택입니다.

iOS의 OpenAL 1.1은 오디오 캡처를 지원하지 않습니다. iOS에서 녹음하려면 오디오 대기열 서비스를 사용하십시오.

OS X의 OpenAL은 OpenAL 1.1의 구현을 제공합니다. 사양, 확장 기능. iOS의 OpenAL에는 두 가지 Apple 확장이 있습니다.

  • alBufferDataStaticProcPtr은 alBufferData에 대한 사용 패턴을 따르지만 버퍼 데이터 복사는 제거합니다.
  • alcMacOSXMixerOutputRateProcPtr를 사용하여 기본 믹서의 샘플 속도를 제어 할 수 있습니다.

Core Audio에서 OpenAL을 사용하는 Mac의 예는 Core Audio SDK의 Services / OpenALExample을 참조하십시오.

System Sounds: Alerts and Sound Effects

레벨, 위치 지정, 오디오 세션 또는 기타 컨트롤이 필요하지 않을 때 짧은 사운드 파일을 재생하려면 Audio Toolbox 프레임 워크의 AudioServices.h 헤더 파일에 선언 된 System Sound Services를 사용하십시오. 이 인터페이스는 가능한 한 가장 간단한 방법으로 짧은 사운드를 재생하려는 경우 이상적입니다. iOS에서 System Sound Services를 사용하여 재생되는 사운드는 최대 30 초로 제한됩니다.

iOS에서는 AudioServicesPlaySystemSound 함수를 호출하여 지정한 사운드 효과 파일을 즉시 재생합니다. 또는 사용자에게 경고해야 할 때 AudioServicesPlayAlertSound를 호출 할 수 있습니다. 사용자가 무음 스위치를 설정하면 이러한 각 기능이 iPhone에서 진동을 발생시킵니다. iOS 시뮬레이터 나 바탕 화면을 사용하면 진동이나 윙윙 거리는 소리가 들리지 않습니다.

AudioServicesPlaySystemSound 함수를 호출 할 때 kSystemSoundID_Vibrate 상수를 사용하여 iPhone에서 진동을 명시 적으로 호출 할 수 있습니다.

AudioServicesPlaySystemSound 함수로 사운드를 재생하려면 먼저 사운드 ID 객체를 만들어 사운드 효과 파일을 시스템 사운드로 등록합니다. 그런 다음 사운드를 재생할 수 있습니다. 사운드를 가끔 또는 반복해서 재생하는 등의 일반적인 사용에서는 응용 프로그램이 종료 될 때까지 사운드 ID 객체를 유지하십시오. 예를 들어 시동 사운드의 경우와 같이 사운드를 한 번만 사용한다는 것을 알고 있으면 소리를 재생 한 직후 사운드 ID 개체를 파괴하여 메모리를 확보 할 수 있습니다.

코드 2-17은 System Sound Services의 인터페이스를 사용하여 사운드를 재생하는 최소한의 프로그램을 보여줍니다. 사운드 완성 콜백 및이를 설치하는 호출은 사운드를 다시 재생하지 않을 것임을 알고있는 경우 사운드를 재생 한 후에 메모리를 확보하려는 경우에 주로 유용합니다.

Listing 2-17  Playing a short sound

#include <AudioToolbox/AudioToolbox.h>
#include <CoreFoundation/CoreFoundation.h>
// Define a callback to be called when the sound is finished
// playing. Useful when you need to free memory after playing.
static void MyCompletionCallback (
                                  SystemSoundID  mySSID,
                                  void * myURLRef
                                  ) {
    AudioServicesDisposeSystemSoundID (mySSID);
    CFRelease (myURLRef);
    CFRunLoopStop (CFRunLoopGetCurrent());
}
int main (int argc, const char * argv[]) {
    // Set up the pieces needed to play a sound.
    SystemSoundID    mySSID;
    CFURLRef        myURLRef;
    myURLRef = CFURLCreateWithFileSystemPath (
                                              kCFAllocatorDefault,
                                              CFSTR ("../../ComedyHorns.aif"),
                                              kCFURLPOSIXPathStyle,
                                              FALSE
                                              );
    // create a system sound ID to represent the sound file
    OSStatus error = AudioServicesCreateSystemSoundID (myURLRef, &mySSID);
    // Register the sound completion callback.
    // Again, useful when you need to free memory after playing.
    AudioServicesAddSystemSoundCompletion (
                                           mySSID,
                                           NULL,
                                           NULL,
                                           MyCompletionCallback,
                                           (void *) myURLRef
                                           );
    // Play the sound file.
    AudioServicesPlaySystemSound (mySSID);
    // Invoke a run loop on the current thread to keep the application
    // running long enough for the sound to play; the sound completion
    // callback later stops this run loop.
    CFRunLoopRun ();
    return 0;
}

Core Audio Plug-ins: Audio Units and Codecs

Core Audio에는 오디오 데이터를 처리하기위한 플러그인 메커니즘이 있습니다. iOS에서 시스템은 이러한 플러그인을 제공합니다. OS X에서는 플러그인을 내장하고 나만의 플러그인을 만들 수도 있습니다.
다중 호스트 응용 프로그램은 각각 오디오 장치 또는 코덱의 여러 인스턴스를 사용할 수 있습니다.

Audio Units

iOS에서 오디오 유닛은 애플리케이션이 낮은 대기 시간의 입출력을 달성 할 수있는 메커니즘을 제공합니다. 또한 여기에 설명 된 특정 DSP 기능을 제공합니다.

OS X에서 오디오 유닛은 GarageBand 및 Logic Studio와 같은 오디오 응용 프로그램의 추가 기능으로 가장 잘 나타납니다. 이 역할에서 오디오 장치에는 자체 사용자 인터페이스 또는 view가 있습니다. iOS의 오디오 유닛에는 views가 없습니다.

두 플랫폼 중 하나에서 오디오 유닛 프레임 워크의 AUComponent.h 헤더 파일에 내장 된 오디오 유닛의 프로그램 이름이 있습니다.

iOS 오디오 유닛들은 입력 및 출력을 위해 8.24 비트 고정 소수점 선형 PCM 오디오 데이터를 사용합니다. 한 가지 예외는 데이터 형식 변환기 유닛이며 다음 목록에 설명되어 있습니다. iOS 오디오 유닛은 다음과 같습니다.

  • 3D mixer unit—8 비트 또는 16 비트 선형 PCM 일 수있는 모노 입력을 얼마든지 사용할 수 있습니다. 8.24 비트 고정 소수점 PCM에서 하나의 스테레오 출력을 제공합니다. 3D 믹서 장치는 입력에서 샘플 속도 변환을 수행하고 각 입력 채널에 대해 많은 제어를 제공합니다. 이 컨트롤에는 볼륨, 음소거, 패닝, 거리 감쇠 및 이러한 변경에 대한 비율 제어가 포함됩니다. 프로그래밍 방식으로, 이것은 kAudioUnitSubType_AU3DMixerEmbedded 유닛입니다.
  • Multichannel mixer unit—16 비트 선형 또는 8.24 비트 고정 소수점 PCM 일 수있는 모노 또는 스테레오 입력을 원하는 수만큼 허용합니다. 8.24 비트 고정 소수점 PCM에서 하나의 스테레오 출력을 제공합니다. 응용 프로그램은 각 입력 채널을 음소거하거나 음소거를 해제하고 음량을 제어 할 수 있습니다. 프로그래밍 방식으로, 이것은 kAudioUnitSubType_MultiChannelMixer 유닛입니다.
  • Converter unit—샘플 속도, 비트 심도 및 비트 형식 (선형에서 고정 소수점까지) 변환을 제공합니다. iPhone 변환 장치의 정식 데이터 형식은 8.24 비트 고정 소수점 PCM입니다. 이 형식으로 변환하거나 변환합니다. 프로그래밍 방식으로, 이것은 thekAudioUnitSubType_AUConverter 유닛입니다.
  • I/O unit—실시간 오디오 입출력을 제공하고 필요에 따라 샘플 속도 변환을 수행합니다. 프로그래밍 방식으로, 이것은 thekAudioUnitSubType_RemoteIO 단위입니다.
  • iPod EQ unit—샘플 속도, 비트 심도 및 비트 형식 (선형에서 고정 소수점) 변환을 제공합니다. iPhone 변환 장치의 정식 데이터 형식은 8.24 비트 고정 소수점 PCM입니다. 이 형식으로 변환하거나 변환합니다. 프로그래밍 방식으로, 이것은 kAudioUnitSubType_AUConverter 유닛입니다.

I / O 장치로 알려진 오디오 유닛의 특수 카테고리는 해당 오디오 유닛에서 중요한 역할을 하기 때문에 Audio Processing Graphs에서 자세히 설명합니다.

OS X은 40 개 이상의 오디오 유닛을 제공합니다.이 모든 유닛은  System-Supplied Audio Units in OS X에 나열되어 있습니다. 응용 프로그램의 기본 요소로 또는 고객으로 제품으로 제공 할 수있는 오디오 유닛을 직접 만들 수도 있습니다. 그들 자신의 권리. 자세한 내용은 Audio Unit Programming Guide를 참조하십시오.

OS X 오디오 장치는 입력 및 출력을 위해 비 인터리브 32 비트 부동 소수점 선형 PCM 데이터를 사용합니다 (데이터 형식 변환기 인 오디오 장치의 경우는 제외). OS X 오디오 장치는 다른 선형 PCM 변형도 지원할 수 있지만 선형 PCM 이외의 형식은 지원하지 않습니다. 따라서 Apple 및 다른 공급 업체의 오디오 장치와의 호환성이 보장됩니다. 다른 형식의 오디오 데이터를 선형 PCM으로 변환하려면 오디오 변환기를 사용할 수 있습니다 ( Data Format Conversion 참조).

iOS 및 OS X에서 호스트 응용 프로그램은 Audio Unit Services의 기능을 사용하여 오디오 장치를 검색하고로드합니다. 각 오디오 유닛은 유형, 부속 유형 및 제조업체 코드의 3 요소 조합으로 고유하게 식별됩니다. Apple에서 지정한 유형 코드는 유닛의 일반적인 용도 (효과, 생성기 등)를 나타냅니다. 하위 유형은 오디오 단위가하는 일을보다 정확하게 설명하지만 오디오 단위에 프로그래밍 방식으로 중요하지는 않습니다. 그러나 귀사에서 두 개 이상의 효과 유닛을 제공하는 경우, 각각 다른 특수 효과 유닛과 구별하려면 고유 한 하위 유형이 있어야합니다. 제조업체 코드는 오디오 장치의 개발자로서 귀하를 식별합니다. Apple은 Data Type Registration 페이지에서 제조업체 코드를 “작성자 코드”로 등록 할 것을 기대합니다.

오디오 유닛은 Properties, Scopes, and Elements에서 설명한대로 속성을 사용하여 기능 및 구성 정보를 설명합니다. 각 오디오 유닛 유형에는 Apple에서 정의한대로 몇 가지 필수 속성이 있지만 오디오 유닛의 필요에 따라 추가 속성을 자유롭게 추가 할 수 있습니다. OS X에서 호스트 응용 프로그램은 속성 정보를 사용하여 오디오 유닛에 대한 일반 뷰를 만들 수 있으며 사용자 지정 뷰를 오디오 유닛의 필수 요소로 제공 할 수 있습니다.

오디오 유닛은 또한 최종 사용자가 실시간으로 조정할 수있는 매개 변수 메커니즘을 사용합니다. 이러한 매개 변수는 함수에 대한 인수가 아니라 오디오 유닛 동작에 대한 사용자 조정을 지원하는 메커니즘입니다. 예를 들어, 파라 메트릭 필터 유닛은 필터 응답의 중심 주파수 및 폭에 대한 파라미터를 가질 수 있고, 뷰를 통해 설정 될 수있다.

OS X에서 오디오 장치의 상태 변화를 모니터링하기 위해 응용 프로그램은 특정 오디오 장치 이벤트가 발생할 때 호출되는 콜백 함수 (때로는 수신기라고 함)를 등록 할 수 있습니다. 예를 들어, Mac 응용 프로그램은 사용자가 오디오 장치보기에서 슬라이더를 움직일 때 또는 오디오 데이터 흐름이 중단 될 때를 알고 싶어 할 수 있습니다. 자세한 내용은  Technical Note TN2104: Handling Audio Unit Events를 참조하십시오.

Core Audio SDK (AudioUnits 폴더에 있음)는 대부분의 Component Manager 플러그인 인터페이스를 구현하는 C 프레임 워크와 함께 일반적인 오디오 유닛 유형 (예 : 효과 유닛 및 악기 유닛)에 대한 템플릿을 제공합니다. SDK를 사용하여 OS X 용 오디오 장치를 작성하는 방법에 대한 자세한 내용은  Audio Unit Programming Guide를 참조하십시오.

Codecs

iOS에서 사용할 수있는 녹음 및 재생 코덱은 오디오 품질, 응용 프로그램 개발의 유연성, 하드웨어 기능 및 배터리 수명의 균형을 맞추기 위해 선택됩니다.

iOS에는 두 가지 재생 코덱 그룹이 있습니다. 표 2-3에 나열된 첫 번째 그룹에는 제한없이 사용할 수있는 매우 효율적인 형식이 포함되어 있습니다. 즉, 이러한 형식의 인스턴스를 동시에 두 개 이상 재생할 수 있습니다.

For information on audio file formats supported in iOS, see iPhone Audio File Formats.

Table 2-3  iOS: unrestricted playback audio formats

iLBC (internet Low Bitrate Codec, also a speech codec)
IMA/ADPCM (also known as IMA-4)
Linear PCM
µLaw and aLaw

iOS 재생 코덱의 두 번째 그룹은 모두 하나의 하드웨어 경로를 공유합니다. 따라서 한 번에 다음 형식 중 하나의 인스턴스 만 재생할 수 있습니다.

Table 2-4  iOS: restricted playback audio formats

AAC
Apple Lossless
MP3

iOS에는 표 2-5에 나열된 녹음 코덱이 포함되어 있습니다. 보시다시피 MP3 또는 AAC 녹음은 사용할 수 없습니다. 이것은 이러한 형식의 CPU 오버 헤드가 높아지고 결과적으로 배터리가 소모되기 때문입니다.

Apple Lossless
iLBC (internet Low Bitrate Codec, a speech codec)
IMA/ADPCM (also known as IMA-4)
Linear PCM
µLaw and aLaw

OS X에서는 다양한 코덱과 지원되는 형식을 찾을 수 있습니다. 자세한 내용은 Supported Audio File and Data Formats in OS X을 참조하십시오.

OS X은 오디오 데이터 코덱을 사용하고 생성하기위한 인터페이스도 제공합니다. 이러한 인터페이스는 AudioConverter.h 헤더 파일 (Audio Toolbox 프레임 워크에서) 및 AudioCodec.h (Audio Unit 프레임 워크에서)로 선언됩니다. Common Tasks in OS X에서는 이러한 서비스를 사용하는 방법에 대해 설명합니다.

Audio Processing Graphs

오디오 처리 그래프 (AUGraph라고도 함)는 복잡한 작업을 수행하기 위해 서로 연결된 오디오 단위 모음을 정의합니다. 예를 들어 그래프는 신호를 왜곡하고 압축 한 다음 사운드 스테이지의 특정 위치로 옮길 수 있습니다. 그래프를 정의 할 때 응용 프로그램의 신호 체인에 추가하거나 제거 할 수있는 재사용 가능한 처리 모듈이 있습니다.

일반적으로 처리 그래프는 I / O 장치 (출력 장치라고도 함)로 끝납니다. I / O 장치는 하드웨어와 간접적으로 (낮은 수준의 서비스를 통해) 상호 작용하지만 종종 요구 사항은 아닙니다. I / O 장치는 출력을 대신 응용 프로그램으로 보낼 수 있습니다.

처리 그래프에서 헤드 노드라고하는 I / O 장치를 볼 수도 있습니다. I / O 유닛은 그래프에서 데이터 흐름을 시작하고 중지 할 수있는 유일한 유닛입니다. 이것은 오디오 장치가 데이터를 얻는 데 사용하는 소위 풀(pull) 메커니즘의 필수 요소입니다. 그래프의 각 오디오 유닛은 렌더링 콜백을 후속 모델과 함께 등록하여 후속 모델이 오디오 데이터를 요청할 수 있도록합니다. I / O 장치가 데이터 흐름을 시작하면 (응용 프로그램에서 트리거 함) 렌더링 메서드는 체인의 선행 오디오 단위를 다시 호출하여 데이터를 요청하고 그 전신기(predecessor)를 호출합니다.

iOS에는  Audio Units에서 설명한대로 단일 I / O 장치가 있습니다. OS X에 관한 이야기는 좀 더 복잡합니다.

  • AUHAL 장치는 특정 하드웨어 장치에 대한 전용 입력 및 출력용입니다. 기술 노트 TN2091, Device input using the HAL Output Audio Unit을 참조하십시오.
  • 일반 I / O 장치를 사용하면 오디오 처리 그래프의 출력을 응용 프로그램에 연결할 수 있습니다. Figure 2-6에서 볼 수 있듯이 일반 I / O 장치를 하위 그래프의 헤드 노드로 사용할 수도 있습니다.
  • 시스템 I / O 장치는 경보 및 사용자 인터페이스 음향 효과 용입니다.
  • 기본 I / O 장치는 다른 모든 오디오 입력 및 출력용입니다.

Audio MIDI Setup 응용 프로그램 (Mac에서만, 유틸리티 폴더에 있음)을 사용하면 사용자가 시스템 I / O 및 기본 I / O 장치의 연결을 개별적으로 지정할 수 있습니다.

그림 2-4는 신호가 위에서 아래로 흐르는 간단한 오디오 처리 그래프를 보여줍니다.

Figure 2-4  A simple audio processing graph

Three audio units connected in series: compressor unit, pitch unit, output unit.

오디오 프로세싱 그래프의 각 오디오 유닛은 노드라고 부를 수 있습니다. 한 노드의 출력을 다른 노드의 입력에 연결하여 처리 그래프 연결을 만듭니다. 그림 2-5와 같이 개입 된 스플리터 장치를 사용하지 않는 한 단일 출력을 두 개 이상의 입력에 연결할 수 없습니다.

The correct way to perform splitting is to use a splitter unit.

Figure 2-5  How to fan out an audio unit connection

그러나 오디오 장치는 유형에 따라 다중 출력 또는 입력을 제공하도록 설계 될 수 있습니다. 예를 들어 스플리터 장치가이를 수행합니다.

오디오 처리 그래프 서비스를 사용하여 하위 그래프를 큰 그래프로 결합 할 수 있습니다. 여기서 하위 그래프는 큰 그래프의 단일 노드로 나타납니다. 그림 2-6에서는이를 보여줍니다.

A three-audio-unit subgraph fed by a file player unit and feeding a mixer unit.

Figure 2-6  A subgraph connection

각 그래프 또는 하위 그래프는 I / O 단위로 끝나야합니다. 하위 그래프 또는 출력이 응용 프로그램에 공급되는 그래프는 하드웨어에 연결되지 않는 일반 I / O 장치로 끝나야합니다.

오디오 프로세싱 그래프를 사용하지 않고도 오디오 단위를 프로그래밍 방식으로 연결할 수는 있지만 거의 좋은 아이디어는 아닙니다. 그래프는 중요한 이점을 제공합니다. 그래프를 동적으로 수정할 수 있으므로 데이터를 처리하는 동안 신호 경로를 변경할 수 있습니다. 또한 그래프는 오디오 단위의 상호 연결을 캡슐화하기 때문에 참조하는 각 오디오 단위를 명시 적으로 인스턴스화하는 대신 한 단계로 그래프를 인스턴스화합니다.

MIDI Services in OS X

Core Audio는 MIDI 지원을 위해 Core MIDI Services를 사용합니다. 이러한 서비스는 CoreMIDI.framework의 다음 헤더 파일에 선언 된 함수, 데이터 유형 및 상수로 구성됩니다.

  • MIDIServices.h
  • MIDISetup.h
  • MIDIThruConnection.h
  • MIDIDriver.h

Core MIDI Services는 응용 프로그램 및 오디오 장치가 MIDI 장치와 통신하는 데 사용할 수있는 인터페이스를 정의합니다. 이것은 응용 프로그램이 MIDI 네트워크와 상호 작용할 수있게 해주는 많은 추상화를 사용합니다.

MIDI 엔드 포인트 (불투명 한 형태의 MIDIEndpointRef에 의해 정의된다)는, 표준의 16 채널 MIDI 데이터 스트림의 소스 또는 목적지를 나타냅니다. 음악 플레이어 서비스에서 사용하는 트랙과 끝점을 연결하여 MIDI 데이터를 녹음하거나 재생할 수 있습니다. MIDI 엔드 포인트는 표준 MIDI 케이블 연결을위한 프록시 객체입니다. 그러나 MIDI 엔드 포인트는 물리적 장치와 반드시 일치 할 필요는 없습니다. 응용 프로그램 자체를 가상 소스 또는 대상으로 설정하여 MIDI 데이터를 보내거나받을 수 있습니다.

MIDI 드라이버는 종종 MIDI 엔티티 (MIDI 엔티티)라고하는 논리적 그룹으로 여러 끝점을 결합합니다. 예를 들어, MIDI 인 엔드 포인트와 MIDI 아웃 엔드 포인트를 MIDI 엔티티로 그룹화하는 것이 합리적입니다.이 엔티티는 장치 또는 어플리케이션과의 양방향 통신을 위해 쉽게 참조 할 수 있습니다.

각 물리적 MIDI 장치 (단일 MIDI 연결이 아닌)는 Core MIDI 장치 개체 (MIDIDeviceRef)로 나타납니다. 각 장치 개체에는 하나 이상의 MIDI 엔터티가 포함될 수 있습니다.

Core MIDI는 응용 프로그램과 장치간에 MIDI 데이터를 전달하는 실제 작업을 수행하는 MIDI 서버와 통신합니다. 미디 서버는 어떤 어플리케이션과도 독립적으로 자체 프로세스로 실행됩니다. 그림 2-7은 Core MIDI와 MIDI Server의 관계를 보여줍니다.

Outboard MIDI hardware (guitar and keyboard) connect to MIDI Server, which in turn connects to Core MIDI

Figure 2-7  Core MIDI and Core MIDI Server

MIDI 통신을 위해 응용 프로그램에 의존하지 않는 기반을 제공하는 것 외에도, MIDI 서버는 호스트 응용 프로그램을 포함하지 않고 장치 대 장치 체인을 허용하는 모든 MIDI 쓰루 연결을 처리합니다.

MIDI 장비 제조업체 인 경우, 커널 레벨 I / O Kit 드라이버와 상호 작용하기 위해 CFBundle에 패키지 된 MIDI 서버용 CFPlugin 플러그인을 제공해야 할 수도 있습니다. 그림 2-8은 Core MIDI와 Core MIDI Server가 기본 하드웨어와 상호 작용하는 방법을 보여줍니다.

Note: USB MIDI 클래스 호환 장치를 만드는 경우 Apple에서 제공하는 USB 드라이버가 하드웨어를 지원하므로 사용자 자신의 드라이버를 작성할 필요가 없습니다.

MIDI endpoint objects interface between your application and the MIDI server, which in turn interfaces with the I/O Kit in the Kernel, which in turn interfaces with hardware ports.

Figure 2-8  MIDI Server interface with I/O Kit

각 MIDI 장치의 드라이버는 일반적으로 커널 외부에 존재하며 MIDI 서버 프로세스에서 실행됩니다. 이 드라이버는 기본 프로토콜 (예 : USB 및 FireWire)에 대한 기본 I / O Kit 드라이버와 상호 작용합니다. MIDI 드라이버는 원시 장치 데이터를 Core MIDI에 사용 가능한 형식으로 표시합니다. Core MIDI는 외부 장치의 MIDI 포트를 추상적으로 표현한 지정된 MIDI 끝점을 통해 MIDI 정보를 응용 프로그램에 전달합니다.

그러나 PCI 카드의 MIDI 장치는 사용자 공간 드라이버를 통해 전적으로 제어 될 수 없습니다. PCI 카드의 경우 사용자 지정 사용자 클라이언트를 제공하기 위해 커널 확장을 만들어야합니다. 이 클라이언트는 PCI 장치 자체를 제어하거나 (사용자 공간 드라이버에 대한 간단한 메시지 대기열 제공) 사용자 공간 드라이버에서 요청한 경우 PCI 장치의 주소 범위를 MIDI 서버의 주소로 매핑해야합니다. 이렇게하면 사용자 공간 드라이버가 PCI 장치를 직접 제어 할 수 있습니다.

사용자 공간 MIDI 드라이버를 구현하는 예는 Core Audio SDK의 MIDI / SampleUSBDriver를 참조하십시오.

Music Player Services in OS X

음악 플레이어 서비스를 사용하면 일련의 MIDI 음악 트랙을 정렬하고 재생할 수 있습니다.

트랙은 MIDI 또는 이벤트 데이터 (MusicTrack 데이터 유형으로 표시됨)의 스트림입니다. 트랙에는 MIDI 데이터, Core Audio 이벤트 데이터 또는 사용자 정의 이벤트 메시지가 될 수있는 일련의 시간 기반 이벤트가 포함됩니다. 트랙을 하나의 악기에 대한 낱장 악보로 생각할 수 있습니다.

시퀀스는 트랙 모음입니다 (MusicSequence 데이터 유형으로 표시됨). 시퀀스에는 항상 모든 트랙을 동기화하는 데 사용되는 별도의 템포 트랙이 있습니다. 시퀀스를 여러 악기의 낱장 악보를 수집하는 악보로 생각할 수 있습니다. Mac 응용 프로그램은 시퀀스의 트랙을 동적으로 추가, 삭제 또는 편집 할 수 있습니다.

시퀀스를 재생하려면 시퀀스의 재생을 제어하면서 지휘자 역할을하는 뮤직 플레이어 객체 (MusicPlayer 유형)에 할당합니다. 사운드를 생성하려면 각 트랙을 악기 또는 외부 MIDI 장치로 보내십시오.

트랙 데이터는 음악 정보를 나타내지 않아도됩니다. 대신 오디오 유닛 자동화를 구현하기 위해 트랙을 사용할 수 있습니다. 예를 들어, 패너 유닛에 지정된 트랙은 사운드 스테이지에서 음원의 외관상의 위치를 제어 할 수 있습니다. 트랙에는 응용 프로그램 정의 콜백을 트리거하는 독점적 인 사용자 이벤트가 포함될 수도 있습니다.

뮤직 플레이어 서비스를 사용하여 MIDI 데이터를 재생하는 방법에 대한 자세한 내용은 Handling MIDI Data를 참조하십시오.

Timing Services in OS X

Core Audio Clock Services는 응용 프로그램 및 장치를 동기화하는 데 사용할 수있는 참조 클럭을 제공합니다. 이 클럭은 독립형 타이밍 소스이거나 MIDI 비트 클럭 또는 MIDI 타임 코드와 같은 외부 트리거와 동기화 될 수 있습니다. 시계를 직접 시작하고 중지하거나 특정 이벤트에 대한 응답으로 시계를 활성화 또는 비활성화하도록 설정할 수 있습니다.

생성 된 시계 시간은 초, 박자, SMPTE 시간, 오디오 샘플 시간 및 막대 비트 시간과 같은 다양한 형식으로 얻을 수 있습니다. 후자는 뮤지컬 바, 비트 및 서브 비트의 측면에서 화면에 표시하기 쉬운 방식으로 시간을 설명합니다. Core Audio Clock Services는 한 시간 형식을 다른 형식으로 변환하고 막대 비트 또는 SMPTE 시간을 표시하는 유틸리티 기능도 포함합니다. 그림 2-9는 다양한 Core Audio Clock 형식 간의 상호 관계를 보여줍니다.

Beats, seconds, and SMPTE code all derive from host time.

Figure 2-9  Some Core Audio Clock formats

하드웨어 시간은 호스트 시간 (시스템 클럭) 또는 외부 오디오 장치 (HAL의 AudioDevice 개체로 표시)에서 얻은 오디오 시간의 절대 시간 값을 나타냅니다. mach_absolute_time 또는 UpTime을 호출하여 현재 호스트 시간을 결정합니다. 오디오 시간은 오디오 장치의 현재 시간을 샘플 번호로 나타냅니다. 샘플 번호의 변경 속도는 오디오 장치의 샘플링 속도에 따라 다릅니다.

미디어 시간은 오디오 데이터에 대한 일반적인 타이밍 방법을 나타냅니다. 정규 표현은 초 단위로 배정 밀도 부동 소수점 값으로 표현됩니다. 그러나 템포 맵을 사용하여 초를 음악 바 비트 시간으로 변환하거나 SMPTE 오프셋을 적용하여 초를 SMPTE 초로 변환 할 수 있습니다.

미디어 시간은 실시간으로 일치 할 필요는 없습니다. 예를 들어, 재생 속도를 두 배로 설정하면 오디오 파일의 재생 시간은 10 초입니다.  Services Available in iOS Only의 노브는 절대 ( “실제”) 시간과 미디어 기반 시간 간의 상관 관계를 조정할 수 있음을 나타냅니다. 예를 들어, 바 비트 표기법은 음악 라인의 리듬과 연주 할 음표를 나타내지 만 연주하는 데 걸리는 시간을 나타내지는 않습니다. 이를 확인하려면 재생 속도 (예 : 초당 박자 수)를 알아야합니다. 마찬가지로 SMPTE 시간과 실제 시간의 대응은 프레임 속도와 프레임 손실 여부와 같은 요소에 따라 달라집니다.

Posted in iOS

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다