I haven't looked at this code after a while, but I think it should do the trick.
AudioFormatListItem afli = GetFirstPlayableAudioFormatForFile(inAudioFileStream);
AudioStreamBasicDescription asbd = afli.mASBD;
...
err = AudioQueueNewOutput(&asbd, MyAudioQueueOutputCallback, myData, NULL, NULL, 0, &myData->audioQueue);
GetFirstPlayableAudioFormatForFile impl:
AudioFormatListItem GetFirstPlayableAudioFormatForFile(AudioFileStreamID inAudioFileStream)
{
AudioFormatListItem *formatListPtr = NULL;
AudioFormatListItem formatItem = {0};
UInt32 propertySize;
OSStatus status = noErr;
if (NULL == inAudioFileStream) return formatItem;
status = AudioFileStreamGetPropertyInfo(inAudioFileStream, kAudioFileStreamProperty_FormatList, &propertySize, NULL);
if (noErr == status) {
formatListPtr = (AudioFormatListItem *)malloc(propertySize);
if (NULL == formatListPtr) return formatItem;
status = AudioFileStreamGetProperty(inAudioFileStream, kAudioFileStreamProperty_FormatList, &propertySize, formatListPtr);
if (noErr == status) {
UInt32 numFormats = propertySize / sizeof(AudioFormatListItem);
printf ("This file has a %d layered data format:\n", (int)numFormats);
UInt32 itemIndex;
UInt32 indexSize = sizeof(itemIndex);
status = AudioFormatGetProperty(kAudioFormatProperty_FirstPlayableFormatFromList, propertySize,
formatListPtr, &indexSize, &itemIndex);
if (noErr == status) {
printf ("Returning AudioFormatListItem at index %d.\n", (int)itemIndex);
formatItem = formatListPtr[itemIndex];
}
}
free(formatListPtr);
} else {
AudioStreamBasicDescription asbd;
UInt32 asbdSize = sizeof(asbd);
AudioFileStreamGetProperty(inAudioFileStream, kAudioFileStreamProperty_DataFormat, &asbdSize, &asbd);
formatItem.mASBD = asbd;
}
return formatItem;
}
source
share