经过如此多的IBActions后,AVAudioPlayer声音停止播放

时间:2011-06-02 15:27:05

标签: objective-c xcode ipad avaudioplayer

我有一个简单的交互式应用程序,包含10个IBActions,每个都与动画和声音相关联。在多次敲击之后,声音停止工作(虽然在音乐按钮的情况下它会继续播放,但没有其他声音可以工作,但一旦关闭所有声音停止)但动画和其他一切运行良好。这是很多水龙头...但是经过几分钟的互动,即。大约50次点击这种情况。

我看到仪器没有泄漏......一切看起来都很好,它只是停止工作?

任何想法可能会发生什么?

我正在使用带代码的AVAudioPlayer框架

AVAudioPlayer *bubblesound;

-(IBAction) getBubbles:(id)sender {

    NSString *bubblesgoblip = [[NSBundle mainBundle] pathForResource:@"boingy1" ofType:@"mp3"];

    bubblesound = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:bubblesgoblip] error:NULL];

    [bubblesound play];  }             

-(void)dealloc {
  [bubblesound release];


}

1 个答案:

答案 0 :(得分:2)

很奇怪,当你一次又一次地发起起泡时,你不会泄漏。

任何方式:

如果您正在使用短按钮音效,最好尝试使用“ SystemSoundID ”而不是AVAudioPlayer。这就是苹果推荐的。

<强> Etited apple有一个很好的例子,包括这个文件 -

.h文件

#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioServices.h>

@interface SoundEffect : NSObject {
    SystemSoundID _soundID;
}

+ (id)soundEffectWithContentsOfFile:(NSString *)aPath;
- (id)initWithContentsOfFile:(NSString *)path;
- (void)play;

@end

.m文件

#import "SoundEffect.h"

@implementation SoundEffect
+ (id)soundEffectWithContentsOfFile:(NSString *)aPath {
    if (aPath) {
        return [[[SoundEffect alloc] initWithContentsOfFile:aPath] autorelease];
    }
    return nil;
}

- (id)initWithContentsOfFile:(NSString *)path {
    self = [super init];

    if (self != nil) {
        NSURL *aFileURL = [NSURL fileURLWithPath:path isDirectory:NO];

        if (aFileURL != nil)  {
            SystemSoundID aSoundID;
            OSStatus error = AudioServicesCreateSystemSoundID((CFURLRef)aFileURL, &aSoundID);

            if (error == kAudioServicesNoError) { // success
                _soundID = aSoundID;
            } else {
                NSLog(@"Error %ld loading sound at path: %@", error, path);
                [self release], self = nil;
            }
        } else {
            NSLog(@"NSURL is nil for path: %@", path);
            [self release], self = nil;
        }
    }
    return self;
}

-(void)dealloc {
    AudioServicesDisposeSystemSoundID(_soundID);
    [super dealloc];
}

-(void)play {
    AudioServicesPlaySystemSound(_soundID);
}

@end

现在您可以在视图中准备好声音了吗?

   NSBundle *mainBundle = [NSBundle mainBundle];
        sound1 = [[SoundEffect alloc] initWithContentsOfFile:[mainBundle pathForResource:@"doorloop1" ofType:@"caf"]];
        sound2 = [[SoundEffect alloc] initWithContentsOfFile:[mainBundle pathForResource:@"doorloop1" ofType:@"caf"]];

最后在你的行动中

-(IBAction) getBubbles:(id)sender {
    [sound1 play];
}

不要忘记释放声音。