2011-06-18 5 views
6

böyle AVAudioPlayer kullanarak bir ses oynar nispeten basit uygulaması var Defalarca Çal olmazAVAudioPlayer

[player3 play]; 

Ama Bu ses, birçok yerde (bir sıçrayan top ile çarpışmalar), birçok kez çağrılır. Bazen, top, topun ikinci kez çarpışması durumunda, ilk sıçramadan gelen sesin hala oynandığı hızlı bir şekilde arka arkaya iki şeye çarpmaktadır. Bu ikinci sıçrama o zaman ses üretmez. Çalmakta olan bir sesin üstesinden gelen bir sesin ödemesini gerektirse bile, her çarpıştığında nasıl bir ses çalmasını sağlayabilirim?

Her türlü yardım büyük beğeni topluyor.

if([player3 isPlaying]) { 
    AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[player3 url]]; 
    [newPlayer setDelegate:self]; 
    [newPlayer play]; 
} 

Sonra temsilci yönteminde audioPlayerDidFinishPlaying:successfully: yılında, sen oyuncuya -release mesaj göndermek olmalıdır: Bu sorunu çözmek için

cevap

3

bir yolu öncekinin zaten oynuyor eğer AVAudioPlayer yeni bir örneğini oluşturmak olmaya olur :

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag { 
    if(player != player3) { 
     [player release]; 
    } 
} 

budur, çünkü her eşzamanlı ses oynatmak için yeni bir kaynak tampona ihtiyaç gibi, olmak zorunda sadece yoludur. :(

0

Bu eski iplik ama belki birisi bu cevap yararlanabilir. AVAudioPlayer defalarca uygulama için yük olabilir ve gecikme yaratır oluşturuluyor. Bu durumda SystemSound kullanabilirsiniz.

NSString *pathToMySound = [[NSBundle mainBundle] pathForResource:@"yourMusic" ofType:@"mp3"]; 
SystemSoundID soundID; 
AudioServicesCreateSystemSoundID((__bridge CFURLRef)([NSURL fileURLWithPath: pathToMySound]), &soundID); 
AudioServicesPlaySystemSound(soundID); 

Bu çözümün dezavantajı, sesi ayarlayamazsınız