Reputation: 55
I am trying to set different sampling rates (like 32kHz, 24kHz etc..) to the input stream of Remote I/O audio unit. But the output is always played at one of these sampling rates -
22.05kHz, 33.1kHz, 11.0kHz irrespective of what I set. And surprisingly, when I call AudioUnitGetProperty
on kAudioUnitScope_Output
for kAudioUnitProperty_SampleRate
, it always returns 44.1kHz
- (void)startToneUnit
{
AudioComponentDescription defaultOutputDescription;
defaultOutputDescription.componentType = kAudioUnitType_Output;
defaultOutputDescription.componentSubType = kAudioUnitSubType_RemoteIO;
defaultOutputDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
defaultOutputDescription.componentFlags = 0;
defaultOutputDescription.componentFlagsMask = 0;
// Get the default playback output unit
AudioComponent defaultOutput = AudioComponentFindNext(NULL, &defaultOutputDescription);
NSAssert(defaultOutput, @"Can't find default output");
// Create a new unit based on this that we'll use for output
OSErr err = AudioComponentInstanceNew(defaultOutput, &toneUnit);
NSAssert1(toneUnit, @"Error creating unit: %hd", err);
// Set our tone rendering function on the unit
AURenderCallbackStruct input;
input.inputProc = RenderTone;
input.inputProcRefCon = (__bridge void *)(self);
err = AudioUnitSetProperty(toneUnit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Input,
0,
&input,
sizeof(input));
NSAssert1(err == noErr, @"Error setting callback: %hd", err);
// Set the format to 32 bit, single channel, floating point, linear PCM
const int four_bytes_per_float = 4;
const int eight_bits_per_byte = 8;
AudioStreamBasicDescription streamFormat;
streamFormat.mSampleRate = SAMPLE_RATE;
streamFormat.mFormatID = kAudioFormatLinearPCM;
streamFormat.mFormatFlags =
kAudioFormatFlagsNativeFloatPacked;
streamFormat.mBytesPerPacket = four_bytes_per_float;
streamFormat.mFramesPerPacket = 1;
streamFormat.mBytesPerFrame = four_bytes_per_float;
streamFormat.mChannelsPerFrame = 1;
streamFormat.mBitsPerChannel = four_bytes_per_float * eight_bits_per_byte;
err = AudioUnitSetProperty (toneUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
0,
&streamFormat,
sizeof(AudioStreamBasicDescription));
NSAssert1(err == noErr, @"Error setting stream format: %hd", err);
// Stop changing parameters on the unit
err = AudioUnitInitialize(toneUnit);
NSAssert1(err == noErr, @"Error initializing unit: %hd", err);
// Start playback
err = AudioOutputUnitStart(toneUnit);
NSAssert1(err == noErr, @"Error starting unit: %hd", err);
Float64 outSampleRate = 0.0;
UInt32 size = sizeof(Float64);
AudioUnitGetProperty (toneUnit,
kAudioUnitProperty_SampleRate,
kAudioUnitScope_Output,
0,
&outSampleRate,
&size);
NSLog(@"Output sample rate is now at %f Hz", outSampleRate);
}
What are all the possible output sampling rates supported for Audio Units? Any reference to Apple's documentation on this will be greatly helpful
Thanks
Upvotes: 2
Views: 2841
Reputation: 9464
AudioUnit
s, in general, can run at whatever sample rate you specify. The RemoteIO
(or HAL on Mac OS X) AudioUnits, being facades for hardware, are more restricted -- varispeed clock generators, sample rate generators that can run at any arbitrary sample rate, are very expensive and generally not appropriate for telephones :)
Different iOS hardware, models of hardware, or lines of hardware or revisions may support different sample rates. RemoteIO
just accepts the rate you request and sets the onboard converter to the rate that is closest to the one you request. You always have to do a AudioUnitGetProperty
to see what you're actually getting. If you want to record or work at a different rate, you need to then employ an converter plugin.
Upvotes: 5