カテゴリー別アーカイブ: Core Audio – iOS

iPhone OS 3.0のオーディオ周りの変更点

OS3.0がでてからもう結構時間が経ってますが、オーディオ周りの挙動に変更があったところをまとめておきます。 ロック時に音が途切れない AudioUnitのRemoteIOを使っている場合、AudioSessionのPreferredHardwareIOBufferDurationを何も設定せずデフォルト状態のままだと、以前と変わらずロックしていないときは1024フレーム、ロック中は4096フレームと切り替わってしまいますが、一度値を設定しておくと、ロックしても設定した値そのままで切り替わらなくなったようです。 RemoteIOのデフォルトフォーマットが変更 OS2.2.1以... read more

AudioUnit MultiChannelMixerを使う

いままでiPhoneのAudioUnitはRemoteIOしか使っていなくて、新規アプリ開発に向けてMixerのUnitを使ってみようと思ったら、なかなかうまくいかなくてハマってしまったのでメモしておきます。 以下が、MultiChannelMixerの初期化のコードになります。 - (void)setupMixerUnit:(AudioUnit *)fMixerUnit busCount:(NSUInteger)fBusCount {     AudioComponent component;     ... read more

AudioSession その3 IOバッファサイズ

今回は、iPhoneオーディオのIOバッファサイズについてです。とりあえず、前回までのコードに、以下のようなsetIOBufferSizeメソッドを追加して、initにその呼び出しを加えてください。 - (void)setIOBufferSize {     Float64 sampleRate;     UInt32 size = sizeof(sampleRate);     AudioSessionGetProperty(kAudioSessionProperty... read more

AudioSession その2 AudioCategory

iPhoneのアプリでオーディオを再生・録音する場合に、iPodの音楽を鳴らしたままミックスして出したり、ロックした時にも音を出せるようにするには、AudioSessionSetProperty関数を使ってAudioCategoryというのを設定します。 AudioSessionSetPropertyはこんな感じで宣言されています。 extern OSStatus AudioSessionSetProperty(AudioSessionPropertyID inID,           ... read more

AudioSession その1 Interruption

以前、RemoteIOでのオーディオ再生というエントリでRemoteIOでオーディオ再生をする方法を書きましたが、それだけだとiPhoneのアプリとしては設定が不足です。オーディオを扱うアプリでは、AudioSessionというAPIを使って、オーディオに関する情報の取得や設定を行います。SystemSoundServiceなんかのお手軽再生系では無用の様ですが、AudioUnitを使う場合には必須といえるでしょう。 ちなみに、AudioSession系の関数はシミュレータではエラーが出て一切受け付けてくれず、実機にしか効果が及びません。また、デフォルトのオーディオIOのバッファサイズは... read more

iPod touchのInterruption Callback

iPhoneでアラームとか通話とかが割り込んできてアプリのオーディオが停止してしまうときの通知を受け取るにはAudioSessionでInterruption Callbackを登録するって感じなのですが、サンプルソースなどは以下のようなコードになってまして… void rioInterruptionListener(void *inUserData, UInt32 inInterruption) { AudioUnit *remoteIO = (AudioUnit*)inUserData; if (inInterruption == kAudioSessi... read more

OpenGLとRemoteIOとiPod 2Gでのノイズの件

※このエントリの内容を修正しました。 放置するといっていたiPod touch第2世代のノイズですが、どうやらOpenGLのViewをWindow全体に貼付けるようにしておけば入らないようです。 と思って一度書いたのですが、関係ありませんでした。AudioSessionのkAudioSessionProperty_PreferredHardwareIOBufferDurationの値を小さくする事で解決できそうな感じです。たぶんビューあたりをいじってノイズが消えたと思っていたのはたまたまだったのだと思います。どちらにしろ、OpenGL使わなければノイズは入らないんですけどねぇ。 ... read more

修正とiPod 2Gでの不具合

Touch the Waveの波形表示が再生位置とちょっとずれていたので、修正したものをApp Storeに提出してあります。何も無ければ2〜3日後くらいには公開されるんじゃないでしょうか。 それはそれとして、音質向上のための修正をしていたらv0.5をiPod touch第2世代で使っているとノイズがプチプチと入っている事が判明してしまいました。v0.4ではCore Animationを使っている事で数秒間の動作停止が起きることがあって、それを修正するためにv0.5ではOpenGLに変更したんですけど、どうやらそっちも相性が悪かったようです。 別に特別な処理をしているからという訳ではな... read more

さっそくAVAudioPlayerを使ってみた

iPhone OSが2.2にアップデートされまして、Frameworkに新しくAVFoundationなんてものが追加されていました。今のところAVAudioPlayerというAPIしか無いようですが、AVと名がついているだけに今後映像がらみでも機能が増えそうな気がします。 そのAVAudioPlayerを早速試してみたところ、お手軽BGM再生APIという感じのようです。オーディオファイルのパスを渡してやるだけでWAV、AIFF、mp3、AAC、ロスレスあたりはいとも簡単に再生できます。これがあればやたらめんどくさいAudio Queue Serviceなんていりません。 ということで... read more

RemoteIOでのオーディオ再生

iPhone用のアプリも公開できて一段落つきまして、さらにNDAも緩和されたという事で、iPhoneのオーディオプログラミングネタを書いていきたいと思います。 iPhoneで音を再生する方法はいくつかあります。短いサンプルを再生するならSystemSoundService。BGMで使うような長い曲を再生するならAudioQueueService。レイテンシーを低く再生するならAudioUnit。あと、OpenALを使うという手もあります。 「Touch the Wave」で使っているのはAudioUnitです。SystemSoundは短すぎて役に立ちませんし、AudioQueueでは... read more