0

Je suis un débutant d'Obj-c, essayant de faire une application de musique iPhone simple. Fondamentalement, vous appuyez sur différents boutons et des sons différents sont joués. Vous pouvez lire une chanson de votre bibliothèque iPod en utilisant une applicationMusicPlayer. Voici mon code:Obj-C iPhone Music App Aide

MusicViewController.h

#import <UIKit/UIKit.h> 
#import <AVFoundation/AVFoundation.h> 
#import <MediaPlayer/MediaPlayer.h> 
#import "MusicAppDelegate.h" 

@interface MusicViewController : UIViewController 
<AVAudioPlayerDelegate, MPMediaPickerControllerDelegate> 
{ 
IBOutlet UIButton *play; 
MPMusicPlayerController *myPlayer; 
NSMutableDictionary *sounds; 
} 

@property (nonatomic, retain) MPMusicPlayerController *myPlayer; 

- (AVAudioPlayer *)playerForSoundFile:(NSString *)fileName; 
- (IBAction)playClick:(id)sender //to play the instrument sound 
- (IBAction)playSongClick:(id)sender //to pick a song from iPod library 
- (IBAction)playPauseClick:(id)sender //to pause or continue playing song from library 

@end 

MusicViewController.m

- (id)init 
{ 
    if (! (self == [super init])) 
     return nil; 

    sounds = [[NSMutableDictionary alloc] init]; 

    return self; 
} 
- (void)viewDidLoad { 
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 
[notificationCenter addObserver:self       selector:@selector(handle_PlaybackStateChanged:) 
          name:MPMusicPlayerControllerPlaybackStateDidChangeNotification object:self.myPlayer]; 

[self.myPlayer beginGeneratingPlaybackNotifications]; 
} 

- (IBAction)playClick:(id)sender 
{ 
AVAudioPlayer *theAudio = [self playerForSoundFile:@"Sound1"]; 
[theAudio play]; 
} 

- (IBAction)pickSongClick:(id)sender 
{ 
    MPMediaPickerController *picker = 
    [[MPMediaPickerController alloc] initWithMediaTypes: MPMediaTypeMusic]; 
    [picker setDelegate:self]; 
    [picker setAllowsPickingMultipleItems:NO]; 
    picker.prompt = 
    NSLocalizedString (@"Pick a song to play", "Prompt in media item picker"); 
    picker.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
    [self presentModalViewController: picker animated: YES];  

    [picker release]; 
} 

- (void)mediaPicker: (MPMediaPickerController *) picker 
didPickMediaItems: (MPMediaItemCollection *) mediaItemCollection { 
    myPlayer = [MPMusicPlayerController applicationMusicPlayer]; 
    [myPlayer setShuffleMode:MPMusicShuffleModeOff]; 
    [myPlayer setRepeatMode:MPMusicRepeatModeNone]; 
    [self dismissModalViewControllerAnimated: YES]; 
    [myPlayer stop]; 
    [myPlayer setQueueWithItemCollection: (MPMediaItemCollection *) mediaItemCollection]; 
    [myPlayer play]; 
    [playPause setImage:[UIImage imageNamed:@"pause.gif"] forState:UIControlStateNormal]; 
    NSError *setCategoryError = nil; 
    [[AVAudioSession sharedInstance] 
    setCategory: AVAudioSessionCategoryAmbient 
    error: &setCategoryError]; 

- (void) mediaPickerDidCancel: (MPMediaPickerController *) picker { 
    [self dismissModalViewControllerAnimated: YES]; 
} 

- (IBAction)playPauseClick:(id)sender 
{ 
    if (myPlayer.playbackState == MPMusicPlaybackStatePlaying) { 
     [myPlayer pause]; 
     [playPause setImage:[UIImage imageNamed:@"play.gif"] forState:UIControlStateNormal]; 
    } else if (myPlayer.playbackState == MPMusicPlaybackStatePaused) { 
     [myPlayer play]; 
     [playPause setImage:[UIImage imageNamed:@"pause.gif"] forState:UIControlStateNormal]; 
    } else { 
     [playPause setImage:[UIImage imageNamed:@"play.gif"] forState:UIControlStateNormal]; 
    } 
    NSError *setCategoryError = nil; 
    [[AVAudioSession sharedInstance] 
    setCategory: AVAudioSessionCategoryAmbient 
    error: &setCategoryError]; 
} 

- (void)handle_PlaybackStateChanged:(id)notification 
{ 
    if (myPlayer.playbackState == MPMusicPlaybackStatePaused) 
    { 
     [playPause setImage:[UIImage imageNamed:@"pause.gif"] forState:UIControlStateNormal]; 
    } 
    else 
    { 
     [playPause setImage:[UIImage imageNamed:@"play.gif"] forState:UIControlStateNormal]; 
    } 
} 
- (AVAudioPlayer *)playerForSoundFile:(NSString *)fileName 
{ 
    NSString *path; 
    AVAudioPlayer *player = [sounds objectForKey:fileName]; 

    if (! player) 
    { 
     path = [[NSBundle mainBundle] pathForResource:fileName ofType:@"wav"]; 
     AVAudioPlayer *theAudio=[[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL] autorelease]; 
     theAudio.delegate = self; 

     [sounds setObject:player forKey:fileName]; 

     NSError *setCategoryError = nil; 
     [[AVAudioSession sharedInstance] 
     setCategory: AVAudioSessionCategoryAmbient 
     error: &setCategoryError]; 
    } 

    return player; 
    [path release]; 

} 
- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] 
    removeObserver:self]; 
    [sounds release]; 
    [super dealloc]; 
} 

J'utilise un NSMutableDictionary pour gérer la mémoire, parce que je joue plusieurs sons de différents boutons, je posté juste l'une des méthodes de son bouton pour vous montrer comment je le fais.

Les problèmes sont 1) handle_PlaybackStateChanged: (id) notification n'est pas appelée lorsque le lecteur est en pause ou la chanson se termine ... 2) Mon son instrument ne joue pas lorsque je clique sur le bouton ...

Toute aide est utile, merci.

Répondre

0

Je crois que vous devez créer une file d'attente des fichiers wav à jouer, de sorte que vous pouvez gérer dans l'ordre, sinon ils se chevauchent, où est votre jeu de délégué?