2012-01-06 14 views
1

私は、私が使用しているクリックボタンのサウンドを再生しようとしています:サウンドがxcodeで再生されていませんか?

-(IBAction)sound { 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Beat" ofType:@"wav"]; 
      AVAudioPlayer* theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; 
      theAudio.delegate = self; 
      [theAudio play]; 
} 

をと。

#import <AVFoundation/AVAudioPlayer.h> 

.hファイル。

- (IBAction) sound; 

私は何かを忘れていますか?

答えて

2

私はこれまでにこの問題を抱えていましたが、ARCが動作する新しい方法のために驚くほど欺瞞的です。

"sound"メソッド内でtheAudioを作成しました。ただし、このオブジェクトの存続期間は、メソッドが終了するまで持続します。したがって、ARCは音声を再生する機会がある前に、Audioを破壊します。

前ARCでこれをやっていたのであれば、サウンドは再生されますが、オーディオがリリースされないためにメモリリークが発生することがあります。コールバックが発生したときにそれを解放することもできますが、その種のメモリ管理の原則に違反するので、私はそれを立てません。

オーディオプレーヤーのグループを処理する/維持する「ミキサー」クラスが必要です。

+0

あなたの.hファイルでこれを試してみて、オーディオツールボックスをインポートすることを確認し、あなたは私を助け:) –

1

感謝の男

CFBundleRef mainBundle = CFBundleGetMainBundle(); 
CFURLRef soundFileURLRef; 
soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"H1", CFSTR("WAV"), NULL); 
if (soundFileURLRef){ 
CFStringRef url = CFURLGetString(soundFileURLRef); 
} 
UInt32 soundID; 
AudioServicesCreateSystemSoundID)soundFileURLRef, &soundID); 
AudioServicesPlaySystemSound(soundIB); 
+0

良いコードを!いくつかのタイプミスがありました。ここに固定コードがあります: CFBundleRef mainBundle = CFBundleGetMainBundle(); CFURLRef soundFileURLRef = CFBundleCopyResourceURL(mainBundle、(CFStringRef)@ "MySoundFile"、CFSTR( "aif")、NULL); UInt32 soundID; AudioServicesCreateSystemSoundID(soundFileURLRef、&soundID); AudioServicesPlaySystemSound(soundID); –

関連する問題