2013-11-26 6 views
5

मैं एक छोटे से इस अजीब घटना द्वारा स्टम्प्ड रहा हूँ के माध्यम से खेला जा रहा के बाद से लागू होने वाली:AVAudioPlayer कई लूप के केवल एक बार

मैं एक UIButton, जो एक बार उपयोग किया या तो एक ऑडियो प्लेयर के लिए एक पाश सेट है, या यह रीसेट करता है 0 तक (कोई लूप नहीं)। यहाँ विधि है -

-(void)changeLoopValueForPlay:(int)tag toValue:(bool)value{ 
    AVAudioPlayer *av = [self.playerArray objectAtIndex:tag]; 
    if(value){ 
     [av setNumberOfLoops:100]; 
     [av prepareToPlay]; 
    } 
    else{ 
     [av setNumberOfLoops:0]; 
    } 
} 
अब किसी कारण से

, पाश केवल तभी प्रभावी होगी खिलाड़ी के बाद ऑडियो एक समय के माध्यम से खेलता है, जिसका अर्थ है कि पाशन मूल्य तुरंत प्रभावित नहीं ले करता है, लेकिन "numberOfLoops" जब खिलाड़ी खेलना शुरू कर देता है तो खिलाड़ी का मूल्य वास्तव में 100 पर सेट होता है। मुझे लगता है कि इस खिलाड़ी के प्रारंभिकरण या लोडिंग के साथ कुछ करने के लिए है, लेकिन मैं इसे दो नाटकों के बीच फिर से शुरू नहीं करता (एक लूप के बिना, दूसरा)। कुछ पता है कि ऐसा क्यों हो रहा है? यदि आप कोई अन्य कोड देखना चाहते हैं तो कृपया मुझे बताएं।

उत्तर

1

यह समस्या ठीक हुई, हालांकि मुझे लगता है कि यह प्रत्यक्ष समाधान के बजाय एक कार्य-आसपास है। मैंने जो किया है वह सिर्फ एक नया AVAudioPlayer है जो नंबरऑफ्लूप्स वैल्यू के साथ सेट है जो मैं चाहता हूं और मौजूदा खिलाड़ी के साथ उस खिलाड़ी को मौजूदा प्लेयर के मूल्य को बदलने के बजाय प्रतिस्थापित करें।

0

मैं numberOfLoops को पूरी तरह से छोड़कर और अपना खुद का तर्क छोड़कर इस मुद्दे को हल करता हूं। ,

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

बस, अपने वांछित तर्क के साथ <#(bool)i_want_to_repeat_playing#> की जगह जैसे जाँच करता है, तो एक काउंटर है:

self.audioPlayer.delegate = self; 

इसके बाद, प्रतिनिधि के -audioPlayerDidFinishPlaying:successfully: लागू:

पहले, AVAudioPlayer के प्रतिनिधि सेट एक निश्चित दहलीज तक पहुंच गया।

संबंधित मुद्दे