Here is some code that sets the Audio Capture Buffer Size (in secs)
union
{
OSStatus propertyResult;
char a[4];
} u;
union
{
UInt32 UI32sessionCat;
char a[4];
} usc;
UInt32 UI32sessionCatSize = 4;
Float32 F32realIOBufferDuration = 0.0;
Float32 F32requestedIOBufferDuration = 0.5;
UInt32 F32datasize = 4;
u.propertyResult = AudioSessionGetProperty ( kAudioSessionProperty_PreferredHardwareIOBufferDuration , &F32datasize, &F32realIOBufferDuration );
NSLog(@"Error Get IO Duration Time %ld %lx %c%c%c%c",u.propertyResult,u.propertyResult,u.a[3],u.a[2],u.a[1],u.a[0]);
NSLog(@"IO Buffer Duration is %f",F32realIOBufferDuration);
u.propertyResult = AudioSessionSetProperty ( kAudioSessionProperty_PreferredHardwareIOBufferDuration ,sizeof(F32requestedIOBufferDuration) , &F32requestedIOBufferDuration );
NSLog(@"Error Set IO Duration Time %ld %lx %c%c%c%c",u.propertyResult,u.propertyResult,u.a[3],u.a[2],u.a[1],u.a[0]);
u.propertyResult = AudioSessionGetProperty ( kAudioSessionProperty_PreferredHardwareIOBufferDuration , &F32datasize, &F32realIOBufferDuration );
NSLog(@"Error Get IO Duration Time %ld %lx %c%c%c%c",u.propertyResult,u.propertyResult,u.a[3],u.a[2],u.a[1],u.a[0]);
NSLog(@"IO Buffer Duration is %f",F32realIOBufferDuration);
u.propertyResult = AudioSessionGetProperty ( kAudioSessionProperty_AudioCategory, &UI32sessionCatSize, &usc.UI32sessionCat );
NSLog(@"Error Get Property %ld %lx %c%c%c%c",u.propertyResult,u.propertyResult,u.a[3],u.a[2],u.a[1],u.a[0]);
NSLog(@"Category %ld %lx %c%c%c%c",usc.UI32sessionCat,usc.UI32sessionCat,usc.a[3],usc.a[2],usc.a[1],usc.a[0]);
Which seems to be working / setting the duration…
2012-01-25 12:28:01.275 recordonlytest[1623:707] Error Get IO Duration Time 0 0
2012-01-25 12:28:01.276 recordonlytest[1623:707] IO Buffer Duration is 0.023000
2012-01-25 12:28:01.278 recordonlytest[1623:707] Error Set IO Duration Time 0 0
2012-01-25 12:28:01.280 recordonlytest[1623:707] Error Get IO Duration Time 0 0
2012-01-25 12:28:01.281 recordonlytest[1623:707] IO Buffer Duration is 0.500000
2012-01-25 12:28:01.283 recordonlytest[1623:707] Error Get Property 0 0
2012-01-25 12:28:01.284 recordonlytest[1623:707] Category 1919247201 72656361 reca
You can see the get properties is indeed returning 0.50000
But the callbacks are still happening at the .023000 speed
2012-01-25 12:28:04.035 recordonlytest[1623:707] In Capture Output
2012-01-25 12:28:04.058 recordonlytest[1623:707] In Capture Output
2012-01-25 12:28:04.081 recordonlytest[1623:707] In Capture Output
2012-01-25 12:28:04.104 recordonlytest[1623:707] In Capture Output
2012-01-25 12:28:04.128 recordonlytest[1623:707] In Capture Output
2012-01-25 12:28:04.151 recordonlytest[1623:707] In Capture Output
2012-01-25 12:28:04.174 recordonlytest[1623:707] In Capture Output
2012-01-25 12:28:04.197 recordonlytest[1623:707] In Capture Output
2012-01-25 12:28:04.220 recordonlytest[1623:707] In Capture Output
2012-01-25 12:28:04.244 recordonlytest[1623:707] In Capture Output
This is getting set
[self getRequestedSampleRate]; // routine to set the duration
NSError* activationError = nil;
[[AVAudioSession sharedInstance] setActive: YES error: &activationError];
audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
captureSession = [[AVCaptureSession alloc] init];
So is there a different sequence, etc that needs to be done, or is IOS just ignoring this request?
From here:
While it is safe to set Audio Session properties such as audio category (kAudioSessionProperty_AudioCategory) or the property listener regardless of the sessions activation state, it is generally better to make preference requests such as preferred hardware buffer duration (kAudioSessionProperty_PreferredHardwareIOBufferDuration) or preferred hardware sample rate (kAudioSessionProperty_PreferredHardwareSampleRate) when the Audio Session is NOT active.
You may be missing the:
// * Activate the Audio Session before asking for the “Current” properties *
AudioSessionSetActive(true);