Turing Up the Volume with Audio Units
OSXDEV
Audio Unit은 GarageBand, Soundtrack, Logic, Final Cut Pro와 같은 애플 어플리케이션이나 서드 파티 어플리케이션 또는 시스템에서 오디오 효과나 가상 악기를 사용할 수 있는 애플의 오디오 플러그인 기술입니다.
이것은 Mac OS X의 오디오 기능이 Core Audio와 직접적으로 연결되어 있기에 가능한 것입니다. 따라서 버츄얼 스튜디오와 같은 효과를 손쉽게 만들어 낼 수 있습니다. Core Audio는 world-class audio와 음악 어플리케이션의 다음 세대를 위한 새로운 기반입니다. Audio Unit을 통해 개발자는 Core Audio는 사용할 수 있는 플러그인을 제공받게 됩니다.
이번 아티클에서는 Xcode에서 Audio Unit를 사용하는 방법에 대해 기술합니다. 간단한 예제를 통해 Audio Unit의 구조를 알아보며 새로운 Audio 효과를 만들어 볼 것입니다.
먼저 Audio Unit에 대한 기본적인 내용을 소개합니다. Xcode에서 Audio Unit을 사용하는 것은 간단합니다. Audio Unit 샘플은 입력 시그널에 대해 사용자가 선택한 gain(amplification)을 적용하는 Volume Unit이 될 것입니다. 다음으로 SDK의 툴을 이용해 Volume Unit을 테스트하고 validation은 애플의 Audio Units Validation Tool을 이용할 것입니다. 마지막으로 GarageBand등에서 악기 효과처럼 Volume Unit을 적용할 수 있습니다.
목차 |
[편집] 시작에 필요한 것들
Audio Unit을 빌드하기 위해서는 Core Audio SDK가 필요합니다. ADC Development Kits 페이지에서 다운로드 할 수 있습니다.
Core Audio SDK는 Audio Unit template를 포함하며, 이 템플릿을 이용해 간단한 Audio Unit을 만들 수 있습니다.
SDK를 설치하면 모든 관련 파일들은 /Developer 밑에 설치됩니다. /Developer/Examples/CoreAudio/Documentation의 HTML파일은 SDK에서 지원하는 Audio Unit 클래스에 대한 설명을 제공하며 추가로 Audio Unit 개발에 대한 오버뷰를 제공합니다.
AU Lab (/Developer/Applications/Audio)는 Audio Unit을 테스트할 수 있는 어플리케이션입니다. /Developer/Examples/CoreAudio/Services는 몇가지 helper application을 제공합니다. /Developer/Examples/CoreAudio/AudioUnits 샘플 Xcode 프로젝트를 제공하며,(SampleAUs>SampleEffect를 포함한) Audio Unit를 추가로 지원할 수 있습니다.
[편집] Audio Unit 소개
Audio Unit은 오디어 데이터를 다룰 수 있는 소프트웨어 컴포넌트입니다. 이것을 이용해 오디오 스트림을 생성하거나, 수정, 증폭 등의 작업을 할 수 있습니다. 구조적으로 Audio Unit은 몇가지 라이브러리와 유사한 엔트리 포인트와 함수가 정의되어 있습니다. 이러한 엔트리 포인트는 어플리케이션이나 다른 컴포넌트로부터 호출됩니다. Xcode를 사용하면 Audio Unit은 번들처럼 빌드됩니다. 번들은 컴포넌트 매니저에 의해 로드되고 Audio Unit을 사용하려는 어플리케이션에 접근 가능한 상태가 됩니다.
Audio Unit은 단독으로 또는 오디오 시그널 그래프처럼 다른 Audio Unit과 조합해 사용됩니다. 하나의 Audio Unit의 출력은 다른 Audio Unit으로 부터 입력됩니다. 데이터 스트림은 구성된 시그널이 하나의 Audio Unit으로 옮겨진 다음, 내부 알고리즘에 의해 스트림이 변경됩니다.
Audio Unit은 제작사의 코덱에 대한 타임과 서브 타입에 대해 명시해야만 합니다. 이러한 4 캐릭터(32 비트)의 시퀀스가 Audio Unit을 구별할 수 있는 기준이됩니다. 코드는 리소스 파일에 선언되어야 하며 (.r 확장자) 최종 빌드된 결과물에 자동적으로 컴파일되어 포함됩니다.
- 제작사 코드는 Aduio Unit의 다른 벤더들과 구분할 수 있도록 해주며, 같은 타임의 Audio Unit 사이에 네임스페이스 충돌을 피할 수 있습니다. 제작사 코드는 Creator Code Registration 에서 등록하시기 바랍니다.
- 타입은 Audio Unit의 일반적인 카테고리를 정의합니다. (effect, music device(악기), 출력단 등). effect는 오디오 입력과 오디오 출력에 관여합니다. 악기는 MIDI 노트와 명령들을 생성하거나 전달합니다. 이 아티클에서 생성된 effect unit의 코드 타입은 aufx입니다.
- 서브 타입은 임의의 코드입니다. Audio Unit의 사용 목적에 따라 구분하는 코드로 delay, low pass filter, high pass filter 등입니다. 이 아티클에서 사용될 서브 타입은 pass-through로 Pass를 사용합니다. 타입과 서브 타입의 코드에 대한 다양한 4 캐릭터 내용은 AUComponent.r에 enumerate되어 있습니다.
컴포넌트 매니저는 다른 컴포넌트가 시작되는 동안 Audio Unit를 로드합니다. 자동적으로 몇군데의 위치를 lock하는데, System을 포함하여 /Library/Audio/Plug-Ins/Components 와 사용자 폴더의 ~/Library/Audio/Plug-Ins/Components입니다. Audio Unit이 빌드되면 사용자 사용 수준(시스템 등록 사용자 전체 사용, 현재 사용자만 사용)에 따라 원하는 위치에 설치할 수 있습니다.
컴포넌트 매니저는 카본 매니저이며, 리소스 형태의 리소스 매니저를 사용합니다. 샘플 코드의 몇가지 리소스 타입(thng과 같이)에서 볼 수 있는 것처럼, Audio Unit에 대한 속성이 필요합니다. .r 파일은 리소스 정의를 포함하며 Xcode는 .r 파일을 컴파일한 Rez 파일을 호함합니다.
Audio Unit은 특정 파라미터와 속성을 갖습니다.
- 파라미터는 시간에 따라 변경되는 값입니다. 파라미터는 항상 Float32 타입이지만, 이것이 뜻하는 것은 Audio Unit의 내부입니다. 이 아티클에서 논의되는 gain은 파라미터의 예입니다.
- 속성은 임의의 데이터를 포함합니다. 속성은 Audio Unit의 환경설정과 Audio Unit으로 부터 생성되거나 출력되는 값의 속성 매카니즘입니다. 예를 들어 사용자 인터페이스 정보는 Audio Unit의 속성으로 리턴되며, 호스트 어플리케이션에서 비쥬얼하게 보여질 수 있습니다. Audio Unit에 지원할 수 있는 정의된 속성의 수는 Audio Unit의 타입에 따라 다르며 AudioUnitProperties.h에 enumerate된 값을 참고하시기 바랍니다. 개발자들이 커스텀 속성을 정의할 수도 있으며 ID 값은 64000 이상을 사용해야 합니다.
Audio Unit에 포함된 것은 손쉽게 유닛의 파라미터를 다룰 수 있습니다. view 또는 사용자 인터페이스는 Audio Unit의 엔티티와는 다릅니다. Audio Unit의 시그널 프로세싱 코드를 재 사용할 수 있도록 만드는 것이며 카본과 코코아 view에서 모두 지원합니다. 추가 정보는 관련된 Audio Unit과 view에 따라 다르며, 관련 내용은 Core Audio SDK에 포함된 WritingCocoaAUUIs.pdf를 참고하시기 바랍니다.
nib 파일 또는 view 클래스로부터 호출되는 동적 구조에서 Audio Unit에 대한 유저 인터페이스를 지원할 수 있습니다. 모두를 지원할 수 없다면 호스트 어플리케이션은 Audio Unit의 파라미터를 쿼리(속성 메카니즘을 이용해)할 수 있고, 실행중에 고유한 인터페이로 구성할 수 있습니다. Audio Unit 호스트 어플리케이션은 당신이 만든 AU가 그릴 윈도우를 지원합니다. 예를 들어 GarageBand에서는 악기나 트랙에 대한 effect처럼 사용자가 당신이 만든 AU를 고르고 설정을 변경하기 위해 선택하면 GarageBand는 당신의 AU에 대한 유저 인터페이스를 popup으로 띄워 줍니다.
컴포넌트가 독립적으로 실행될 수 없기때문에, Core Audio SDK에 들어 있는 AudioUnitHosting 툴이 (GarageBand와 비슷한 호스트 어플리케이션 형태태입니다.) 이 아티클레서 테스트 용도로 사용될 것이며 Volume Unit의 유저 인터페이스와 내부 프로세싱을 테스트할 것입니다. AudioUnitHosting은 테스트할 Audio Unit의 사용자 인터페이스가 되는 것입니다. AudioUnitHosting은 또한 다양한 포맷(AIFF와 wav를 포함한)의 오디오 파일을 재생할 수 있으며, 어플리케이션에 간단하게 드랍하는 것만으로도 재생할 수 있습니다. 처리를 위한 당신의 컴포넌트에 첫번째 데이터 스트림이 지나갈 것이며, 결과적으로 현재 지정된 기본 출력 장비로 재생됩니다. (일반적으로 스피커 또는 헤드폰)
[편집] Xcode를 이용하여 Audio Unit 만들기
이 섹션에서는 audio effect 타입의 Volume Unit을 어떻게 만들 것인지 알아보겠습니다. Volume Unit은 사용자가 입력된 시그널의 gain을 조정할 수 있도록 합니다. 이 예는 슬라이더를 이용해 gain 값을 선택하면 그 결과를 반영하도록 되어 있습니다. 슬라이더 값은 10등분 되어 있으며 가장 낮은 값은 0.0 가장 높은 값은 1.0입니다. 1.0의 값은 입력된 값과 같은 레벨로 출력합니다. (unity gain) Zero는 사실상 0의 값을 갖습니다. 1.0 이하의 값은 소리를 가늘게 만드며, 1.0 이상의 값은 소리를 증폭시킵니다. (예제에서 최대를 1.0이지만 인터페이스를 변경하여 최대값을 변경할 수 있습니다. Interface Builder와 MyVolumeUnit.cpp의MyVolumeUnit::GetParameterInfo 함수를 수정하면 됩니다.)
사용자가 별도 설정을 하지 않고 사용하 수 있도록 Audio Unit 파라미터에 대해 기본 값을 지원해야 합니다. 소리가 증폭되어 범위를 벗어나는 경우 clipping 되는 것도 주의해야 합니다. 증폭될 때 clipping이 발생되면 현재 출력보다 증가시킬 것인지 사용자에게 확인해야 합니다. 증폭된 소리 출력으로 인해 스피커등에 손상을 가져올 수도 있기 때문입니다.
몇가지 C++ 클래스는 Audio Unit에 대해 기본 기능이 구현되어 있습니다. 이러한 클래스는 자동적으로 Xcode 프로젝트 템플릿에 포함되어 있습니다. ComponentBase는 베이스 클래스이며 constructor와 destructor, version method 등이 포함되어 있습니다. AUBase는 ComponentBase로부터 상속되고 렌더링 지원, 속성과 파라미터 핸들링, 프리셋등 Audio Unit를 효과적으로 사용할 수 있는 기능이 추가됩니다. 이러한 메소드의 일부는 virtual로 선언되어 있으며 AUEffectBase와 같은 child class에 구현되어 있습니다. Volume Unit은 audio effect 유닛이며 MyVolumeUnit 클래스에 구현하고 AUEffectBase로 부터 상속받습니다.
관계를 그림으로 표현하면 아래와 같습니다.
| ComponentBase > AUBase > AUEffectBase > MyVolumeUnit |
AUEffectBase와 AUKernelBase:AUEffectBase에 관련된 헤더파일을 살펴보면 내부적으로 하나 이상의 AUKernelBase를 참조합니다. 하지만 계층적으로 AUKernelBase는 한 부분이 아닙니다.
[편집] 시그널 프로세싱
프로세싱 알고리즘은 AUKernelBase:Process 함수를 포함하고 있습니다. 샘플에서 함수는 슬라이더에서 값을 가져온 뒤, 입력 시그널에 적용합니다. 시그널은 자동적으로 프로세싱에 대한 다음 컴포넌트가 라우트됩니다.
Volume Unit은 AUEffectBase로 부터 상속받기 때문에 내부적으로 AUKernelBase 인스턴스를 구현해야 합니다. AUKernelBase는 오디오 시그널을 렌더링하기 위해 응답하는 두 개의 함수를 포함합니다.
// Your signal processing code should go in an override of this function.
virtual void Process(
const Float32* inSourceP,
Float32* inDestP,
UInt32 inFramesToProcess,
UInt32 inNumChannels,
bool& ioSilence
) = 0;
// Override this function to reset your unit for restarting rendering.
virtual void Reset();
입력 시그널은 Process에 대해 Float32 값으로 나타납니다. 이것은 데이터 스트림에서 값의 위치에 대해 성가심없이 다룰 수 있습니다. 다른 경우에서, wave와 같은 값으로 출력 레벨이 표시되면 10, 100, 1000개의 데이터 엘리먼트에 효과를 적용할 수 있습니다.
C++에 익숙하지 않은 사용자는 virtual 키워드는 이 함수가 오버라이드 된 것입니다. 함수에서 0 값을 할당하면 pure virtual function처럼 표시됩니다. 컴파일러가 pure virtual function을 지원할 수 있도록 구현이 필요합니다.
템플릿에서 생성된 Process 구현은 사용자 인터페이스에서 현재 gain 설정을 받아 입력 시그널에 적용합니다. Reset은 없습니다.
[편집] Xcode를 사용해 Audio Unit을 생성하기
Xcode의 프로젝트 템풀릿에는 그림 1과 같이 Audio_Unit_Effect_with_Cocoa_View가 포함되어 있습니다. 일반적인 템플릿이나 Carbon은 Audio_Unit_Effectsks Audio_Unit_Effect_Carbon_View를 사용하면 됩니다.
그림 1 : 프로젝트 템플릿에 포함된 Audio Unit
원하는 프로젝트의 이름을 설정합니다. (여기에서는 MyVolumeUnit입니다.) Xcode가 그림 2와 같이 프로젝트를 생성합니다. 파일 리스트 상단에 SDK 클래가 자동적으로 포함되어 있습니다.
그림 2 : Xcode에서 생성한 MyVolumeUnit
템플릿은 당신의 Audio Unit을 호스팅과 테스팅과 확인할 수 있는 기능을 이미 가지고 있습니다. 최소의 시그널을 다룰 수 있고, 유저 인터페이스는 매우 간단합니다. 보다 상세하게 구현된 버전과 향상된 아이디어는 CoreAudio SDK의 SampleEffect에서 찾을 수 있습니다. 위치는 /Developer/Examples/CoreAudio/AudioUnits/SampleAUs입니다.
Cocoa 프로젝트 템플릿으로 생성한 후 별도의 수정을 하지 않았다면 그림 3과 같이 nib 파일에는 간단한 gain 슬라이더가 CocoaView에 있습니다. 카본 템플릿은 같은 슬라이더가 있으나 AUCarbonViewBase의 서브 클래스인 Control Manager API를 사용했습니다. 일반적인 뷰는 유저 인터페이스 또는 컨트롤을 생성하지 않습니다만, 실행시에 호스트 어플리케이션이 Audio Unit을 쿼리하며 Audio Unit의 속성에 따른 인터페이스가 빌드됩니다.
그림 3 : Volume Unit 유저 인터페이스 (Interface Builder)
[편집] 구현
Process함수의 실제 기능을 리스트 1처럼 구현해 보겠습니다. Volume Unit은 사용자가 선택한 gain을 오디오 데이터에 적용합니다. 데이터 값은 Float32입니다. (Core Audio 데이타의 네이티브 포맷)
리스트 1 : gain 값 적용
void MyVolumeUnit::MyVolumeUnitKernel::Process(
const Float32 *inSourceP,
Float32 *inDestP,
UInt32 inFramesToProcess,
UInt32 inNumChannels,
bool &ioSilence )
{
UInt32 nSampleFrames = inFramesToProcess;
const Float32 *sourceP = inSourceP;
Float32 *destP = inDestP;
Float32 gain = GetParameter( kGainParam );
while (nSampleFrames-- > 0) {
Float32 inputSample = *sourceP;
sourceP += inNumChannels;
// here's where you do your DSP work
Float32 outputSample = inputSample * gain;
*destP = outputSample;
destP += inNumChannels;
}
}
[편집] AudioUnitHosting 테스트
빌드 후 MyVolumeUnit.component 번들을 /Library/Audio/Plug-Ins/Components 또는 ~/Library/Audio/Plug-Ins/Components에 복사합니다. 처음에는 로그 아웃 후 재 로그인하는 것이 좋으나, 바로 AudioUnitHosting을 실행하여 결과를 지켜보는 것도 좋습니다. 처음 실행되면, 변경된 항목들이 Component Manager에 의해 선택되며, 번들이 업데이트되면 해당 폴더에 다시 복사해 넣고 테스트 어플리케이션을 다시 실행합니다.
/Developer/Examples/Services/AudioUnitHosting/에 있는 AudioUnitHosting을 빌드하여 실행한 뒤 그림 4와 같이 MyVolumeUnit을 선택합니다. 모든 리소스가 변경되므로 회사 이름이 기본으로 설정됩니다.
그림 4: AudioUnitHosting에서 로드된 MyVolumeUnit
그림 4의 인터페이스는 그림 3과 다롭니다. 그 이유는 AudioUnitHosting이 카본 뷰입니다. 그러나 처음 코코아뷰로 생성한다면 AudioUnitHosting은 Audio Unit에 대한 파라미터를 쿼리하고 일반적인 뷰를 생성합니다. 이 경우 하나의 파라미터이지만 정확하게는 linear gain 컴포넌트처럼 정의되며, 현재 슬라이더 값이 담겨있는 텍스트 박스 옆에는 "Gain"이라고 적혀있습니다. 어떻게 된 일일까요?
리스트 2의 MyVolumeUnit::GetParameterInfo를 봅시다. 이 함수는 호스트 어플리케이션이 특정 파라미터에 대해 Audio Unit을 쿼리할 때 호출됩니다. 이 경우 AudioUnitParameterInfo 구조체의 unit 필드는 linear gain 타입으로 설정됩니다. (AudioUnitProperties.h에 정의되어 있습니다.) 리스트 3의 CAAUParameter::CAAUParameter 은 인터페이스에서 선택된 값을 취하게 됩니다.
리스트 2 : Audio Unit이 Gain 파라미터에 대한 정보를 리턴
ComponentResult MyVolumeUnit::GetParameterInfo(
AudioUnitScope inScope,
AudioUnitParameterID inParameterID,
AudioUnitParameterInfo &outParameterInfo)
{
ComponentResult result = noErr;
outParameterInfo.flags = kAudioUnitParameterFlag_IsWritable
| kAudioUnitParameterFlag_IsReadable;
if (inScope == kAudioUnitScope_Global) {
switch(inParameterID)
{
case kParam_Gain:
AUBase::FillInParameterName (outParameterInfo, kParameterOneName, false);
outParameterInfo.unit = kAudioUnitParameterUnit_LinearGain;
outParameterInfo.minValue = 0.0;
outParameterInfo.maxValue = 1;
outParameterInfo.defaultValue = kDefaultValue_Gain;
break;
default:
result = kAudioUnitErr_InvalidParameter;
break;
}
} else {
result = kAudioUnitErr_InvalidParameter;
}
return result;
}
리스트 3 : 슬라이더에서 선택된 파라미터 타입
CAAUParameter::CAAUParameter(
AudioUnit au,
AudioUnitParameterID param,
AudioUnitScope scope,
AudioUnitElement element)
: mParamTag (0),
mNumIndexedParams (0),
mNamedParams (0)
{
mAudioUnit = au;
mParameterID = param;
mScope = scope;
mElement = element;
UInt32 propertySize = sizeof(mParamInfo);
OSStatus err = AudioUnitGetProperty(au, kAudioUnitProperty_ParameterInfo,
scope, param, &mParamInfo, &propertySize);
// ...
char* str = 0;
switch (mParamInfo.unit)
{
case kAudioUnitParameterUnit_Boolean:
str = "T/F";
break;
case kAudioUnitParameterUnit_Percent:
case kAudioUnitParameterUnit_EqualPowerCrossfade:
str = "%";
break;
// ...
case kAudioUnitParameterUnit_MixerFaderCurve1:
case kAudioUnitParameterUnit_LinearGain:
str = "Gain";
break;
default:
str = NULL;
break;
}
// ...
if (str)
mParamTag = CFStringCreateWithCString(NULL, str, kCFStringEncodingUTF8);
else
mParamTag = NULL;
}
Interface Builder에서 생성한 커스텀 코코아 뷰는 GarageBand와 같이 커스텀 코코아 뷰를 갖는 Audio Unit의 호스트 어플리케이션에서만 표시됩니다. CoreAudio SDK에 있는 테스트 어플리케이션은 코코아 뷰를 지원하며 위치는 /Developer/Examples/CoreAudio/Services/CocoaAUHost 입니다.
!Versioning 의심할 여지없이 생성, 테스트, 그리고 Audio Unit의 가능한 여러 버전들을 이미 완료했습니다. 템플릿을 이용하더라도 Audio Unit의 Version.h 파일에서 버전 번호는 증가시켜야 합니다. (여기에서는 MyVolumeUnitVersion.h) Xcode는 리소스를 컴파일하기 위해 Rez를 호출한 후, 프로젝트의 각 .r 파일들은 MyVolumeUnitVersion.h에 정의된 값을 사용합니다. 이것은 매우 편리한 방법입니다.
리스트 4에 정의된 버전 번호는 제작사 코드와 서브 타입입니다. 네임스페이스 충돌을 피하기 위해 서브 타입과 제작사 값은 변경해야 합니다. 같은 폴더안에서 몇가지 제작사와 서브타입의 여러 버전이 존재한다면 컴포넌트 매니저는 가장 높은 버전을 억세스합니다.
리스트 4 : MyVolumeUnitVersion.h 파일
#ifdef DEBUG
#define kMyVolumeUnitVersion 0xFFFFFFFF
#else
#define kMyVolumeUnitVersion 0x00010000
#endif
#define MyVolumeUnit_COMP_SUBTYPE 'Pass'
#define MyVolumeUnit_COMP_MANF 'Demo'
[편집] AU Validation Tool을 이용해 Validating하기
다음 스텝은 validation tool인 AUValidation을 실행하는 것입니다. 이 명령은 기대하는 인터페이스에 적합한 Audio Unit을 테스트합니다. (정확하게 동작되는 지의 여부는 여러분의 몫입니다.)
첫번째, 컴포넌트 매니저가 MyVolumeUnit를 제대로 찾는지 체크합니다. 명령어 auval는 AUValidation을 호출합니다. -a 플래그는 가능한 모든 Audio Unit를 리스트하는 파라미터입니다.
리스트 5 : AU Validation Tool의 출력 결과
Mertz:~ asd$ auval -a
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
AU Validation Tool
Version: 1.1.1b11
Copyright 2003-4, Apple Computer, Inc.
Specify -h (-help) for command options
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
aufx Pass Demo - Acme Inc: MyVolumeUnit
aufx bpas appl - Apple: AUBandpass
aufx dcmp appl - Apple: AUDynamicsProcessor
aufx dely appl - Apple: AUDelay
aufx greq appl - Apple: AUGraphicEQ
aufx hpas appl - Apple: AUHipass
aufx hshf appl - Apple: AUHighShelfFilter
aufx lmtr appl - Apple: AUPeakLimiter
aufx lpas appl - Apple: AULowpass
aufx lshf appl - Apple: AULowShelfFilter
aufx mcmp appl - Apple: AUMultibandCompressor
aufx mrev appl - Apple: AUMatrixReverb
aufx pmeq appl - Apple: AUParametricEQ
aumu dls appl - Apple: DLSMusicDevice
aumx 3dmx appl - Apple: AUMixer3D
aumx mxmx appl - Apple: AUMatrixMixer
aumx smxr appl - Apple: AUMixer
aufc conv appl - Apple: AUConverter
aufc vari appl - Apple: AUVarispeed
auou ahal appl - Apple: AudioDeviceOutput
auou def appl - Apple: DefaultOutputUnit
auou genr appl - Apple: GenericOutput
auou sys appl - Apple: SystemOutputUnit
Mertz:~ asd$
MyVolumeUnit을 테스트 하려면 다음을 입력합니다.
Mertz:~ asd$ auval -v aufx Pass Demo
-v 플래그는 특정 타입과 제작사 정보를 지정할 수 있는 플래그로 플래그 다음에 원하는 정보를 적습니다. aufx는 컴포넌트 타임이며 Audio Unit effect를 뜻합니다. Pass는 서브 타입으로 MyVolumeUnit.r 리소스 파일에 정의되어 있고 Demo는 제작사 코드로 역시 리소스 파일에 정의되어 있습니다.
리스트 5는 위의 명령어를 통해 출력된 결과의 일부분입니다. 각 스텝 또는 문장은 PASS 또는 FAIL의 결과로 표시됩니다. AUValidationReadMe.rtf 파일은 (AUValidation 다운로드를 포함하여) 설명과 가능한 출력, 그리고 AUValidation 옵션이 설명되어 있습니다.
리스트 5 : AU Validation Tool의 출력 결과
Mertz:~ asd$ auval -v aufx Pass Demo
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
AU Validation Tool
Version: 1.1.1b11
Copyright 2003-4, Apple Computer, Inc.
Specify -h (-help) for command options
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
--------------------------------------------------
VALIDATING AUDIO UNIT: 'aufx' - 'Pass' - 'Demo'
--------------------------------------------------
Manufacturer String: Acme Inc
AudioUnit name: MyVolumeUnit
Component Info: Acme Inc's Revolutionary Volume Unit
Component Version: 1.0.0 (0x10000)
* * PASS
--------------------------------------------------
TESTING OPEN TIMES:
COLD:
Time to open AudioUnit: 28.872ms
WARM:
Time to open AudioUnit: 0.091ms
* * PASS
--------------------------------------------------
VERIFYING DEFAULT SCOPE FORMATS:
Input Scope Bus Configuration:
Default Bus Count:1
Default Format: AudioStreamBasicDescription: 2 ch, 44100 Hz, 'lpcm' (0x0000002B) 32-bit big-endian
float, deinterleaved
Output Scope Bus Configuration:
Default Bus Count:1
Default Format: AudioStreamBasicDescription: 2 ch, 44100 Hz, 'lpcm' (0x0000002B) 32-bit big-endian
float, deinterleaved
* * PASS
--------------------------------------------------
VERIFYING REQUIRED PROPERTIES:
VERIFYING PROPERTY: Sample Rate
PASS
VERIFYING PROPERTY: Stream Format
PASS
VERIFYING PROPERTY: Maximum Frames Per Slice
PASS
VERIFYING PROPERTY: Last Render Error
PASS
* * PASS
--------------------------------------------------
VERIFYING RECOMMENDED PROPERTIES:
VERIFYING PROPERTY: Latency
PASS
VERIFYING PROPERTY: Tail Time
WARNING: Recommended Property is not supported
VERIFYING PROPERTY: Bypass Effect
PASS
* * PASS
--------------------------------------------------
VERIFYING OPTIONAL PROPERTIES:
VERIFYING PROPERTY Host Callbacks
PASS
* * PASS
--------------------------------------------------
VERIFYING SPECIAL PROPERTIES:
VERIFYING CUSTOM UI
Carbon View Components Available: 0
Cocoa Views Available: 1
CocoaFactoryView
PASS
VERIFYING CLASS INFO
PASS
TESTING HOST CALLBACKS
PASS
* * PASS
// output truncated...
--------------------------------------------------
AU VALIDATION SUCCEEDED.
--------------------------------------------------
Mertz:~ asd$
자 이제 MyVolumeUnit이 빌드되었고 vaildate되었습니다. GarageBand, Logic, 그리고 다른 오디오 어플리케이션에서 사용할 수 있습니다.
[편집] Integrating with GarageBand
컴포넌트 매니저는 당신이 만든 Audio Unit을 설치하고 등록합니다. (스타트업과 로그인 과정중에 일어납니다.) GarageBand는 마스터 트랙 또는 모든 악기를 적용할 수 있는 effect가 자동적으로 표시됩니다. 메뉴에서 Track > Show Track Info 를 선택하거나 <Command-I>를 누르면 다음과 같은 Track Info 윈도우가 나타납니다. 그림 5는 MyVolumeUnit을 선택하고 Gain-Adjusted Grand Piano라는 이름의 악기에 대해 효과를 설정하는 그림입니다. Volume Unit 유저 인터페이스 오른쪽 끝에 있는 수정 아이콘을 클릭합니다. AudioUnitHosting에 의해 추가된 부분이 있으면 약간 지체될 수 있고 대신에 Interface Builder에서 생성된 커스텀 코코아 뷰가 표시됩니다. 여기에서 당신이 만들고자 했던 것과 일치하는 지 확인해 보시기 바랍니다.
그림 5 : GarageBand의 MyVolumeUnit
[편집] 더 많은 정보
이 아티클에 설명된 테크닉으로 오디오 시그널을 처리할 수 있는 Audio Unit을 만들 수 있습니다. 추가 정보는 아래에 나열된 관련된 토픽을 참고하시기 바랍니다.
- 툴
- 현재 버전의 Core Audio SDK가 필요합니다. 여기에서는 1.3.3 버전을 사용했습니다.
- Audio Units Validation Tool을 다운로드 하여 사용하시기 바랍니다.
- Audio Unit Effect Templates을 다운로드 하십시오.
- AudioToolbox.framework, AudioUnit.framework, CoreAudio.framework에 대한 유용한 추가 정보는 각각의 헤더 파일을 살펴보시기 바랍니다.
- creator code를 등록하십시오.
- 도큐멘트
- Core Audio overview and API reference를 읽어보십시오.
- SDK에 설치되는 [ /Developer/Examples/CoreAudio/Documentation/AudioUnits/index.html Audio Units API documentation] 읽어 보십시오.
- 테크니컬 노트 TN2112: Using the 3DMixer Audio Unit을 읽어 보십시오.
- 추가 도큐멘트는 Mac OS X Audio Developer 페이지를 살펴 보십시오.
- Core Audio SDK에 있는 WritingCocoaAUUIs.pdf는 필요한 정보를 많이 담고 있습니다.
- Core Audio development mailing list에서 정보를 찾아 보십시오.
- 마케팅
- 개발이 왼료된 AU와 호스트 어플리케이션에 Audio Unit 로고를 사용하십시오. Audio Units Logo Agreement가 필요하며 관련 정보는 Software Licensing & Trademark Agreements 페이지에 있습니다.
이 문서의 원본은 ADC Home > Audio > Turing Up the Volume with Audio Units 입니다.









