What do you use to play sound in iPhone games?


What do you use to play sound in iPhone games?



I have a performance-intensive iPhone game I would like to add sounds to. There seem to be about three main choices: (1) AVAudioPlayer, (2) Audio Queues and (3) OpenAL. I’d hate to write pages of low-level code just to play a sample, so that I would like to use AVAudioPlayer. The problem is that it seems to kill the performace – I’ve done a simple measuring using CFAbsoluteTimeGetCurrent and the play message seems to take somewhere from 9 to 30 ms to finish. That’s quite miserable, considering that 25 ms == 40 fps.

Of course there is the prepareToPlay method that should speed things up. That’s why I wrote a simple class that keeps several AVAudioPlayers at its disposal, prepares them beforehand and then plays the sample using the prepared player. No cigar, still it takes the ~20 ms I mentioned above.

Such performance is unusable for games, so what do you use to play sounds with a decent performance on iPhone? Am I doing something wrong with the AVAudioPlayer? Do you play sounds with Audio Queues? (I’ve written something akin to AVAudioPlayer before 2.2 came out and I would love to spare that experience.) Do you use OpenAL? If yes, is there a simple way to play sounds with OpenAL, or do you have to write pages of code?


Update: Yes, playing sounds with OpenAL is fairly simple.





MS Access 2003 + linked tables to SQL Server 2005 + Windows Authentication = slow

1:



Cross DB stored procedures performance in SQL Server 2008
AVAudioPlayer is very marginal for game audio.


Websphere Application Server - What on earth will it take to start any fast?
Tackling AudioQueue or OpenAL by adapting one of the examples is definitely the way to go.


SQL Efficiency: WHERE IN Subquery vs. JOIN then GROUP
latency is much more controllable that way..
Performance creating multiple small files


JavaScript “classes”


Java Performance - ArrayLists versus Arrays for lots of fast reads

2:



in which situations does it make sense to create only an lighteight CALayer rather than a fat UIView?
If you're calling play on the main thread, try running it on a separate thread.

What I ended up doing is:.
#include <dispatch/dispatch.h>  dispatch_queue_t playQueue = dispatch_queue_create("com.example.playqueue", NULL);  AVAudioPlayer* player = ... 

dispatch_async(playQueue, ^{ [player play]; });
which fixed the worst of the framerate stuttering I was experiencing..


3:


I use OpenAL and the classes that came with the CrashLanding sample code.

It's worked fine so far to play samples and play looped music all at the same time.

I'm currently learning how to release the memory I've allocated for a sound (.wav file) when, for example, I want to play some intro music just once..


4:


Use CocosDenshion – it’s free, easy, and works.

It wraps AVAudioPlayer for background tracks and OpenAL for sounds..


5:


Do you want to check the buffering with the implementation you're using? It might be somehow related to the 20ms delay you're experiencing.

i.e., try to play around with the buffer size..



76 out of 100 based on 66 user ratings 466 reviews