Hatena::ブログ(Diary)

Over&Out その後 このページをアンテナに追加 RSSフィード Twitter

2013-02-23

Audio Unitのコールバック関数を登録する方法3種の比較

Audio Unit で、コールバック関数を登録するための方法が何通りかあって、何だかややこしかったので整理してみました。


AudioUnitSetProperty

まず一番基本的なものである AudioUnitSetProperty から。

AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = renderCallback;
callbackStruct.inputProcRefCon = &audioDataInfo;
AudioUnitSetProperty(hogeUnit,             // 対象となるAudio Unit
                     kAudioUnitProperty_SetRenderCallback,
                     kAudioUnitScope_Input,     // スコープ
                     0,                         // バスナンバー
                     &callbackStruct,           // AURenderCallBackStruct構造体へのポインタ
                     sizeof(callbackStruct)     // AURenderCallBackStruct構造体のサイズ
                     );

AudioUnitSetProperty は Audio Unit に対して各種プロパティをセットするための関数です。ここでは {対象となるAudio Unit}{スコープ}{バスナンバー} に対して kAudioUnitProperty_SetRenderCallback というプロパティに AURenderCallBackStruct 型の値を指定しています。


引数は多いですが、そのぶん暗黙的な部分がなくてわかりやすいです。


AUGraphSetNodeInputCallback

こちらは AUGraph の特定のノードの入力に対してコールバック関数を指定するための関数。

AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = renderCallback;
callbackStruct.inputProcRefCon = &audioDataInfo;
AUGraphSetNodeInputCallback(processingGraph,    // 対象となるAUGraph
                            hogeNode,      // 対象となるAUNode
                            0,                  // バスナンバー
                            &callbackStruct     // AURenderCallBackStruct構造体へのポインタ
                            );

暗黙的にスコープは kAudioUnitScope_Input、構造体のサイズは AURenderCallBackStruct のサイズなので、AudioUnitSetProperty と比較するとこれら2つ分の引数が省略されています。


AUGraphAddRenderNotify

こちらは AUGraph がレンダリングを行った際に通知を受けるコールバック関数を登録するための関数。

AUGraphAddRenderNotify(processingGraph,
                       renderCallback,
                       (__bridge void *)(self));

これを使用した場合、AUGraph の最後、たとえば Remote IO Unit でスピーカー出力している場合は、その出力時に通知を受け、コールバックが呼ばれるようになります。


AURenderCallbackStruct 構造体を介さず直接コールバック関数と、コールバック関数で参照するデータ(inputProcRefCon にセットしていたもの)を渡します。



2013-02-21

ダウンロード可能な Audio Unit 関連のサンプルコード11個

Audio Unit は、iOS の Core Audio においてもっとも低レベル(ハードウェアより)に位置するフレームワークです。そのため低レイテンシを要求されるオーディオ処理機能を提供するアプリに向いています。


というのがよく言われる Audio Unit のメリットなのですが、個人的には Audio Unit の「ユニットをつなげて複雑なオーディオ処理を実現する」というしくみ(AUGraph)がまるでギターのエフェクターをつないで音をつくる感じに似ていて、そのあたりも興味深いポイントとなっています。


ただ API は全部 C ベースだし、音を再生するだけでも(AVAudioPlayer 等と比較すると)複雑だったりするので、まずは参考になるサンプルをいろいろと集めてみました。

  • どの Audio Unit を使用しているか(kAudioUnitSubType_xxxx で判断)
  • どういうサンプルか
  • 最終更新はいつか

の観点からまとめています。


使用ユニットの項目で、そのユニットを使用しているサンプルが他にない場合は、貴重なサンプルである、という意味をこめて太字にしています。


  • (2013.2.22追記情報)実際に参考にしつつ実装してみてわかったことなどを追記。
  • (2013.2.23追記情報)DrumMachine を追加。

iPhoneMultichannelMixerTest

【使用ユニット】

  • Remote IO (kAudioUnitSubType_RemoteIO)
  • Multi Channel Mixer (kAudioUnitSubType_MultiChannelMixer)

【サンプル概要】

on/offとボリュームをチャンネル毎に変えられる、2チャンネルのミキサー


f:id:shu223:20130220235308p:image:w240


オーディオファイルの再生と、複数チャンネルを扱いたい場合に参考になります。


