Attention! Translated article might be found on my English blog.

2016年7月7日木曜日

AudioFile, AudioConverter関連の関数をメインスレッド以外で実行させてみた。

前回の記事AudioToolboxを使ってMP3やAACなどのnon-LPCMをLPCMデータに変換するの続きです。
メインスレッド以外で実行できるか試してみました。
main()の中だけ修正し、他はいじりませんでした。
main()のコードは以下の通りです。

int main(int argc, char* argv[]) {
    if (argc != 3) {
        printf("usage: ./Mp3Decoder inFile outFile\n");
        return 0;
    }
    
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            OSStatus err = DecodeFileAtPath(argv[1], argv[2]);
            printf("done. err:%d\n", err);
    });
    
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    
    return 0;
}
参考: apply.c - Dispatch_Samples - Apple Developer
参考: エキスパートObjective-Cプログラミング -iOS/OS Xのメモリ管理とマルチスレッド- - Amazon

実行した結果、サブスレッドでも正常動作することを確認できました。
(ただし、Cocoaアプリ内のサブスレッドでも正常動作することを裏付けるものではないと思います)

Objc-CやSwiftを使っているならNSOperationを使うほうが楽そうですね。

あー、あとGrand Central Dispatch(GCD)関連のドキュメントを漁っていて、
Apple公式の"Introducing Blocks and Grand Central Dispatch"が入手できなかったのは
非常に残念&腹立たしかったです。