RiyasMd
RiyasMd

Reputation: 35

Objective C protocol method is not called

I have created singleton class for AVAudioPlayer. I am able to call the methods in the class and everything works fine. When the song finishes,the method (void)audioPlayerDidFinishPlaying is called which in turn suppose to call the method ' processSuccessful' in my downloadPlay.m class. But, it is not calling the method 'processSuccessful'

My codes as follows

PlayerManager.h 

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

@protocol ProcessDataDelegate <NSObject>
@required
- (void) processSuccessful;
@end

@interface PlayerManager : NSObject<AVAudioPlayerDelegate,AVAudioSessionDelegate>
{
 id <ProcessDataDelegate> delegate;
}
+ (PlayerManager *)sharedAudioPlayer;
@property (nonatomic,assign) id <ProcessDataDelegate>delegate;
@property (nonatomic, strong) AVAudioPlayer* player;
-(void)preparesong:(NSURL *)url;
-(void)stopsong;
-(void)pause;
-(void)playsong;
-(void)prepareToPlay;
-(BOOL)isPlaying;
-(BOOL)isPlayerExist;
@end

PlayerManager.m

#import "PlayerManager.h"

@interface PlayerManager()
@end

@implementation PlayerManager
@synthesize player;
@synthesize delegate;

static PlayerManager *sharedAudioPlayer = nil;
+ (PlayerManager *)sharedAudioPlayer {
    static PlayerManager *sharedAudioPlayer = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedAudioPlayer = [[self alloc] init];
    });
    return sharedAudioPlayer   ;
}

- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags
{

    if (flags & AVAudioSessionInterruptionOptionShouldResume)
    {
    [self.player play];

    }
}
- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player
{

}
#pragma mark - AVAudioPlayerDelegate
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    [[self delegate] processSuccessful];
}

- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error
{

}

-(void)preparesong:(NSURL *)url
{
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    NSError *error;
    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url  error:&error];
    if(!self.player)
    {
        NSLog(@"Error creating player: %@", error);
    }
    self.player.delegate = self;
    [self.player prepareToPlay];

}
-(BOOL)isPlayerExist
{
    if (player)
        return YES;
    return NO;

}
-(BOOL)isPlaying
{
    if (player && player.playing)
        return YES;
    return NO;

}
-(void)prepareToPlay
{
    if (player)
        [self.player prepareToPlay];
}
-(void)playsong
{
    if (player)
        [self.player play];

}
-(void)pause
{
    if (player.playing)
        [self.player pause];

}
-(void)stopsong
{
    if (player)
    [self.player stop];
}
@end

downloadPlay.h

#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioToolbox.h>
#import <AVFoundation/AVFoundation.h>
#import "PlayerManager.h"
@interface downloadPlay: UIViewController <UITableViewDelegate,AVAudioPlayerDelegate,ProcessDataDelegate>
{
    PlayerManager *protocolPlay;
}

@property (retain, nonatomic) IBOutlet UITableView *tblFiles;
......
- (void)startPlay:(id)sender;

........
@end

downloadPlay.m

import "downloadPlay.h"
#import "PlayerManager.h"

@interface downloadPlay ()

@end

@implementation downloadPlay
.....

- (void)processSuccessful
{
    NSLog(@"This method suppose to be called from the method audioPlayerDidFinishPlaying - from PlayerManager");
}

- (void)viewDidLoad
{

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    protocolPlay = [[PlayerManager alloc]init];
    [protocolPlay setDelegate:self];

}

- (void)startPlay
{
    ............
    .........
    NSURL *destinationURL = [self.docDirectoryURL URLByAppendingPathComponent:filename];
    NSError* error = nil;
   [[PlayerManager sharedAudioPlayer]stopsong];
    [[PlayerManager  sharedAudioPlayer ] preparesong:destinationURL    ];
    [[PlayerManager sharedAudioPlayer]playsong];
}

@end

Upvotes: 0

Views: 167

Answers (1)

Abhishek
Abhishek

Reputation: 99

In viewDidLoad method you are creating a different object by using

protocolPlay = [[PlayerManager alloc]init]; 

line and set the delegate of this object while you have to set the delegate of shared object.

Solution is:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [[PlayerManager sharedAudioPlayer] setDelegate:self];
}

Upvotes: 2

Related Questions