остановка AVAudioPlayer

вот мой код

 NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"95" ofType:@"wav"];

NSError *activationError = nil;
NSError *audioPlayerInitError = nil;
[[AVAudioSession sharedInstance] setActive: YES error:&activationError];

NSURL *newURL = [NSURL fileURLWithPath:soundFilePath];
musicPlayer1 = [[AVAudioPlayer alloc] initWithContentsOfURL:newURL error:&audioPlayerInitError];

if (musicPlayer1) {
    [musicPlayer1 stop];
    [musicPlayer1 release];
    musicPlayer1 = nil;
}
else {

    [musicPlayer1 prepareToPlay];
    [musicPlayer1 setVolume:.8];
    [musicPlayer1 setNumberOfLoops:-1]; // -1 means play indefintely
    [musicPlayer1 setDelegate: self];
    [musicPlayer1 play];
}

}

Пытаюсь запускать и останавливать AVAudioPlay одной и той же кнопкой (musicPlayer1 есть в шапке). Теперь, когда я нажимаю кнопку, ничего не воспроизводится. Помоги пожалуйста?


person luca590    schedule 01.04.2011    source источник


Ответы (1)


Вы каждый раз создаете новый экземпляр AVAudioPlayer. Вам нужно где-то удержать ссылку на объект и вернуться к нему. Добавьте поле в свой класс контроллера представления:

@private AVAudioPlayer *currentAudio;

А затем в этом методе внесите следующие изменения:

if (currentAudio) {
    [currentAudio stop];
    [currentAudio release];
    currentAudio = nil;
} else {
    // what you already have goes here
}
person Jonathan Grynspan    schedule 01.04.2011
comment
я предполагаю, что ты объявляешь @private в заголовке - person luca590; 01.04.2011
comment
Кроме того, у меня есть еще 8 из них, поэтому я должен реализовать еще 8 AVAudioPlayers или было бы более эффективно использовать один и тот же для всех 9 - person luca590; 01.04.2011
comment
Объем памяти, используемый 9 указателями, тривиален, поэтому не имеет значения, сколько у вас полей в классе. Однако если вы пытаетесь одновременно запустить 9 экземпляров AVAudioPlayer, каждый из них должен управляться отдельно. - person Jonathan Grynspan; 01.04.2011
comment
Когда я помещаю это в свой заголовок, я получаю ожидаемый идентификатор или (перед «частным» - person luca590; 01.04.2011
comment
Вы должны поместить его в раздел членов класса Objective-C. Между { и } после @interface SomethingOrOther. ;) - person Jonathan Grynspan; 01.04.2011
comment
ах да вау моя вина ха-ха. однако единственная проблема, когда я это делаю, заключается в том, что теперь, когда я нажимаю кнопку, она ничего не воспроизводит - person luca590; 02.04.2011
comment
Измените свой вопрос, чтобы показать весь метод. Я не могу психически отладить ваши проблемы. - person Jonathan Grynspan; 02.04.2011
comment
Я это понимаю, но это не решило проблему. Единственная разница между моим текущим кодом и моим предыдущим заключается в том, что я вставил ваш оператор if, добавил поле в свой заголовок и вынул указатель (AVAudioPlayer *musicPlayer, теперь он просто говорит musicPlayer) - person luca590; 02.04.2011
comment
Вы должны поместить строку [[AVAudioPlayer alloc] init... во вторую ветку. В противном случае он будет выполняться каждый раз, а затем вы вернетесь к исходной точке. - person Jonathan Grynspan; 04.04.2011