Search code examples
iosobjective-ccore-audioaudiounitsample-rate

iOS: Changing sample rate dynamically in Audio Unit


Is it possible to change/set sample rate in the middle of a running AudioSession/AudioUnit without stopping/restarting the current AudioSession/AudioUnit (Just like audio route) ?

I have an active audio session whose sample rate is 44.1 KHz

AudioStreamBasicDescription.mSampleRate         = 44100

I want to change the sample rate to 8KHz without uninitializing [AudioUnitUninitialize(audioUnit)] or stopping [AudioOutputUnitStop(audioUnit)] or deactivating Audio Unit/Session.

This is my audio unit settings.

audioComponentDescription.componentType = kAudioUnitType_Output;
audioComponentDescription.componentSubType = kAudioUnitSubType_VoiceProcessingIO;
audioComponentDescription.componentFlags = 0;
audioComponentDescription.componentFlagsMask = 0;
audioComponentDescription.componentManufacturer = kAudioUnitManufacturer_Apple;


audioStreamBasicDescription.mSampleRate         = 44100;
audioStreamBasicDescription.mFormatID           = kAudioFormatLinearPCM;
audioStreamBasicDescription.mFormatFlags        =  kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioStreamBasicDescription.mFramesPerPacket    = 1;
audioStreamBasicDescription.mChannelsPerFrame   = 1;
audioStreamBasicDescription.mBitsPerChannel     = 16;
audioStreamBasicDescription.mBytesPerPacket     = 2;
audioStreamBasicDescription.mBytesPerFrame      = 2;

Any help is highly appreciated.


Solution

  • No, as each sample rate requires some startup time involving flushing samples at the previous rate from the Audio Unit buffers and sample rate converters.

    Best bet, if you need to process another sample rate is to resample in software inside your own app.