2013-11-26 3 views
5

einmal durch abgespielten Ich bin ein wenig von diesem seltsamen Auftreten stapfte:AVAudioPlayer Anzahl der Schleifen nur Wirksam nach

Ich habe einen UIButton, die einmal angezapft setzt entweder eine Schleife für einen Audio-Player, oder es setzt zu 0 (keine Schleife). Hier wird das Verfahren -

-(void)changeLoopValueForPlay:(int)tag toValue:(bool)value{ 
    AVAudioPlayer *av = [self.playerArray objectAtIndex:tag]; 
    if(value){ 
     [av setNumberOfLoops:100]; 
     [av prepareToPlay]; 
    } 
    else{ 
     [av setNumberOfLoops:0]; 
    } 
} 

Jetzt aus irgendeinem Grund, wird die Schleife erst wirksam, nachdem der Spieler spielt über das Audio einmal, was bedeutet, dass der Looping Wert wird nicht sofort wirksam, aber die „numberOfLoops“ Der Wert des Spielers ist tatsächlich auf 100 eingestellt, wenn ich vor dem Spielen den Wert überprüfe. Ich gehe davon aus, dass dies etwas mit der Initialisierung oder dem Laden des Players zu tun hat, aber ich initialisiere es nicht zwischen diesen beiden Spielen (eins ohne Schleife, das andere mit). Irgendeine Idee, warum das passiert? Wenn Sie einen anderen Code sehen möchten, lassen Sie es mich wissen.

Antwort

1

Dies behebt das Problem, aber ich habe das Gefühl, dass es sich um eine Umgehungslösung anstelle einer direkten Lösung handelt. Was ich getan habe, ist, einen neuen AVAudioPlayer mit dem Wert numberOfLoops zu erstellen, den ich wollte, und diesen Player durch den vorhandenen Player zu ersetzen, anstatt den Wert des bereits vorhandenen Players zu ändern.

0

Ich umgehen das Problem, indem numberOfLoops zusammen aufgegeben und meine eigene Logik statt.

zuerst den Delegierten des AVAudioPlayer:

self.audioPlayer.delegate = self; 

Als nächstes implementieren -audioPlayerDidFinishPlaying:successfully: des Delegierten:

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer*)player successfully:(BOOL)flag 
{ 
    if(flag && <#(bool)i_want_to_repeat_playing#>) 
    { 
     [self.audioPlayer play]; 
    } 
} 

Ersetzen Sie einfach <#(bool)i_want_to_repeat_playing#> mit der gewünschten Logik, beispielsweise überprüfen, ob ein Zähler hat erreichte eine bestimmte Schwelle.