Search code examples
iosobjective-caudioaudio-recording

Delegates Of AVAudioRecorderDelegate are Not Calling


Actually I want To Record The Audio and Store Into Document, i haveFound FilePath and even attached the audio Files, But i want To attach actual Audio into that Path, It's Not Working, I write that Code in DidFinish like This.

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.navigationItem.title = @"Recording Area";
        [btnRecord setBackgroundImage:[UIImage imageNamed:@"Record.png"] forState:UIControlStateNormal];

        session = [AVAudioSession sharedInstance];
        [session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

        audioRecorder.delegate = self;


        NSDate *today = [[NSDate alloc]init];
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
        [dateFormatter setDateFormat:@"hh:mm:ss"];

        NSString *currentTime = [dateFormatter stringFromDate:today];

        NSString *outputPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0];

        outputPath = [outputPath stringByAppendingString:[NSString stringWithFormat:@"%@.m4a",currentTime]];

        NSMutableDictionary *recordDictionary = [[NSMutableDictionary alloc] init];

        [recordDictionary setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
        [recordDictionary setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
        [recordDictionary setValue:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];


        audioRecorder = [[AVAudioRecorder alloc]initWithURL:[NSURL fileURLWithPath:outputPath] settings:recordDictionary error:nil];

        audioRecorder.meteringEnabled = YES;
        [audioRecorder prepareToRecord];

    }

and For Recording Audio

    -(IBAction)onClickRecord:(id)sender
{

    if(player.playing)
    {
        [player stop];
    }


    if([[btnRecord backgroundImageForState:UIControlStateNormal]isEqual:[UIImage imageNamed:@"Record.png"]])
    {

        if (!audioRecorder.recording)

        {
            AVAudioSession *session = [AVAudioSession sharedInstance];
            [session setActive:YES error:nil];


            [audioRecorder record];
           [btnRecord setBackgroundImage:[UIImage imageNamed:@"Pause.png"] forState:UIControlStateNormal];
        }



    }

    else if([[btnRecord backgroundImageForState:UIControlStateNormal]isEqual:[UIImage imageNamed:@"Pause.png"]])
    {
        [audioRecorder pause];

        [btnRecord setBackgroundImage:[UIImage imageNamed:@"Record.png"] forState:UIControlStateNormal];
    }




}

For Saving That Recorded Audio

    -(IBAction)onClickSave:(id)sender
{
    [audioRecorder stop];
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setActive:NO error:nil];


}

And Finally that Is the Delegates Where My code is Not Working actually i am Not able To call This method

 - (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag
{


    [btnRecord setBackgroundImage:[UIImage imageNamed:@"Record.png"] forState:UIControlStateNormal];
    [arrayFiles addObject:recorder.url.absoluteString];
    NSLog(@"Array %@",arrayFiles);

}

So Please Specify Me where i am Wrong.


Solution

  • You are setting the delegate before initialising the AVAudioRecorder

    Move the audioRecorder.delegate = self; after init

    audioRecorder = [[AVAudioRecorder alloc]initWithURL:[NSURL fileURLWithPath:outputPath] settings:recordDictionary error:nil];
    audioRecorder.meteringEnabled = YES;
    audioRecorder.delegate = self;
    
    [audioRecorder prepareToRecord];