Re: Getting the PreferedHardwareIOBufferDuration
Re: Getting the PreferedHardwareIOBufferDuration
- Subject: Re: Getting the PreferedHardwareIOBufferDuration
- From: Greg Chapman <email@hidden>
- Date: Thu, 26 Feb 2009 09:15:28 -0800
Clearly we have to fix this bug. _Please_ write it up at
bugreporter.apple.com.
One last thought for a workaround... it seems like if you actually go
inactive, and then active again (in your log), you get your bufferSize
back.
You could try doing this by hand:
AudioSessionSetActive(false);
AudioSessionSetActive(true);
and see if that gets you past this.
Greg
On Feb 26, 2009, at 1:17 AM, Mark's Studio wrote:
Hi Greg,
i have tried a few things but can't get it to work. unless i make a
without making
here is my listener functions,
you should be able to paste them into the aurioTouchAppDelegate.mm
and remove the rioInterruptionListener() from the aurio_helper.cpp
bufferSize 0.005805
routeChangeReason 1
kAudioSessionProperty_AudioCategory'plar'
kAudioSessionProperty_OtherAudioIsPlaying 1
bufferSize 0.005805
Session interrupted! 1--- Begin Interruption --- iPod app
starts playing
routeChangeReason 3
kAudioSessionProperty_AudioCategory'plar'
kAudioSessionProperty_OtherAudioIsPlaying 0
bufferSize 0.023220
routeChangeReason 3 AVAudioPlayer starts and iPod fades out
(you need to add a similar function to the sample code)
kAudioSessionProperty_AudioCategory'plar'
kAudioSessionProperty_OtherAudioIsPlaying 1
bufferSize 0.023220
routeChangeReason 2 Line out plug from iPhone dock removed
kAudioSessionProperty_AudioCategory'plar'
kAudioSessionProperty_OtherAudioIsPlaying 1
Error: couldn't initialize the remote I/O unit ('!act')
Error: couldn't start unit ('!act')
bufferSize 0.005805
routeChangeReason 1 Line out plug from iPhone dock plugged in
kAudioSessionProperty_AudioCategory'plar'
kAudioSessionProperty_OtherAudioIsPlaying 0
bufferSize 0.005805
the app is actually already on the App Store.
http://irock.marks-studio.dk
void rioInterruptionListener( void *inUserData,
UInt32 inInterruption)
{
// NSLog(@"Session interrupted! --- %s ---", inInterruption ==
kAudioSessionBeginInterruption ? "Begin Interruption" : "End
Interruption");
printf("Session interrupted! %d--- %s ---\n",inInterruption,
inInterruption == kAudioSessionBeginInterruption ? "Begin
Interruption" : "End Interruption");
// AudioUnit *remoteIO = (AudioUnit*)inUserData;
AudioControl *THIS = (AudioControl*)inUserData;
if (inInterruption == kAudioSessionEndInterruption)
{
// make sure we are again the active session
AudioSessionSetActive(true);
AudioOutputUnitStart(THIS->rioUnit);
}
if (inInterruption == kAudioSessionBeginInterruption){
if(THIS->rioUnit !=nil)
AudioOutputUnitStop(THIS->rioUnit);
}
}
void propListener( void * inClientData,
AudioSessionPropertyID inID,
UInt32 inDataSize,
const void * inData)
{
// Print4CharCode("AudioSessionPropertyID",inID);
AudioControl *THIS = (AudioControl*)inClientData;
CFDictionaryRef routeChangeDictionary = (CFDictionaryRef)inData;
CFNumberRef routeChangeReasonRef =
(CFNumberRef) CFDictionaryGetValue (routeChangeDictionary,CFSTR
(kAudioSession_AudioRouteChangeKey_Reason));
Float32 bufferSize;//.005 020
UInt32 siz = sizeof(bufferSize);
SInt32
routeChangeReason; // 9
CFNumberGetValue
(routeChangeReasonRef,kCFNumberSInt32Type,&routeChangeReason);
printf("routeChangeReason %d\n",routeChangeReason);
UInt32 audioCategory;
UInt32 size = sizeof(audioCategory);
AudioSessionGetProperty(kAudioSessionProperty_AudioCategory, &size,
&audioCategory);
Print4CharCode("kAudioSessionProperty_AudioCategory",audioCategory);
UInt32 otherAudioIsPlaying;
AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying,
&size, &otherAudioIsPlaying);
printf("kAudioSessionProperty_OtherAudioIsPlaying %d
\n",otherAudioIsPlaying);
// if(routeChangeReason !=
kAudioSessionRouteChangeReason_CategoryChange) {
if(otherAudioIsPlaying && routeChangeReason ==
kAudioSessionRouteChangeReason_CategoryChange) {
try {
UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord;//
kAudioSessionCategory_PlayAndRecord kAudioSessionCategory_RecordAudio
XThrowIfError
(AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
sizeof(audioCategory), &audioCategory), "couldn't set audio
category");
Float32 preferredBufferSize = kPreferredBufferSize;//.005 020
XThrowIfError
(AudioSessionSetProperty
(kAudioSessionProperty_PreferredHardwareIOBufferDuration,
sizeof(preferredBufferSize), &preferredBufferSize), "couldn't set i/
o buffer duration");
XThrowIfError(AudioSessionSetActive(true), "couldn't set audio
session active\n");
AudioSessionGetProperty
(kAudioSessionProperty_CurrentHardwareIOBufferDuration, &siz,
&bufferSize);
if(bufferSize > kPreferredBufferSize){
AudioSessionSetActive(false);
AudioSessionSetActive(true);
// XThrowIfError(AudioSessionSetActive(true), "couldn't set audio
session active\n");
}
XThrowIfError(AudioOutputUnitStart(THIS->rioUnit), "couldn't
start unit");
}
catch (CAXException e) {
char buf[256];
fprintf(stderr, "Error: %s (%s)\n", e.mOperation,
e.FormatError(buf));
}
}else if (inID == kAudioSessionProperty_AudioRouteChange &&
routeChangeReason != kAudioSessionRouteChangeReason_CategoryChange) {
try {
UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord;//
kAudioSessionCategory_PlayAndRecord kAudioSessionCategory_RecordAudio
XThrowIfError
(AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
sizeof(audioCategory), &audioCategory), "couldn't set audio
category");
Float32 preferredBufferSize = kPreferredBufferSize;//.005 020
XThrowIfError
(AudioSessionSetProperty
(kAudioSessionProperty_PreferredHardwareIOBufferDuration,
sizeof(preferredBufferSize), &preferredBufferSize), "couldn't set i/
o buffer duration");
XThrowIfError(AudioSessionSetActive(true), "couldn't set audio
session active\n");
AudioSessionGetProperty
(kAudioSessionProperty_CurrentHardwareIOBufferDuration, &siz,
&bufferSize);
if(bufferSize > kPreferredBufferSize){
AudioSessionSetActive(false);
AudioSessionSetActive(true);
// XThrowIfError(AudioSessionSetActive(true), "couldn't set
audio session active\n");
}
// if there was a route change, we need to dispose the current
rio unit and create a new one
XThrowIfError(AudioComponentInstanceDispose(THIS->rioUnit),
"couldn't dispose remote i/o unit");
SetupRemoteIO(THIS->rioUnit, THIS->inputProc, THIS->thruFormat);
UInt32 size = sizeof(THIS->hwSampleRate);
XThrowIfError
(AudioSessionGetProperty
(kAudioSessionProperty_CurrentHardwareSampleRate, &size, &THIS-
>hwSampleRate), "couldn't get new sample rate");
// UInt32 audioRouteOverride =
kAudioSessionOverrideAudioRoute_Speaker; // 1
//
XThrowIfError
(AudioSessionSetProperty
(kAudioSessionProperty_OverrideAudioRoute,sizeof
(audioRouteOverride),&audioRouteOverride), "couldn't set
audioRouteOverride");
XThrowIfError(AudioOutputUnitStart(THIS->rioUnit), "couldn't
start unit");
// we need to rescale the sonogram view's color thresholds for
different input
CFStringRef newRoute;
size = sizeof(CFStringRef);
XThrowIfError
(AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size,
&newRoute), "couldn't get new audio route");
if (newRoute)
{
//NSLog(@"newRoute %@", newRoute);
if (CFStringCompare(newRoute, CFSTR("HeadsetInOut"), NULL) ==
kCFCompareEqualTo) // headset plugged in
{
THIS->inputType = kInputType_HeadsetInOut;
}
else if (CFStringCompare(newRoute,
CFSTR("ReceiverAndMicrophone"), NULL) == kCFCompareEqualTo) //
headset plugged in
{
THIS->inputType = kInputType_ReceiverAndMicrophone;
}
else if (CFStringCompare(newRoute,
CFSTR("HeadphonesAndMicrophone"), NULL) == kCFCompareEqualTo) //
headset plugged in
{
THIS->inputType = kInputType_HeadphonesAndMicrophone;
}
else if (CFStringCompare(newRoute, CFSTR("LineOut"), NULL) ==
kCFCompareEqualTo) // headset plugged in
{
THIS->inputType = kInputType_LineOut;
}
else
{
}
// CFRelease(newRoute);
}
}
catch (CAXException e) {
char buf[256];
fprintf(stderr, "Error: %s (%s)\n", e.mOperation,
e.FormatError(buf));
}
}
AudioSessionGetProperty
(kAudioSessionProperty_CurrentHardwareIOBufferDuration, &siz,
&bufferSize);
printf("bufferSize %f\n",bufferSize);
}
On 25/02/2009, at 19.30, Greg Chapman wrote:
On Feb 25, 2009, at 4:08 AM, Mark's Studio wrote:
I set kAudioSessionProperty_PreferedHardwareIOBufferDuration to
0.005
and kAudioSessionProperty_CurrentHardwareIOBufferDuration returns
0.005805,
so that is fine
But if the iPod app is started the buffer duration change to
0.023220
and when restarting my audio (i do this by starting an
AVAudioPlayer,so the iPod fades out) the buffer duration stay there,
if i trigger another restart by removing the headset it goes back
to the prefered duration.
This seems like a bug... if you have interrupted the iPod app, you
should get all your hardware settings back (unless something else
weird is going on, like a phone call or something).
Can you write a bug please? If possible, include source code we
can build to reproduce the problem.
Is there anyway i can make sure i get the prefered duration ?
To try to work around the bug, you could try calling
AudioSessionSetActive(true) again before restarting; that might get
us to do the right thing. (I'm just guessing, though... I don't
know yet what the bug is.)
Greg
Peter Mark
Mark's Recording Studio A/S
Lundeskovsvej 3
2900 Hellerup
Denmark
Tel: +45 35366078
Fax: +45 35366038
Mobile: +45 20416018
www.marks-studio.dk
email@hidden
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Coreaudio-api mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden