iPhone Core Audioプログラミング

iPhone Core Audioプログラミングという本の感想。

iOSで音を出すやりかたは4パターンほどあります。それぞれ、作りやすさ、機能、理解しやすさなどが違います。全部を網羅しようとすると結構大変なのですが日本語で書かれたiPhone Core Audioプログラミングという良書がありますので助かります。
最初本屋でぱらぱらと見た感じではかなり難しそうな印象があります。特にC言語による部分はObjective-Cに慣れた目には完全に別言語に見えます。
しかし、何度も読んでいくうちにだんだんとCore Audioのパターンが見えてきます。その山を超えるとわりと楽に読めるようになります。

chapter 1 System Sound Service
効果音用のAPIの説明。初めのchapterにしては結構いろんなことが詰め込んである。読むペースをつかむ前に次から次へと話題が変わるので注意。コールバックというのが理解できない場合はchapter 2 AVFoundationを検討するのもいいと思います。

chapter 2 AVFoundation
音を出すAPIの中でこのAPIが一番わかりやすい。ARCならreleaseも必要なし。

chapter 3
項目が多いがひとつひとつは単純な知識。
オーディオフォーマットの情報とパケットの情報を混乱しないようにする。
iOSアプリからプログラムを始めた人は、取得したいデータのアドレスを関数の引数として渡すやり方がイメージしにくいかもしれない。このやり方はCoreAudioではすごくよく使う。

chapter 4 AudioSessionの基礎
ここはどんなアプリを作る場合でも目を通しておいたほうがよいでしょう。
ユーザーの使用状況に応じて音の出力の挙動を変化させること方法が書いてあります。
内容は主に2つ、カテゴリ(アプリは音の扱いをどうするか、マナーモード?に従うとか)の設定と割り込み(電話受信など)への対応。
この割り込みへの対応に2つのやり方が紹介されている。一つは直接AudioSessionを扱うやり方、もうひとつはAVAudioPlayerの機能を使うやり方。
AVAudioPlayerはサウンドの扱いを簡単にするために割と後から出来たもの。ソースから想像するにAVAudioPlayerの中にAudioSessionを扱う処理が含まれていて、プログラマは最低限のコードをかけばいいような方針になっている(私の印象だが)。
で、この章ではおそらく難易度の点で、先にAVAudioPlayerの機能を使うやり方、後から直接AudioSessionを扱うやり方が紹介されている。それはそれでいいが、同じような内容が続いてくるので全体像が掴めないなと感じた場合は、先に直接AudioSessionを扱うやり方の方を読んで、後からAVAudioPlayerのやり方を読んでAVAudioPlayerならどう簡単になるのかを理解すれば整理しやすいかと。やるべきことを網羅してから、簡単にやる方法を知るやり方です。
ちなみにAVAudioPlayerの割り込み機能を使いつつ、直接AudioSessionで指定もすると、両方の割り込み対応メソッドが呼ばれます。AVAudioPlayerとアプリでAudioSessionオブジェクトはどの程度別なのかという疑問が出てくる。カテゴリの指定方法を見ると共通のように見えるが、割り込みへの対応は別のように感じます。ま、呼ばれる可能性のある割り込みメソッドは全部呼ばれる仕様です。変に複雑なことをされて呼ばれなくなるよりはいいです。
注意点はAVPlayerの自動SessionActive化について。これは別の記事にまとめました。

chapter 7 詳説Audio Session
chapter 4の続き。レイテンシーを操作したり、ボリューム操作やヘッドホン端子の抜き差しなどの動作に対応させたいときなど、アプリでやりたいことがchapter 4では足りない場合に読む。

chapter 8 AVFoundation 3.0
AVAudioSessionDelegateはiOS6.0よりdeprecatedとなっていますので注意。Audio SessionをObj-Cで置き換えようとしたけど途中で挫折してdeprecatedになっていく流れか。出来ることは少ない。少し本格的なことをやろうとするとAudio Sessionで書かないといけない所が出てくるので、いっそのことAVAudioSessionは使わずにAudio Sessionで統一するのも手。

chapter 9 Audio Unit
この章が一番ありがたい。

chapter 10 Audio Converter Services
〜Servicesというわりには処理のほとんどが自分でソースを書かなくてはいけない。ほとんどの人が、自分で書くのではなく始めから用意してあればいいんじゃないか、と思うでしょう。実際Extended Audio File Servicesというのがそれにあたる。

chapter 11 Extended Audio File Services
Audio Unitがメモリから読み出すサンプルで、左右のデータを入れてからポジションをインクリメントするところが、左を入れてインクリメントして、その後で右を入れているように見える。インクリメントは右を入れた後のほうがいい。また、AudioBufferListをmallocで確保しているがAudioBufferListの定義ではAudioBufferは1つ。ここでは用意された音源がモノラルのため辻褄があっている。しかしサンプルは、複数チャンネルに対応しているソースのように書かれているので危険かも。実際、sizeof(AudioBufferList)は16だった。
それからcurrentFrameがtotalFramesに達してからもう一回書き込んでいるけどこの一回は省いたほうがいいです。
データを転送する所はmemcpyでやったほうが速いかもしれない。まあ、わかりやすさのためにこのコードになっていると思います。

chapter 14 iPod Library Access
もともとAPIがよくできてることもあって、読んでいくのは楽です。〜.itemというのが複数出てきたりしてわかりずらいところはクラスの構造を図で表したほうがいいと思いました。この本とAppleが出しているサンプルでだいたいのことは網羅出来ると思います。

改訂する場合にはiOS Core Audioプログラミングに名前が変わるのでしょう。もしかしたらiOSもなくなっているかもしれない。

214ページからのAudioUnit正準系のマイナスの値についての説明に補足すると、
プラスの値は32ビット整数として見た時と、8.24として見た時の間に2^24倍の関係がなりたつ
マイナスの値を8.24で表記したものも、そのの関係がなりたつか?を検証する
例 -5.25
11111010.11000000‥
これを小数点を取って、+-表記付き32ビット整数として見てみると-88080384
これは-5.25 x 2^24 = -88080384に一致する


結局どういう順番で読めばいいか

1 アプリで音を出したい。
2へ

2 第2章AVFoundationを読む。
出来そうか?
はい→3へ
いいえ→4へ

3 第4章Audio Sessionの基礎を読む(設定をいろいろ操作したい場合は第7章も)
5へ

4 全部読む
5へ

5 アプリを作成する

コメント