Hello !
I have a little issue regarding the use of the AudioQueue services.
I have followed the guide that is available on Apple's webiste, but
when I got to start and run the Audio Queue, I get the message
telling me that "AudioConverterNew returned -50".
Now, I know that the -50 error code means that there is a bad
parameter. However, what I don't know is which parameter is the bad
one (would be too easy if I knew...) !
------------------------------------------------------------------------------------------------------------------------------------------------------
So, here's my code.
Here are the parameters of my class, named cPlayerCocoa
AudioQueueRef mQueue;
AudioQueueBufferRef
mBuffers[NUMBER_BUFFERS]; // NUMBER_BUFFERS
= 3
uint32
mBufferByteSize;
AudioStreamBasicDescription mDataFormat;
Here's the first function :
static void
BuildBuffer( void* iAQData, AudioQueueRef iAQ,
AudioQueueBufferRef iBuffer )
{
cPlayerCocoa* player = (cPlayerCocoa*) iAQData;
player->HandleOutputBuffer( iAQ, iBuffer );
}
It creates a cPlayerCocoa from the structure containing the
AudioQueue and calls the HandleOutputBuffer function, which
allocates the audio buffers :
void
cPlayerCocoa::HandleOutputBuffer( AudioQueueRef iAQ,
AudioQueueBufferRef iBuffer )
{
if( mContinue )
{
xassert( iBuffer->mAudioDataByteSize == 32768 );
int startSample = mPlaySampleCurrent;
int result = 0;
int samplecount = 32768 / (
mSoundData->BytesPerSample() ); //
BytesPerSample, in my case, returns 4
tErrorCode error = mSoundData->ReadData(
(int16*)(iBuffer->mAudioData), samplecount, &result,
startSample );
AudioQueueEnqueueBuffer( mQueue, iBuffer, 0, 0 );
// I'm using CBR data (PCM), hence the 0 passed into the
AudioQueueEnqueueBuffer.
if( result != samplecount )
mContinue = false;
startSample += result;
}
else
{
AudioQueueStop( mQueue, false );
}
}
In this next function, the AudioQueue is created then started.
I begin to initialise the parameters of the Data format. Then I
create the AudioQueue, and I allocate the 3 buffers.
When the buffers are allocated, I start the AudioQueue and then I
run the loop.
void
cPlayerCocoa::ThreadEntry()
{
int samplecount = 32768 / ( mSoundData->BytesPerSample()
);
mDataFormat.mSampleRate = mSoundData->SamplingRate();
// Returns 44100
mDataFormat.mFormatID = kAudioFormatLinearPCM;
mDataFormat.mFormatFlags =
kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
mDataFormat.mBytesPerPacket = 32768;
mDataFormat.mFramesPerPacket = samplecount;
mDataFormat.mBytesPerFrame =
mSoundData->BytesPerSample(); // BytesPerSample
returns 4.
mDataFormat.mChannelsPerFrame = 2;
mDataFormat.mBitsPerChannel =
uint32(mSoundData->BitsPerChannel());
mDataFormat.mReserved = 0;
AudioQueueNewOutput( &mDataFormat, BuildBuffer, this,
CFRunLoopGetCurrent(), kCFRunLoopCommonModes, 0, &mQueue );
for( int i = 0; i < NUMBER_BUFFERS; ++i )
{
AudioQueueAllocateBuffer( mQueue, mBufferByteSize,
&mBuffers[i] );
HandleOutputBuffer( mQueue, mBuffers[i] );
}
AudioQueueStart( mQueue, NULL ); //
I want the queue to start playing immediately, so I pass NULL
do {
CFRunLoopRunInMode( kCFRunLoopDefaultMode, 0.25,
false );
} while ( !NeedStopASAP() );
AudioQueueDispose( mQueue, true );
}
------------------------------------------------------------------------------------------------------------------------------------------------------
The call to AudioQueueStart returns -50 (bad parameter) and I can't
figure what's wrong...
I would really appreciate some help, thanks in advance :-)
--
Thierry CANTET
|