(2013.2.22追記)PublicUtilityという、Appleが配布しているCore Audioのユーティリティクラスに依存しており、これを参考に自分のアプリを作ろうとするとこのユーティリティクラスまわりが若干面倒なことになります。(プリプロセッサマクロにDEBUGを定義していると別のユーティリティクラスを持ってこないとビルド通らないとか、このサンプルに付属しているコードと、別途Appleが配布しているものとバージョンが違っていたりとか。)


【最終更新日】

2010-07-07


Audio Mixer (MixerHost)

【使用ユニット】

  • Remote IO (kAudioUnitSubType_RemoteIO)
  • Multi Channel Mixer (kAudioUnitSubType_MultiChannelMixer)

【サンプル概要】

on/offとボリュームをチャンネル毎に変えられる、2チャンネルのミキサー。


f:id:shu223:20130220171932p:image:w240


サンプルの機能としては、上の "iPhoneMultichannelMixerTest" とまったく同じに見えるのですが、なぜこの2つが存在するのでしょうか。。


こっちは、そのままビルドするとエラーになるので、xibをちょっといじる必要があります。


(2013.2.22追記)こちらのサンプルは、"iPhoneMultichannelMixerTest" と違いPublicUtilityに依存していないので、とりあえずマルチチャンネル再生の参考にするならこっちの方がミニマルでわかりやすいかと思います。


【最終更新日】

2010-07-27


AVCaptureAudioDataOutput To AudioUnit iOS

【使用ユニット】

  • Delay (kAudioUnitSubType_Delay)
  • Converter (kAudioUnitSubType_AUConverter)

【サンプル概要】

AVFoundation の AVCapture で録音した音声に、Audio Unit でディレイエフェクトをかけ、ExtAudioFile でファイル出力するサンプル。


f:id:shu223:20130220171439p:image:w240


Audio Unit の Delay Unit を取り扱っているのは今回紹介する中では唯一、という点だけでも貴重なサンプルですが、AVCaptureSession の captureOutput:didOutputSampleBuffer:fromConnection: で取得した波形データを Audio Unit に渡してエフェクトをかける方法、Audio Unit から ExtAudioFileWriteAsync でファイル出力する方法、どっちも重要なので、見た目は地味ですがコードはとても参考になるサンプルとなっています。


【最終更新日】

2012-10-08


DrumMachine

【使用ユニット】

  • Sampler (kAudioUnitSubType_Sampler)
  • Remote IO (kAudioUnitSubType_RemoteIO)

【サンプル概要】

Sampler Unit を使用した TR909(ドラムマシン)的なサンプルアプリ。4つの音をタイムライン上でon/offすることでリズムを作る。


f:id:shu223:20130223092258p:image:w480


ちなみに作者は Core Audio本の著者である永野さん。


【最終更新日】

2013-02-23


Sampler Unit Presets (LoadPresetDemo)

【使用ユニット】

  • Sampler (kAudioUnitSubType_Sampler)
  • Remote IO (kAudioUnitSubType_RemoteIO)

【サンプル概要】

楽器を切り替えるボタンと、Low, Mid, High の音を鳴らすボタンをもつサンプラー


f:id:shu223:20130220172310p:image:w240


Sampler Unit を使用するものは他にもありますが、AUPreset ファイル(拡張子.aupreset)なるものを使用する点では唯一のサンプルです。(中身見たけどどういう調整をするものなのかよくわかりませんでした。DJとかやる人はピンとくるのかも。)


【最終更新日】

2011-10-12


Reverb

iOS5プログラミングブックのサンプル。ダウンロードURLは書籍をご参照ください。


【使用ユニット】

  • Remote IO (kAudioUnitSubType_RemoteIO)
  • Converter (kAudioUnitSubType_AUConverter)
  • Reverb2 (kAudioUnitSubType_Reverb2)
  • Multi Channel Mixer (kAudioUnitSubType_MultiChannelMixer)

【サンプル概要】

マイクから入力された音声にリバーブをかけるサンプル。


f:id:shu223:20130220172311p:image:w240


唯一の Reverb2 のサンプル。マイク入力、エフェクト、マルチチャネルミキサーと、Audio Unit の基本が学べて、リバーブのパラメータをいろいろいじれて楽しい好サンプルです。


書籍の方も、AUGraph や AUNode の概念から、ひとつひとつのユニットの解説まで、わかりやすい図入りで説明されているので激しくおすすめです。


