月別アーカイブ: 2009年2月

スペルミス

「SPRIT」じゃなくて「SPLIT」だよとご指摘いただきました。英語が苦手なのが思いっきり露呈してしまいましたねえ。Appleさんはスペルチェックはしてくれないようです。

すでに修正版は提出してますが、反映されるまでには数日かかると思います。いままでの経験からすると金曜(20日)じゃないでしょうか。一週間さらしものになるわけですね、お恥ずかしい。

さらにもうひとつの経験からすると、一ヶ月以上アップデートしない人っていうのも少なからずいるので、実質的なさらしもの期間はもっと長いんでしょうね。

時差

iTunes Connect上でのリリース日を、アプリのアップデートが公開された日に設定すると、AppStore上のリリース日もアップデートされた日に更新されるというのは開発者のみなさんなら周知の事実だと思います。ですが、今日2月14日にReady for saleが来た!と思って2月14日に設定したら、アメリカの人からUSのストアにアプリが無いよってメールが来ました。

日本やその他いくつかの国を見てもちゃんとあるのに、USに無いのはどうしてだろうと考えてみたら、アメリカはまだ2月13日だったんですね。自分の場合、審査がおわってReady for saleがくるのは日本時間の午前中なので、一つ前の日に設定するように気をつけなくちゃいけないなと思いました。

ところで、エリカさんの「iPhone デベロッパーズ クックブック」が届きました。先行発売されているのを立ち読みしたときから思っていたのですが、オーディオに関してはAudioUnitもOpenALもまったく触れられていないのが残念でした。いや、触れられていないどころか、全く存在しないような書き方です。逆に、Celestialっていう非公式のAPIを説明していたりして、かなりハックよりの内容ですね。

それより、AppleのiPhone用日本語ドキュメントにCore AudioとCore Animationに関する4つが追加されているようです。少なくともオーディオに関してはエリカ本は決して参考にせず、公式ドキュメントを参考にすることをお進めします。

Big StopWatch v2.0

Big StopWatchのバージョン2.0が公開されました。

今回の追加・変更点は、

・ラップ/スプリット機能の追加
・5秒前からのカウントダウン機能の追加
・ポートレイト表示の追加
・パフォーマンスの向上
・設定のSnapの名称をPower savingに変更

になります。

ただ、アップデートしても、そのままでは、リセットのときにアニメーションするようになったなぁ、としか思わないかもしれません。ラップやカウントダウンを使うには、設定アプリ内で「Advanced Mode」をオンにする必要があります。ポートレイトも設定アプリ内で設定できます。

ラップタイムの表示とかって、きっとみなさんが思っているのとは違う実装の仕方なんだろうなぁと思いますが、このアプリではこんな感じじゃないでしょうか。ふつうにリスト表示すると、なんというか壊れるので。まあ、Core Animation的な動きをOpenGLでやってみたかったってだけです。

Advanced Modeにするとデジタル時間の表示が60分でリセットされず、いつまでも計ることが出来ます。一応100年たっても大丈夫なはずです。ただ、1000時間を超えると10分の1秒までしか表示できません。

Snapは結局、Power savingにしちゃいました。動きを変えるのが目的ではなく、バッテリー消費を押さえるのが一番の目的なので。

このアプリは今後、バグフィックス以外でアップデートすることは無いと思います。タイマーの要望はいただくのですが、OSに常駐できないタイマーはなにかあると発動しなくなるので、作らないという判断をしています。

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

今回は、iPhoneオーディオのIOバッファサイズについてです。とりあえず、前回までのコードに、以下のようなsetIOBufferSizeメソッドを追加して、initにその呼び出しを加えてください。

- (void)setIOBufferSize
{
    Float64 sampleRate;
    UInt32 size = sizeof(sampleRate);
    AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareSampleRate, &size, &sampleRate);
    
    Float32 bufferSize = 256./sampleRate;
    size = sizeof(bufferSize);
    AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, size, &bufferSize);
}
- (id) init
{
    self = [super init];
    if (self != nil) {
        [self setupAudioSession];
        [self setIOBufferSize];
        [self setupOutputUnit];
    }
    return self;
}

前回までのコードのコールバック内は、フレーム数に応じてサイン波の周波数がかわるようになっていましたので、変更を加えないときより高い音が再生されると思います。bufferSizeの256の所がバッファサイズのフレーム数ですので、そこを変更すれば任意のフレーム数に設定できます。コールバック内にprintfとかでinNumberFramesをログに出すようにすれば、ちゃんと変わっているのが分かると思います。

IOバッファサイズは秒数で指定しますので、今回のコードではハードウェアのサンプリング周波数を取得して、目的のフレーム数を割って値を求めています。プロパティの名前にPreferredってついているので指定した秒数の近いところに設定されるという感じでしょうか。Appleのサンプルでは、256に変更するときにちょっと少なめの0.005秒を指定していました。

ちなみにAudioSessionのプロパティのゲットは、AudioSessionがアクティブになっていないと出来ないようです。セットはいつでも大丈夫みたいです。Appleのサンプルをみると、プロパティをセットして、AudioSessionをアクティブにして、プロパティをゲットするというのがセオリーっぽいです。

IOバッファサイズはデフォルトの状態では1024フレームです。ロックしてスリープすると強制的に4096フレームになります。ただしOS 3.0では、今回のサンプルのようにAudioSessionSetPropertyでIOバッファサイズを一度設定すると、ロックしてもIOバッファサイズが変わらなくなったようです。また、カテゴリをPlayAndRecordなどにするだけでも変わりません。