50105


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

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

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

[code]

    #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];
    }
    
[/code]


CC BY-SA 4.0
2018-11-08T13:48:45.703
50103
2018-11-08T15:06:49.200
14745
question
objective-c macos
AVAudioEngineでaiffの再生が出来ない


AudioEngineのインスタンスがメソッドを抜けた時点で解放されるからでしょう。

各メソッドでエラーは起こってないようなので、他の部分に間違いはなさそうです。

例えば次のように`engine`変数をインスタンス変数などにして、メソッドを抜けてもインスタンスが保持されるようにすれば、再生が継続すると思います。

[code]

    @interface AppDelegate ()
    @property (nonatomic) AVAudioEngine *engine;
    @end
    ...
    
    
    AVAudioEngine *engine = [[AVAudioEngine alloc] init];
    ...
    self.engine = engine;
    
[/code]


CC BY-SA 4.0
2018-11-08T15:06:49.200
50105
2018-11-08T15:06:49.200
5519
50103
answer