iPhone Core Audio Programming 第1回 概要

iPhone Core Audio Programming 1回目。

Getting Started With Audio Unitが2006/12、Introduction to Audio Unit Developmentが2007/11と、情報が古くなってきました。加えて、iPhoneの登場でCore Audioが次の次元へ進みました。Core AudioとiPhoneが出会い、「いつでもどこでもCore Audio」な時代の到来です。そんなiPhone Core Audioの全容がやっとつかめてきたので、続編iPhone Core Audio Programmingをはじめます。

iPhone Core Audio Overview

まずは最初にOS X Core AudioとiPhone Core Audioの違いを把握しておきます。

Audio Session

iPhoneはモバイルデバイスであるため、特有のサービスが導入されています。
それがAudio Session Servicesです。Audio Session Servicesは何をやるかというと、例えば、サイレントモード時にオーディオを鳴らすか鳴らさないか、といったオーディオの挙動、電話がかかってきたときにどうするか(割り込みへの対応)、そしてハードウェアの状態の制御です。

オーディオの挙動、割り込み
iPhoneがコンピュータと異なるのはさまざまな状態を持つということです。それはヘッドフォンをして音楽を聞いているだとか、サイレントモードにしてるといった状態です。Audio Sessionはこれらに対応するための仕組みで、つまり最もiPhoneらしいサービスだと言えます。Audio SessionがiPhone Core Audioの特徴を最も表していると言っても過言ではない!
そして状態のもう一つが電話がかかってくる、ということです。電話がかかってきて応答するとアプリケーションは終了しますが、拒否したり、出なかったりすると、またアプリケーションに処理が戻ってきます。これが割り込みです。まっとうなアプリケーションはこの割り込みに対応せねばなりません。これもAudio Sessionが担当します。

ハードウェアの状態の制御
で、OSX Core AudioではHAL(Hardware Abstract Layer)があるのですが、iPhone Core Audioではありません(というかたぶんあるけどアクセスできません)。なので、Audio Sessionが代わりに対応します。

AVFoundation

もう一個、OS X Core Audioには無いものとして、AVFoundation Frameworkがあります。これは
・オーディオ再生
・録音
・Audio Sessionの操作
が行える、”Objective-CのAPI”を持つフレームワークです。Objective-CのAPI !
これはCore Audio史上初で相当びっくりしました。相当びっくりしました。相当びっくりしました。

AVFoudationの機能と、この傾向を見るに、AppleはおそらくリニアPCM等のオーディオのデータを直接操作する必要が無いものはObjective-CのAPIを提供するという方針になったんじゃないかなと思います。
そのうちAVEffectとか出て、AVAudioPlayerにエフェクトかけれるようになるんじゃないかなぁ、と。

Audio Unit、AUGraph

しかし肝心のエフェクト、つまりエフェクトカテゴリのAudio UnitがiPhone Core Audioには一個しか載ってません。
iPodアプリケーションでイコライザが使えますが、これの実装はAudio Unitになってて、iPod Equalizerという名前で搭載されております。エフェクトはこれだけです。
IMG_5352

あとはOS Xにも載ってる3D Mixer、MultiChannel Mixer、AU Converterなんかが載ってます。OpenALは3D Mixerの上に実装されているので、3D Mixerを直接使えばOpenALと同等のことができます。だたし、3Dといっても頭部伝達関数(HRTF)あたりの3D定位用の機能がiPhone Core Audio版には実装されてないので、パンニングしかできません。全然3Dじゃないです。パンニングはパラメーター上360度できますが、前後でまったく同じ音がなるので意味無しです。上下に限ってはヴォリュームすら変わりません。つまりOpenALでできるのもパンニングのみです。3GSは結構速いのでそのうちHRTFが実装されるかもしれません。その時本領発揮となるでしょう。で、これらAudio Unitを使う場合にはAUGraphを使うのですが、Sub Graphは使えません。Audio Unit少ないし、Sub Graph使うようなこともないだろうと思われるので問題無いでしょうし、iPhone OS 3.5とかになれば実装されるやもしれません。

Audio Unit正準形

あとはOS X Core AudioではAudio Unitで使うリニアPCMのサンプルはFloat32型でしたが、SInt32型の8.24固定小数点という謎の形式を使います。そしてSInt32型を基準としたAudioStreamBasicDescriptionをAudio Unit正準形と言います。いろいろめんどくさそうに思えますが、floatで計算して最後に数値を変換してやればいいので大して難しくないです。詳細は後の回で解説します。

ハードウェアデコーダー

iPhoneのCPUは遅いので、MP3、ACC、Apple Losslessといった可変ビットレートの圧縮フォーマットの再生は専用のハードウェアデコーダーで処理します。なので、iPodアプリケーションも含め、同時に1個しか再生できません。そんで、いまのところApple Lossless以外はiPhone内でエンコードできません。IMA-4、iLBCなどの固定ビットレートの圧縮フォーマットは何個でもデコード、エンコードできます。

Audio Unitを作れるのか?

これがまだはっきりと明言できないのですが、3.0以降作れます。けどドキュメントが無いのでよく分かりません。あと、作ったとしてもiPhoneだとライブラリはスタティック(静的)リンクしかできないし、他のアプリケーションとも共有できないので、よっぽどAUGraphでやりたいとかじゃなければ、作る意味はあまりないかもしれません(いやいや、ひょっとしたら動的に使えるかも?)。
ただ、アプリ内課金でAudio Unitを売るっていうのはカッコいいですね。

ちなみに、iPhone Core AudioではComponent Managerが廃止になってAudio Component Servicesというのが新設されてます。
これを使ってAudioUnitのインスタンスを作ります。

これぐらいがOS X Core Audioとの違いで、それ以外はOS X Core Audioとだいたい同じです。

まとめ

以上をまとめると・・・・・Getting Startedとかで書いた内容は一部修正すればiPhoneでも使えます!

ということで、次回以降、コードも含めてiPhone Core Audioの世界を探っていきます。
次回はGetting Startedと同じく、いきなりAUGraphを使います。

4 Comments

  1. narumi said:

    ちょーべんきょうになりやした

  2. iPhoneアプリでのオーディオ処理 « okubee's Blog said:

    [...] カテゴリー Uncategorized — okubee @ 11:35 iPhone Core Audio Programming 第1回 概要 http://nagano.monalisa-au.org/?p=769 [...]

  3. iPhoneのオーディオ処理で参考になるサイト | okubee's Blog said:

    [...] Core Audio Programming 第1回 概要 http://nagano.monalisa-au.org/?p=769 [...]

  4. Z said:

    Core Animationプログラミングガイド – Apple日本語版
    http://developer.apple.com/jp/iphone/library/documentation/Cocoa/Conceptual/CoreAnimation_guide

Leave a Reply