спиране на 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
Когато поставя това в заглавката си, получавам очакван идентификатор или ( преди „private“ - 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