AVFoundationAVAudioEngineを使って、.aiff.mp3を再生したいと思い、下記のサンプルコードを作ってみましたが、[player play]の直後に終了ハンドラーが呼ばれてしまい、音楽が再生されません。

  • AVFoundation.frameworkはリンクしています
  • App SandboxingOFFにしているため、ファイルアクセスは出来ているようです
  • ソース中のaiffURLを用いてNSSoundのインスタンスを作成し、playメソッドを実行すると再生されます
  • ソース中の2箇所のif (err)はどちらもnilで正常終了しているようです

お気づきの点がありましたらご指摘下さい。

#import "AppDelegate.h"
#import <AVFoundation/AVFoundation.h>

@implementation AppDelegate

- (void) applicationDidFinishLaunching:(NSNotification *)aNotification {
    NSURL *aiffURL = [NSURL fileURLWithPath:@"/Users/username/Music/1 06 I Was Born To Love You.mp3"];
    NSError *err;
    AVAudioFile *music = [[AVAudioFile alloc] initForReading:aiffURL error:&err];
    if (err) { NSLog(@"%@", err.debugDescription); }

    AVAudioEngine *engine = [[AVAudioEngine alloc] init];
    AVAudioPlayerNode *player = [[AVAudioPlayerNode alloc] init];
    [engine attachNode:player];
    [engine connect:player to:engine.mainMixerNode format:music.processingFormat];
    [engine prepare];
    [engine startAndReturnError:&err];
    if (err) { NSLog(@"%@", err.debugDescription); }

    [player scheduleFile:music atTime:nil completionHandler:^{
        NSLog(@"Play done");
    }];
    [player play];
}