iOS5プログラミングブック
加藤 寛人 吉田 悠一 藤川 宏之 西方 夏子 関川 雄介 高丘 知央
インプレスジャパン
売り上げランキング: 88968



audioGraph

【使用ユニット】

  • Remote IO (kAudioUnitSubType_RemoteIO)
  • Multi Channel Mixer (kAudioUnitSubType_MultiChannelMixer)
  • Low Pass Filter (kAudioUnitSubType_LowPassFilter)
  • High Pass Filter (kAudioUnitSubType_HighPassFilter)
  • Audio File Player (kAudioUnitSubType_AudioFilePlayer)
  • Sampler (kAudioUnitSubType_Sampler)

【サンプル概要】

マイク入力とかシンセ音とかファイルからの音とかをマルチチャネル再生しつつ、エフェクトをかけられる。ステレオレベルメータつき。


f:id:shu223:20130220235309p:image:w240


Audio Unit のもろもろ詰め合わせといった感じです。エフェクトはリングモジュレータやピッチシフターも実装されています。


(2013.2.22追記)いろんな機能が入ってるのですごく参考になりそうですが、いかんせんコードが汚いです。1ファイル4000行とかあって、コードの見通しも悪く、参考にするにも結構骨が折れます。(ただしコメントは多い)


【最終更新日】

2013-01-20


iPhoneMixerEQGraphTest

【使用ユニット】

  • Remote IO (kAudioUnitSubType_RemoteIO)
  • iPod EQ (kAudioUnitSubType_AUiPodEQ)
  • Multi Channel Mixer (kAudioUnitSubType_MultiChannelMixer)

【サンプル概要】

iPod のイコライザー効果をかけるサンプル。(グラフィックイコライザーではなく、プリセットから選択する)


f:id:shu223:20130220172312p:image:w240


【最終更新日】

2010-06-25


aurioTouch2

【使用ユニット】

  • Remote IO (kAudioUnitSubType_RemoteIO)

【サンプル概要】

マイク入力の波形を描画するサンプル。通常の時系列での波形表示の他、周波数ドメイン(FFTを使用)表示、ソノグラム表示もあり。


f:id:shu223:20130220172313p:image:w420


Audio Unit の使用は Remote IO による入出力のみ。FFT には Accelerate フレームワークの vDSP が、波形やソノグラムの描画には OpenGL が使用されています。


【最終更新日】

2011-12-06


iPhone Core Audioプログラミング

※ Audio Unit のサンプルが多数あるので、これだけ例外的に書籍名をタイトルにしました。サンプルコードのダウンロードURLは書籍をご参照ください。


【サンプル概要】

各項目毎にサンプルが用意されているので、目次を載せておきます。

  • Audio Unitの概要
  • Audio Component とAudio Unit
  • Audio Unit 正準形
  • サイン波を再生する
  • 周波数を変更する
  • Examole -加速度センサーテルミンー
  • Audio Unit Processina Graoh Services
  • MultiChannel Mixer Unit
  • 3D Mixer Unit
  • Converter Unit
  • iPod Equalizer Unit
  • マイクのモニタリング
  • Remote IOを使って録音する
  • レコーデイングレベルを調整する
  • Voice Processing IO Unit

【使用ユニット】

たくさんあるので全ては確認できていませんが、iOS3.x時代にあったユニットは全部入っていると思われます。(多くのユニットがiOS5で追加されましたが、iOS5登場以前の本なのでそれらについては載っていません)


iPhone Core Audioプログラミング
永野 哲久
ソフトバンククリエイティブ
売り上げランキング: 28453



RemoteIO

※iPhone SDK アプリケーション開発ガイドのサンプル。サンプルコードのダウンロードURLは書籍をご参照ください。


【サンプル概要】

Remote IOでサイン波を鳴らすサンプル。書籍の Audio Unit の章は Core Audio 本の著者永野さんが書いているので、Core Audio本のChapter09のサンプルと同様と思われます。

Core Audio本は絶版になっていて中古で高値がついてしまってますが、こっちはまだ普通に買えるようです。


iPhone SDK アプリケーション開発ガイド
Jonathan Zdziarski
オライリージャパン
売り上げランキング: 28500



Audio Unitの参考資料



2013-02-14

はじめて英語でSkype面接受けたメモ

いまスペインのバルセロナにおります。


