0

AVAudioPlayer を使用してサウンドを再生しようとしています。単純なはずですが、奇妙な結果がいくつか見られます。

コード:

NSString *path = [[NSBundle mainBundle] pathForResource:@"pop" ofType:@"wav"];
NSURL *url = [NSURL fileURLWithPath:path];
AVAudioPlayer *sound = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[sound play];
[sound release];

私が見ているのは、アプリを通常に使用するとサウンドが再生されないということです。

デバッガーを使用してコードをステップスルーする場合にのみ再生され、他の方法で実行すると再生されません...

アプリ内で新しいスレッドや実行ループを作成していないため、これはすべてメインスレッドで実行されている必要があり、少なくとも[NSThread isMainThread]true を返します。

ここで何が起こっているのか、誰にもアイデアがありますか?

4

2 に答える 2

4

AVAudioPlayer のplayメソッドは非同期なので、サウンドの再生を開始してすぐにリリースします。そのため、デバッガーでステップ実行すると機能します。終了する前に再生する時間を与えています。あなたがしたいことは、AVAudioPlayerDelegate の -(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flagメソッドを実装し、サウンドの再生が完了した後にオーディオ プレーヤーを解放することです。

于 2009-12-19T04:53:52.403 に答える
0

パパジョンは正しいです、あなたはこのようにすべきです

のようなオーディオプレーヤーのクラスレベル変数を持っています

AVAudioPlayer *classLevelPlayer;

このオブジェクトを合成します。そしてプレーヤーメソッドへの呼び出しで

-(void)playTheSong{

if(classLevelPlayer!=nil){
[classLevelPlayer stop];
[self setClassLevelPlayer:nil];
}

NSString *path = [[NSBundle mainBundle] pathForResource:@"pop" ofType:@"wav"];
NSURL *url = [NSURL fileURLWithPath:path];

AVAudioPlayer *sound = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];

if(sound){
[self setClassLevelPlayer:sound];
[classLevelPlayer play];
}
[sound release];
}

そして

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
 [self setClassLevelPlayer:nil];
}

お役に立てれば。

于 2009-12-19T07:11:36.147 に答える