Re: AudioConverter "insz" error related to sample rate?
Re: AudioConverter "insz" error related to sample rate?
- Subject: Re: AudioConverter "insz" error related to sample rate?
- From: Michael Thornburgh <email@hidden>
- Date: Fri, 5 Nov 2004 16:42:33 -0800
AudioConverterFillComplexBuffer() can/will change the value of an ABL's
audio buffers' mDataByteSize fields to reflect the number of frames
actually converted. if you don't change it back before your next call
to AudioConverterFillComplexBuffer(), then the mDataByteSizes may not
match up with the frames you've asked to read out.
in the version of MTCoreAudio i haven't released yet (haven't had the
time lately :( ) i have a new ABL utility function to clean up after
AudioConverterFillComplexBuffer(), MTAudioBufferListSetFrameCount().
it just jams all the mDataByteSizes in an ABL to what they should be
for that many frames of the number of channels in each stream.
obviously, it doesn't have any way to verify (or determine on its own)
how big it _should_ be, since you can't ask a malloc()ed memory block
how big it's supposed to be.
anyway, this function is included below from my development version of
MTCoreAudio. it will be in the next release, whenever that happens, so
be mindful that if you upgrade my framework in the future, you'll need
to remove this duplicate from your code (or just call it something
different now :).
void MTAudioBufferListSetFrameCount ( AudioBufferList * buf,
unsigned count )
{
unsigned buffer;
for ( buffer = 0; buffer < buf->mNumberBuffers; buffer++ )
{
buf->mBuffers[buffer].mDataByteSize = sizeof(Float32) * count *
buf->mBuffers[buffer].mNumberChannels;
}
}
i use it by remembering how many frames my AudioBufferList is
_supposed_ to hold, and then just reset my ABL right after using
AudioConverterFillComplexBuffer():
...
AudioConverterFillComplexBuffer ( converter, _FillComplexBufferProc,
&callbackContext, &framesRead, outputBufferList, NULL );
MTAudioBufferListSetFrameCount ( outputBufferList,
outputBufferListFrameCount ); // gross
...
hope this helps.
-mike
On Nov 5, 2004, at 9:09 AM, Doug Wyatt wrote:
On Nov 5, 2004, at 7:11, Christopher Ashworth wrote:
I am using an Audio Converter to help play files from disk to an
output device. The converter is created using the stream description
of the file as the input description and the stream description of an
MTCoreAudioDevice as the output description.
When playing a file, I have the playback IO proc reading from an
MTAudioBuffer, and a separate thread filling up that buffer. Inside
the thread that fills the buffer, I read a certain number of packets
from the audio file and convert them into an AudioBufferList by
calling AudioConverterFillComplexBuffer. (Just for reference, the
AudioBufferList is created via MTAudioBufferListNew). Then I write
that AudioBufferList into the MTAudioBuffer.
This works perfectly as long as the sample rate of my input file
matches the sample rate I am converting to. If the sample rate of
the file is different, the AudioConverterFillComplexBuffer function
returns an "insz" error.
I am sure there is enough room in the AudioBufferList to receive the
converted data. Also, if I artificially set the output stream
description to the same sample rate as the file when setting up the
converter, it converts fine (although of course the sound I hear is
either sped up or slowed down since the rate isn't correct for the
output device).
An earlier version of this code (before I added the use of the
buffers) converted the same files and played them back correctly.
Is this maybe related to converting into an AudioBufferList created
by MTAudioBufferListNew, rather than into the AudioBufferList I would
write into before, which was provided by the playback IO function?
kAudioConverterErr_InvalidInputSize ('insz') is returned when the
number of bytes (in the buffer list's buffers) and number of packets
returned by the input proc are inconsistent.
Doug
_______________________________________________
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