10

I can't figure out how to play a music file in an iPhone game.

Im creating a Game and I am trying to figure out how to play music whenever the app is launched.

I tried this:

- (void)awakeFromNib {

    NSString *path = [[NSBundle mainBundle] pathForResource:@"musicamenu" ofType:@"mp3"];

    AVAudioPlayer *theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];

    [theAudio play];


}
rmaddy
  • 314,917
  • 42
  • 532
  • 579
user2444410
  • 111
  • 1
  • 1
  • 5
  • you may want to look at this previous question. http://stackoverflow.com/questions/1296786/how-do-i-programmatically-play-an-mp3-on-an-iphone – dotToString Jun 02 '13 at 03:32

3 Answers3

30

This is how you do it. In your v1AppDelegate.h file add

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>

@interface v1AppDelegate : UIResponder <UIApplicationDelegate>
{
    AVAudioPlayer *myAudioPlayer;
}

@property (nonatomic, retain) AVAudioPlayer *myAudioPlayer;

@property (strong, nonatomic) UIWindow *window;

@end

Now in your v1AppDelegate.m file add this

#import "v1AppDelegate.h"
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>

@implementation v1AppDelegate

@synthesize window = _window;

@synthesize myAudioPlayer;


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    //start a background sound
    NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"Soothing_Music2_Long" ofType: @"mp3"];
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath ];    
    myAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
    myAudioPlayer.numberOfLoops = -1; //infinite loop
    [myAudioPlayer play];


    // Override point for customization after application launch.
    return YES;
}

If you wish to stop or start this music from anywhere else in your code then simply add this

#import "v1AppDelegate.h"    
- (IBAction)stopMusic
    {
        v1AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
        [appDelegate.myAudioPlayer stop];
    }


    - (IBAction)startMusic
    {
        v1AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
        [appDelegate.myAudioPlayer play];
    }
Jagat Dave
  • 1,643
  • 3
  • 23
  • 30
Sam B
  • 27,273
  • 15
  • 84
  • 121
2

I recommend to add the play music method in applicationDidBecomeActive: method. Because you want the music played every time the app is launched. Note you should hold a reference to the player. Else the music will not be played.

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    // Play music on another queue so that the main queue is not blocked.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self playMusic];
    });
}

- (void)playMusic
{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"done" ofType:@"mp3"];
    NSError *error = nil;
    NSURL *url = [NSURL fileURLWithPath:path];
    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
    [self.player play];
}
sunkehappy
  • 8,970
  • 5
  • 44
  • 65
2

For Swift 3.1 :

Use this two imports :

import AVFoundation
import AudioToolbox

Create a reference for your AVAudioPlayer :

private var mAudioPlayer : AVAudioPlayer?

Use this function for play a sound you are storing in your app :

func onTapSound(){
        let soundFile = Bundle.main.path(forResource: "slap_placeholder.wav", ofType: nil)
        let url = URL(fileURLWithPath: soundFile!)
        self.mAudioPlayer = try! AVAudioPlayer(contentsOf: url as URL)
        self.mAudioPlayer?.play()
}
Kevin ABRIOUX
  • 16,507
  • 12
  • 93
  • 99