Справка Obj-C iPhone Music App - PullRequest
       23

Справка Obj-C iPhone Music App

0 голосов
/ 06 марта 2011

Я новичок в Obj-c, пытаюсь создать простое музыкальное приложение для iPhone.По сути, вы нажимаете несколько разных кнопок и воспроизводятся разные звуки.Вы можете воспроизвести песню из вашей библиотеки iPod, используя приложение MusicPlayer.Вот мой код:

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) Звук моего инструмента не воспроизводится, когда я нажимаю кнопку ...

Любая помощь полезна, спасибо.

1 Ответ

0 голосов
/ 06 марта 2011

Я считаю, что вам нужно создать Очередь файлов wav для воспроизведения, чтобы вы могли управлять по порядку, в противном случае они переопределяют друг друга, а также где установлен делегат?

...