В приложении iPhone нет звука после нажатия кнопки «Домой» - PullRequest
1 голос
/ 11 декабря 2011

Мои звуки отлично работают в симуляторе, но когда я запускаю приложение на своем телефоне, звуки перестают работать после того, как я нажму кнопку «Домой» и вернусь в приложение. Это в IOS5. Как я могу решить это? Вещи делегатов для AVAudioPlayer, кажется, тоже останавливаются. Приложение не падает.

NSString *path = [[NSBundle mainBundle]
    pathForResource:@"Beep01" ofType:@"wav"];
clickSound =[[AVAudioPlayer alloc] initWithContentsOfURL:
    [NSURL fileURLWithPath:path] error:NULL];
clickSound.delegate = self;
[clickSound prepareToPlay];

А потом я играю с помощью [clickSound play];

Ответы [ 2 ]

3 голосов
/ 11 декабря 2011

Убедитесь, что у вас есть

#import <AVFoundation/AVFoundation.h>

в заголовке.Тогда в вашем AppDelegate вы должны иметь следующие методы:

- (AVAudioPlayer *) getSound: (NSString *) soundName {  
@try {              
    AVAudioPlayer *sound = [[self getDictionary] objectForKey: soundName];      
    if (!sound) {           
        NSError *error;
        NSString *path = [[NSBundle mainBundle] pathForResource: soundName ofType: nil];             
        sound = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath: path] 
                                                       error: &error];             
        if (!sound) {
            //NSLog(@"ERROR: Wrong sound format: %@. Description: %@",  soundName,  [error localizedDescription]);
        } else {
            sound.volume = 0.7;
            //int len = sound.duration;
            [[self getDictionary] setObject: sound forKey: soundName];
            // NSLog(@"%@ loaded, duration: %i sec", soundName, len);
            [sound release];
        }    
    } 
    return sound;
} 
@catch (id theException) {
    NSLog(@"ERROR: %@ not found!", soundName);
} 
return nil;

}

- (NSMutableDictionary *) getDictionary {
if (!dictionary) { //Hashtable
    dictionary = [[NSMutableDictionary alloc] init]; 
    NSLog(@"new Dictionary");
}
return dictionary;
}
- (void) playSound: (NSString *) soundName {
AVAudioPlayer *sound = [self getSound: soundName];
if (sound) {   
    sound.currentTime = 0;        
    if (!sound.playing) {
        sound.numberOfLoops = 0;
        [sound play];
    }    
} 
}

- (void) stopSound: (NSString *) soundName {
AVAudioPlayer *sound = [self getSound: soundName];
if (sound && sound.playing) {           
    [sound stop];         
} 
}

В вашем AppDelegateDidFinishLaunching вы предварительно загрузите все звуки, которые будете использовать:

//pre-Load sounds
[self getSound: @"testSong.wav"];

В вашем - (void) методе play {}иметь

    YourAppDel *appDel = [UIApplication sharedApplication].delegate;
    [appDel playSound:@"testSong.wav"];

наслаждайтесь

1 голос
/ 15 декабря 2011

Когда ваше приложение переходит в фоновый режим (или гаснет будильник, или телефон принимает вызов, или экран блокируется), аудиосеанс вашего приложения прерывается и ваш аудиоплеер приостанавливается. Рекомендуемый способ справиться с этим прерыванием - внедрить AVAudioPlayerDelegate методы – audioPlayerBeginInterruption: и -audioPlayerEndInterruption: в делегате вашего аудиоплеера. Из документации Apple :

- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player {
    if (playing) {
        playing = NO;
        interruptedOnPlayback = YES;
        [self updateUserInterface];
    }
}

- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player {
    if (interruptedOnPlayback) {
        [player prepareToPlay];
        [player play];
        playing = YES;
        interruptedOnPlayback = NO;
    }
}

Обратите внимание, что когда вызывается -audioPlayerEndInterruption:, вы снова отправляете -prepareToPlay в свой экземпляр аудиоплеера. Вполне возможно, что если вы не позвоните так после прерывания, ваш аудио сеанс не будет перезапущен для вас, что произведет именно тот эффект, который вы описали выше - загадочно мертвый звук.

...