나는 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) 내 악기 사운드가 재생되지 않습니다 ... 플레이어가 일시 중지 될 때 호출 또는 노래가 완료되지 않는 ...
도움이됩니다. 감사합니다.