Question

I am looking at the Audio Unit functions for recording. Everything is fine, except the recording callbacks stop when the app is in the background, unlike the AVCapture that keeps recording in the background with the RED BAR. Is there a way to get this to continue to record while in background as with the AVCapture?

#import "AudioUnit/AudioComponent.h"
#import "AudioUnit/AudioUnit.h"

desc.componentType          = kAudioUnitType_Output;
desc.componentSubType       = kAudioUnitSubType_RemoteIO;
desc.componentFlags         = 0;
desc.componentFlagsMask     = 0;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;

AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc);
status = AudioComponentInstanceNew(inputComponent, &audioUnit);
checkStatus(status);

UInt32 flag = 1;

status = AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, kInputBus, &flag, sizeof(flag));
checkStatus(status);

//status = AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, kOutputBus, &flag, sizeof(flag));
checkStatus(status);

AudioStreamBasicDescription     audioFormat;
audioFormat.mSampleRate         = 8000.00; //44100.00;
audioFormat.mFormatID           = kAudioFormatLinearPCM;
audioFormat.mFormatFlags        = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket    = 1;
audioFormat.mChannelsPerFrame   = 1;
audioFormat.mBitsPerChannel     = 16;
audioFormat.mBytesPerPacket     = 2;
audioFormat.mBytesPerFrame      = 2;

status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, kInputBus, &audioFormat, sizeof(audioFormat));
checkStatus(status);

status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, kOutputBus, &audioFormat, sizeof(audioFormat));
checkStatus(status);

AURenderCallbackStruct callbackStruct;

callbackStruct.inputProc = recordingCallback;
callbackStruct.inputProcRefCon = self;

status = AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, kInputBus, &callbackStruct, sizeof(callbackStruct));
checkStatus(status);
Was it helpful?

Solution

Doh, forgot to set

Targets / Info / Required background modes / App plays audio

to the test app.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top