0

나는 Obj-c 초보자이며 간단한 iPhone 음악 앱을 만들려고 노력하고 있습니다. 기본적으로, 다른 버튼을 누르면 다른 소리가납니다. applicationMusicPlayer를 사용하여 iPod 라이브러리에서 노래를 재생할 수 있습니다. 여기 내 코드입니다 :Obj-C iPhone Music App Help

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]; 
} 

내가 다른 버튼에서 여러 소리를 재생하고 있기 때문에, 나는, 메모리를 관리하는 NSMutableDictionary를 사용하고 있습니다 내가 어떻게하는지 보여주는 버튼 사운드 메서드 중 하나를 게시했습니다.

문제는 1) handle_PlaybackStateChanged 있습니다 (ID) 통지가 나는 버튼을 클릭하면 2) 내 악기 사운드가 재생되지 않습니다 ... 플레이어가 일시 중지 될 때 호출 또는 노래가 완료되지 않는 ...

도움이됩니다. 감사합니다.

답변

0

나는 당신이 순서에 따라 관리 할 수 ​​있도록 wav 파일의 대기열을 생성해야한다고 생각합니다. 그렇지 않으면 서로 오버라이드합니다. 또한 위임 설정은 어디에 있습니까?