1

次のコードを使用してアプリでサウンドを再生しますが、問題はアプリの速度が低下することです。アクションを遅くすることなく、サウンドを非同期で発生させるにはどうすればよいですか?

SystemSoundID soundID;
NSString *soundFile = [[NSBundle mainBundle] pathForResource: _sound ofType:@ "wav"];
AudioServicesCreateSystemSoundID((__bridge CFURLRef) [NSURL fileURLWithPath:soundFile], &soundID);
AudioServicesPlaySystemSound(soundID);
4

1 に答える 1

1

アプリの初期化中に AudioServicesCreateSystemSoundID を実行するか、ユーザーが多少の遅延を予期/受け入れることができる他の時点で事前に実行します。バックグラウンドで実行できますが、終了するまでサウンドを再生できません。

AudioServicesPlaySystemSound はすでに非同期です。

つまり、早期に初期化を行う方法を示すには、appDidFinishLaunching が最も早い機会です。パブリック プロパティを使用して、アプリの他の部分でサウンドを利用できるようにします...

// AppDelegate.h, add this inside the @interface
@property (strong, nonatomic) NSArray *sounds;

// AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    NSMutableArray *tempSounds = [NSMutableArray array];

    SystemSoundID soundID0;
    // you need to initialize _sound0, _sound1, etc. as your resource names
    NSString *soundFile0 = [[NSBundle mainBundle] pathForResource: _sound0 ofType:@ "wav"];
    AudioServicesCreateSystemSoundID((__bridge CFURLRef) [NSURL fileURLWithPath:soundFile0], &soundID0);

    [tempSounds addObject:[NSNumber numberWithInt:soundID0]];

    SystemSoundID soundID1;
    NSString *soundFile1 = [[NSBundle mainBundle] pathForResource: _sound1 ofType:@ "wav"];
    AudioServicesCreateSystemSoundID((__bridge CFURLRef) [NSURL fileURLWithPath:soundFile1], &soundID1);

    // SystemSoundID is an int type, so we wrap it in an NSNumber to keep in the array
    [tempSounds addObject:[NSNumber numberWithInt:soundID1]];

    self.sounds = [NSArray arrayWithArray:tempSounds];

    // do anything else you do for app init here

    return YES;
}

次に、SomeViewController.m で ...

#import "AppDelegate.h"

// when you want to play a sound (the first one at index 0 in this e.g.)
NSArray *sounds = ((AppDelegate *)[[UIApplication sharedApplication] delegate]).sounds;

AudioServicesPlaySystemSound([sounds[0] intValue]);
于 2013-02-08T03:14:46.757 に答える