今回は就職活動が目的ではないのですが、LinkedInでバルセロナにオフィスがある会社のiOSアプリ開発者の求人を見つけたので、申し込んでみました。


で、初めて海外の会社のSkype面接を受けたので、そのメモを残しておきます。


※なぜスペインにいるの?というあたりの経緯はこちらをご参照ください


経緯

冒頭にさらっと書きましたが、Skype面接を受けるまでの経緯は

  • LinkedInで3件ほど「バルセロナの会社で、かつiOS開発者を募集している」求人を見つけて、申し込む
  • うち1件は速攻で返信がきて落ちる
  • 数時間後もう1件の担当者からメールがあり、スカイプ面接の打診を受ける
  • すぐに提示された日程の中で一番早い時間を指定してOKの返信をする

という感じです。申し込み〜実際の面接まで30時間ぐらい。ちなみにもう1件は今のところ返信がありません。


自分の英語力

こちらの記事で書かれているところの、レベル3ぐらいです。「技術ブログや技術書も頑張れば読める」けど、英語でプレゼンするとか、講演を聞くとかは無理。飛行機や空港の機内放送も全然聴き取れません。


最近英語でメールのやりとりをする機会がたびたびあり(たとえば今回のSkype面接の件とか)、以前は30分かかって書いていた返信を、10分ぐらいで書けるようにはなりましたが、まだまだリアルタイムで英語が出てくるにはほど遠い感じです。


準備したこと

下記事項については、言いたいことを英文にしておきました。自己紹介は言葉に出して練習もしました。

  • 自己紹介
  • 志望理由
  • いつから来れるか?
  • 自分の作品(アプリ)の紹介

本番!!

指定の時間の5分前にSkypeの連絡先追加のリクエストがあり、時間ぴったりにCallが来ました。


で、結果的には、自己紹介すらする機会もなく、「"working permit"(就労ビザ)はあるか?」「ありません」というでいきなり「おお、それは厳しいね」という話になってしまい、5分ちょいで面接は終了


英語力の観点からの反省

自己紹介もできない、たった5分のわずかな時間でしたが、自分の英語力の低さを痛感するには十分でした。


まず、5単語ぐらいまでの短い文なら聴き取れるものの、相手がちゃんと話し出すとまったく聴き取れません


で、「ちょっと待ってください」「もうちょっとゆっくり話してください」とか、そういう言葉がパッと出てこないのでそのまま聞いちゃったりして、さらに「今の質問はこういうことでしょうか」といった言葉も出てこず、憶測で(志望動機かな・・・?)と思って用意してあった志望動機を話してみたら相手が「・・・・・・・・(テンション下がった感じで)OK, (話題が変わる)」となって違ったっぽかったりして痛々しかったです。


Speaking力はListening力にも繋がるのだなぁと。


Working Permitの話は、実は以前にメールのやりとりでそういう話があったので、詳細はやはり聴き取れないものの、「あ、就労ビザがないから厳しい、という展開か」ということは予測したうえで理解することができました。やはり相手の話への相づち的な言葉が出てこずThank you Thank youばっかり言ってましたが。。(←相手が申し訳なさそうに話してるので、ご配慮ありがとうございます、なニュアンスで言ってるつもり)


今後の海外就職に関する展望

以前にイギリスの会社で働いている方を紹介していただいてメールのやりとりをしたときも、最初に就労ビザの話になって終了、ということがありました。アメリカのビザが厳しいという話もよく聞くので、EU圏やアメリカでの就職に関していえば、英語力の問題を克服できたとしても、ずっと今回のように就労ビザの壁はついてまわりそうです。


ただ、そもそも自分にとっての海外就職は、「いろんな場所でいろんな人と仕事したい」という目的があって、そのための修行としてちゃんと一度は海外の会社に就職した方がいいだろう、という順番なので、まずはこのクソ過ぎる英語力をなんとかすれば本来の目的には近づけるのかもしれません。


たとえば、最近知り合った方の話で「海外の友人と組んでサービスを作っていて、海外のファンドからオファーを受けた、アメリカにオフィスを持つことも打診された」という話を聞きました。ものづくりに精を出していたら海外に行くことになった、というのはクリエイターとしては一番理想的な展開のように思います。(この方は海外に行きたくてそうしてたわけではありませんが。)



何はともあれ英語がなんとかなればもっと人生楽しくなりそうなので、なんとかしようと思います。



2009 | 08 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2018 | 02 |