Звуки AVAudioPlayer перестают играть после многих IBActions - PullRequest
0 голосов
/ 02 июня 2011

У меня есть простое интерактивное приложение с 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 Ответ

2 голосов
/ 02 июня 2011

Странно, что у вас не возникает утечек, когда вы снова и снова запускаете пузыри.

Любым способом:

Если вы воспроизводите звуковые эффекты коротких кнопок, лучше попробуйте использовать " 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];
}

Не забудьте издать звуки.

...