JJgendarme
JJgendarme

Reputation: 1401

Iphone SDK: sound problems

i've created a drum app. As of now, the app's kinda satisfying but not great.

The problem is a strange delay or "lag" that sometimes happens when i press my sound buttons. When i spam a button it begins to freeze, when unfreezed again, it plays the same sound stacked on itself about 4 times :(

What am i doing wrong?

Are my samples bad?

Should i use an imageView and touchesBegan to simulate the buttons?

This is the code that i use to play a sound when a button is pushed:

- (IBAction) HHC {

    NSString *path = [[NSBundle mainBundle] pathForResource:@"HHClosed"ofType:@"wav"];

    SystemSoundID soundID;

    AudioServicesCreateSystemSoundID((CFURLRef) [NSURL fileURLWithPath:path], &soundID);

    AudioServicesPlaySystemSound (soundID);

}

Please give me some good advice :)

Thanks in advance

-DD

Upvotes: 0

Views: 233

Answers (3)

hotpaw2
hotpaw2

Reputation: 70703

For low latency sound appropriate for a drum app, you will want to use the RemoteIO Audio Unit API, which is not simple. You will need to know how to handle, buffer and mix PCM sound samples. Start by reading a book on digital audio technology.

Upvotes: 1

shabbirv
shabbirv

Reputation: 9098

Try doing this and see if it makes your performance better.

In your .h file declare this:

SystemSoundID soundID;

In your .m file in the -viewDidLoad method add this code:

  -(void) viewDidLoad {
    NSString *path = [[NSBundle mainBundle] pathForResource:@"HHClosed"ofType:@"wav"];
    AudioServicesCreateSystemSoundID((CFURLRef) [NSURL fileURLWithPath:path], &soundID);
}

And in the method you showed just keep this one line of code:

- (IBAction) HHC {
    AudioServicesPlaySystemSound (soundID);
}

Let me know if that makes the freezing going away. If it doesn't try Core Audio

Upvotes: 1

lxt
lxt

Reputation: 31304

Every time you hit the button you are loading the sound file from the filesystem, bringing it into memory, and then playing it.

This is very inefficient. Your audio samples should already be loaded in memory at launch, so they don't need to be read in from the filesystem. Also, AudioServicesPlaySystemSound isn't really designed for this kind of usage - its main purpose is playing back short alert sounds (ie, a system alert). If you need low-latency audio playback you should be looking at the Core Audio framework instead.

Upvotes: 1

Related Questions