Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sound on simulator but not device

I'm using the following to play an m4a file:

NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: fileName];
SystemSoundID soundID;
NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];
AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID);
AudioServicesPlaySystemSound(soundID);

It works fine on the simulator but I hear nothing on the device. Sounds files I'm using all stay in the bundle. Here is what filePath looks like from the device:

file://localhost/var/mobile/Applications/418945F3-3711-4B4D-BC65-0D78993C77FB/African%20Adventure.app/Switch%201.m4a

Is there an issue with the file path or any thing different I need to do for the device?

like image 255
user230949 Avatar asked Jan 06 '10 16:01

user230949


3 Answers

Just as a sidenote - I was having the exact same problem and spent probably close to an hour on converting files to the correct format, etc.. Yet the problem was the "mute" switch on the iPad. So even though the volume was up, and I could hear other sounds on the iPad, because the mute switch was turned on, it wasn't playing system sounds.

To add to the confusion, this app uses text-to-speech and the volume coming from the dictation was perfectly fine, it was only the sounds coming from AudioServicesPlaySystemSound() that weren't being played.

like image 129
TheJerkMan24 Avatar answered Oct 07 '22 09:10

TheJerkMan24


I had trouble with this too. Finally I realised it was because AudioServices can only play audio with the following constratints.

Sound files that you play using this function must be: - No longer than 30 seconds in duration - In linear PCM or IMA4 (IMA/ADPCM) format - Packaged in a .caf, .aif, or .wav file

From Apple docs: http://developer.apple.com/library/ios/#documentation/AudioToolbox/Reference/SystemSoundServicesReference/Reference/reference.html

like image 21
pchap10k Avatar answered Oct 07 '22 11:10

pchap10k


You might want to use the AVAudioPlayer instead of AudioServices.

The following code will take an audio file (.m4a) and play the audio file 1 time. Don't forget to release "audioPlayer" when you're done with it.

NSString *urlAddress = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"m4a"];

NSURL *url = [NSURL fileURLWithPath:urlAddress];
NSError *error;

AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
audioPlayer.numberOfLoops = 0;

if (audioPlayer == nil)
{
  NSLog([error description]);
}
else
{
  [audioPlayer play];
}

Hope this example helps you with playing audio on the actual device. It might also be a good idea to increase the device audio when the file is playing.

Note: You will need to add the AVFoundation framework to your project if you have not already done so. As well as import the header file.

#import <AVFoundation/AVFoundation.h>

Update:

From Apple's Core Audio Overview Document

Audio Session Services

Audio Session Services lets you manage audio sessions in your application—coordinating the audio behavior in your application with background applications on an iPhone or iPod touch. Audio Session Services consists of a subset of the functions, data types, and constants declared in the AudioServices.h header file in AudioToolbox.framework.

The AVAudioPlayer Class

The AVAudioPlayer class provides a simple Objective-C interface for playing sounds. If your application does not require stereo positioning or precise synchronization, and if you are not playing audio captured from a network stream, Apple recommends that you use this class for playback. This class is declared in the AVAudioPlayer.h header file in AVFoundation.framework.

like image 33
Tammen Bruccoleri Avatar answered Oct 07 '22 11:10

Tammen Bruccoleri