iPhone/OS3.0 Bluetooth機能調査まとめ

iPhoneのBluetooth機能でどの程度の事が可能なのか、今日調べてみました。結論から言うと、結構制限されている事が分かりました。仕組みとしては、3.0になって、幾分か拡張されたのだけど、実はかなり制限されていて、直接Bluetoothのデバイスを触れないようになっているようです。

出来ること:
- iPhone同士のアドホックなセッション確率と通信(GameKit API)
- Bluetooth ヘッドホンの利用(自動的に見つける)
- Bluetoothを使ったオーディオストリームのやり取り(この辺詳しくは未調査)
- サードパーティ アクセサリとのBluetoothによる通信(アクセサリデベロッパー契約が必要)

iPhone的には、Bluetooth機能の戦略としては、ExternalAccessary APIというのがあって、それが使えるようになると、直接Bluetoothを触れるようになるんだけども、逆に言うと、それに触れないと、上でリストアップした以外のBluetoothの使い方は出来ない、ということらしい。

MacやPCに気軽に繋げさせちゃうと勝手モデム用のアプリとかボコボコ作られちゃうから、この辺はキャリアに遠慮してApple側でコントロール可能にした、というところだろうか。そのうち、iPhoneをモデム代わりに使う機能を許可するキャリアが過半数に到達したら、徐々に解放して行くとか、そういう計画なのかもしれない。

MacOSプログラミング/Linear PCM以外のAudioStreamBasicDescriptionの値の取り方

AudioStreamBasicDescriptionの各種パラメータについては、リニアPCMを使用する場合のサンプルや解説はたくさんあるのですが、mp3やaac, m4aなどを扱う際の適切なパラメータは、あまりどこかに書いてあるという訳でもない様です。これらを扱いたい場合、どうしたもんかと思ったのですが、Audio APIから直に取得、設定させる事ができることが分かりました。

方法としては、AudioFormatGetPropertyで、kAudioFormatProperty_FormatInfo プロパティを取得すればOKです。以下にコードを示します。

AudioStreamBasicDescription outputFormat;
UInt32 size; 
// need to set at least these fields for kAudioFormatProperty_FormatInfo
outputFormat.mFormatID = formatID; // kAudioFormat* の値
outputFormat.mSampleRate = inputFormat.mSampleRate;
outputFormat.mChannelsPerFrame = inputFormat.mChannelsPerFrame;

// use AudioFormat API to fill out the rest.
size = sizeof(outputFormat);
err = AudioFormatGetProperty(kAudioFormatProperty_FormatInfo, 0, NULL, &size, &outputFormat);


これで、outputFormatの設定済みの3フィールド以外に、適切な値が設定されます。

最も、この調査は私にとっては完全な徒労でした。これを調べた動機は、MovieAudioExtraction API やAudioConverter API でPCM以外の形式で出力する事だったのですが、どうも出力形式はPCMしかサポートしていないようです。
よくよくマニュアルを読んでみると、「PCMでの出力を可能にします」とはっきり書いてありました。とほほ・・・。

参照:
- Using the Audio Extraction API in QuickTime 7

MacOSプログラミング/相対パス→フルパスへの変換

CocoaのNSStringで相対パス("~hoge/fuga.txt")から絶対パス("/Users/hoge/fuga.txt")への変換をする方法が分からなかったので調べました。
ヘルプで"fullpath"等入れてもそれっぽいのがないし、NSFileManagerにもそれらしいメソッドがないので、戸惑いましたが、ちゃんとNSStringにありました。

NSString stringByExpandingTildeInPath

がそれに当たります。そのもの直訳で"チルダ(~)を展開した文字列を返す"です。
分かりやすいと言えばもの凄く分かりやすいが・・・フルパス(fullpath)という表現はMac OS内でも使用されているので、出来ればこの辺は統一して頂けると助かると思ったり。

FSPathMakeRefなどのCoreFoundationの関数はフルパスを必要とする物があるので、そうした場合に利用することになります。

MacOSプログラミング/MacOSプログラミングカテゴリ

MacOS X および iPhone でのプログラミングを行った際に詰まった事を中心に記事を書きます。
主に自分向けの備忘録ですが誰かの助けになればと思います。