views:

492

answers:

5

I am working on an audio recorder application, it is working perfectly fine.

But I'm stuck with the problem of interruption. When a call comes,

- (void)audioRecorderBeginInterruption:(AVAudioRecorder *)recorder

then this method is called and the recording is paused.

And if the user rejects the call:

- (void)audioRecorderEndInterruption:(AVAudioRecorder *)recorder

Then here I want to resume the recording from the point where it was interrupted. But when I call the record method again, the recording starts with a new file.

+1  A: 

The OS is probably stopping the AVAudioRecorder during the interruption. You can either present the two or more files as a single recording to the user, or you can use AudioQueue to write your code for handling interruptions (as well as saving audio data to a file).

lucius
A: 

I tried to do this a while ago and came to the conclusion that it couldn't be done properly; the operating system itself won't let you do it. Maybe that's changed in 3.1.2, but when I tried in 3.0 it just wouldn't work.

Jason B
A: 

@Jason

How did you solve your problem? I am struck at the same point.

The documentation for the AVAudioRecorderDelegate protocol method -audioRecorderEndInterruption states:

"For an audio recorder’s delegate to receive this message, the audio recorder must have been recording when the interruption started. When an interruption ends, the audio session for your application is automatically reactivated, allowing your application to interact with the audio recorder. To resume recording, call the record method."

But this never seems to work.

Thnx

Raj
@Ashish -But what about the number of audio files generated by your method. The author of this thread explains a problem which is exactly the same faced by me. When I start recording again in audioRecorderEndInterruption by activating the audio session, a new audio file of the second session is being generated. Eventually the first session of audio recording is lost.Any solutions?Thnx
Raj
The first session audio file is overwritten by the new audio file which is generated by calling record (to resume recording) after the interruption ends.
Raj
A: 

To handle the interruption, you have to use AVAudioSessionDelegate methodes instead of AVAudioRecorderDelegate methods.This is the code sample for handling interruption: /================================================================= Interruption Handling Method during Recording ==================================================================/

  • (void) beginInterruption { if(self.recorder) { //Method to handle UI } }

  • (void) endInterruption {

    NSError *err = noErr; [[AVAudioSession sharedInstance] setActive: YES error: &err]; if(err != noErr) { NSLog([err description]); } //method to handle UI } First method automatically deactivate the audio session.So,in second method,you have to reactivate the audio session.First method will pause the recording and when interruption ends you can resume with second method.I have tried this on version 3.0 and upper version.

Ashish Maheshwari
+1  A: 

The problem is solved!

I have re-written the recording code to avoid this problem. I used AudioQueues, basically the backend code is the same of SpeakHere application with some minor changes. Provided two more apis in it:

-(void)resume
{
    AudioQueueStart(queueObject, NULL);
}

-(void)pause
{
    AudioQueuePause(queueObject);
}

In AudioRecorder class. The basic purpose being to avoid the recording setup which is done in record method.

Setup the interrupt callback and then use this pause and resume methods appropriately in the callback. Also take care to set active the audio session based on whether your application needs it or not.

Hope this helps someone out there.

Raj