2016-09-12 8 views
1

私はSpriteKitを使用してMacアプリケーションを作成しました。 AVAudioUnitSamplerのサンプラー・インストゥルメントは何らかの理由でロードされなくなりました。この問題は、私がヨセミテからエルキャピタンに自分のシステムをアップデートしてからのことです。私はヨセミテを走っていたので、コードに触れていません。私の展開ターゲットはまだYosemiteですが、私はEl Capに変更しましたがクラッシュします。何か案は?エルキャピタンでサンプラーをロードできない

ここでスタックトレースです:

MIDIController.h

#import <AVFoundation/AVFoundation.h> 
#import <Foundation/Foundation.h> 

@interface MIDIController : NSObject 

@property NSMutableArray *notes; 
@property NSMutableArray *keyboard; 
@property CFStringRef endpointName; 

@property AVAudioUnitSampler *sampler; 

-(int)uniqueNotesPlayed; 
-(void) loadSampler; 
-(void) unloadSampler; 
@end 

MIDIController.m

2016-09-12 10:59:01.134 Playground[66431:1254259] removed 
2016-09-12 10:59:03.747 Playground[66431:1254301] sampler loaded 
2016-09-12 10:59:03.848 Playground[66431:1254285] 10:59:03.848 ERROR: 93: BankEntry::LoadInstrument: Unable to find patch 0 bank 0x78/0 
2016-09-12 10:59:03.848 Playground[66431:1254285] 10:59:03.848 ERROR: 486: DLS/SF2 bank load failed 
2016-09-12 10:59:03.859 Playground[66431:1254285] 10:59:03.859 ERROR: AVAudioUnitSampler.mm:163: -[AVAudioUnitSampler loadSoundBankInstrumentAtURL:program:bankMSB:bankLSB:error:]: error -10851 
2016-09-12 10:59:03.861 Playground[66431:1254285] An uncaught exception was raised 
2016-09-12 10:59:03.861 Playground[66431:1254285] error -10851 
2016-09-12 10:59:03.861 Playground[66431:1254285] (
    0 CoreFoundation      0x00007fff946594f2 __exceptionPreprocess + 178 
    1 libobjc.A.dylib      0x00007fff9c4da73c objc_exception_throw + 48 
    2 CoreFoundation      0x00007fff9465e1ca +[NSException raise:format:arguments:] + 106 
    3 libAVFAudio.dylib     0x00007fff9b29ce13 _Z19AVAE_RaiseExceptionP8NSStringz + 176 
    4 libAVFAudio.dylib     0x00007fff9b2d5dae -[AVAudioUnitSampler loadSoundBankInstrumentAtURL:program:bankMSB:bankLSB:error:] + 317 
    5 Playground       0x0000000100017800 __41-[MIDIController loadSoundFontInstrument]_block_invoke + 96 
    6 libdispatch.dylib     0x00000001003a1070 _dispatch_call_block_and_release + 12 
    7 libdispatch.dylib     0x0000000100393cc5 _dispatch_client_callout + 8 
    8 libdispatch.dylib     0x0000000100398457 _dispatch_root_queue_drain + 2934 
    9 libdispatch.dylib     0x00000001003978a5 _dispatch_worker_thread3 + 106 
    10 libsystem_pthread.dylib    0x00000001003f6336 _pthread_wqthread + 1129 
    11 libsystem_pthread.dylib    0x00000001003f3f91 start_wqthread + 13 
) 

2016-09-12 10:59:03.861 Playground[66431:1254285] *** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'error -10851' 
*** First throw call stack: 
(
    0 CoreFoundation      0x00007fff946594f2 __exceptionPreprocess + 178 
    1 libobjc.A.dylib      0x00007fff9c4da73c objc_exception_throw + 48 
    2 CoreFoundation      0x00007fff9465e1ca +[NSException raise:format:arguments:] + 106 
    3 libAVFAudio.dylib     0x00007fff9b29ce13 _Z19AVAE_RaiseExceptionP8NSStringz + 176 
    4 libAVFAudio.dylib     0x00007fff9b2d5dae -[AVAudioUnitSampler loadSoundBankInstrumentAtURL:program:bankMSB:bankLSB:error:] + 317 
    5 Playground       0x0000000100017800 __41-[MIDIController loadSoundFontInstrument]_block_invoke + 96 
    6 libdispatch.dylib     0x00000001003a1070 _dispatch_call_block_and_release + 12 
    7 libdispatch.dylib     0x0000000100393cc5 _dispatch_client_callout + 8 
    8 libdispatch.dylib     0x0000000100398457 _dispatch_root_queue_drain + 2934 
    9 libdispatch.dylib     0x00000001003978a5 _dispatch_worker_thread3 + 106 
    10 libsystem_pthread.dylib    0x00000001003f6336 _pthread_wqthread + 1129 
    11 libsystem_pthread.dylib    0x00000001003f3f91 start_wqthread + 13 
) 

libc++abi.dylib: terminating with uncaught exception of type NSException 

ここで私はサンプラーをロードするコードです

... 

-(void) loadSampler { 
    // Instatiate audio engine 
    _engine = [[AVAudioEngine alloc] init]; 
    _mixer = [_engine mainMixerNode]; 
    _sampler = [[AVAudioUnitSampler alloc] init]; 

    [self loadSoundFontInstrument]; 

    [self makeEngineConnections]; 
    [self startEngine]; 
} 

-(void) loadSoundFontInstrument { 
    if (_sampler != nil) { 
     NSString *instrument = [[GameData sharedGameData].settings valueForKey:@"instrument"]; 
     NSURL *piano = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:instrument ofType:@"sf2"]]; 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
      [_sampler loadSoundBankInstrumentAtURL:piano program:0 bankMSB:0x79 bankLSB:0 error:nil]; 
     }); 
    } 
    else 
     NSLog(@"ERROR: Sampler has not been initialized"); 
} 
... 
+1

「パッチ0バンク0x78/0を見つけることができません」のため、 'loadSoundBankInstrumentAtURL'が' kAudioUnitErr_InvalidPropertyValue'を報告しています。たぶん、ピアノのサウンドフォントファイルがelcapで有効とは思われないのでしょうか?興味のない、メインのディスパッチキューにロードすることはできますか?または 'dispatch_async'を使わないで? –

+0

うーん...サウンドフォントはかなり古い標準ですか?私は言わなければならない、あなたは天才だ。私は 'dispatch_async'の' _sampler'の作成を取りました!それがどんなアイデアですか?何らかの人種条件? – 02fentym

+0

どこから呼ばれても問題はありません。 –

答えて

1

答えはkAudioUnitErr_InvalidPropertyValueを報告しているコメント

loadSoundBankInstrumentAtURLから移行したため、 "パッチ0、バンク0x78と/ 0を見つけることができません"。たぶん、ピアノのサウンドフォントファイルがelcapで有効とは思われないのでしょうか?

興味のある方は、メインディスパッチキューに読み込めますか?またはdispatch_asyncがないと

複数のスレッドから呼び出し可能であることは難しい要求です(そして誰も実際にはAVAudioUnitSamplerはスレッドセーフであると主張していましたか?)、それがあなたの不幸の原因であったとしても私は驚かないでしょう。

関連する問題