AudioConverterNew вернул -50

У меня есть небольшая проблема, связанная с использованием сервисов AudioQueue.
Я следовал руководству, которое доступно на веб-сайте Apple, но когда мне удалось запустить и запустить Audio Queue, я получил сообщение о том, что «AudioConverterNew вернул -50».
Теперь я знаю, что код ошибки -50 означает, что есть неверный параметр. Тем не менее, я не знаю, какой параметр является плохим (большое спасибо, Apple …)!


Итак, вот мой код.

Вот параметры моего класса с именем cPlayerCocoa

AudioQueueRef                   mQueue;
AudioQueueBufferRef             mBuffers[NUMBER_BUFFERS];    // NUMBER_BUFFERS = 3
uint32                          mBufferByteSize;
AudioStreamBasicDescription     mDataFormat;

Вот первая функция:

static void
BuildBuffer( void* iAQData, AudioQueueRef iAQ, AudioQueueBufferRef iBuffer )
{
cPlayerCocoa* player = (cPlayerCocoa*) iAQData;
player->HandleOutputBuffer( iAQ, iBuffer );
}

Он создает cPlayerCocoa из структуры, содержащей AudioQueue, и вызывает функцию HandleOutputBuffer, которая выделяет аудиобуферы:

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 );
}
}

В этой следующей функции AudioQueue создается, а затем запускается.
Я начинаю инициализировать параметры формата данных. Затем я создаю AudioQueue и выделяю 3 буфера.
Когда буферы распределены, я запускаю AudioQueue, а затем запускаю цикл.

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 );
}

Вызов AudioQueueStart возвращает -50 (неверный параметр), и я не могу понять, что не так …
Буду очень признателен за помощь, заранее спасибо 🙂

2

Решение

Я думаю, что ваш ASBD является подозрительным. Форматы PCM имеют предсказуемые значения для mBytesPerPacket, mBytesPerFrame, а также mFramesPerPacket, Для обычного 16-битного чересстрочного звука со звуком 44,1 со знаком ASBD будет выглядеть

AudioStreamBasicDescription asbd = {
.mFormatID = kAudioFormatLinearPCM,
.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked,
.mSampleRate = 44100,
.mChannelsPerFrame = 2,
.mBitsPerChannel = 16,
.mBytesPerPacket = 4,
.mFramesPerPacket = 1,
.mBytesPerFrame = 4,
.mReserved = 0
};

AudioConverterNew возвращает -50, если один из ASBD не поддерживается. Там нет формата PCM, где mBytesPerPacket должно быть 32768, поэтому вы получаете ошибку.

3

Другие решения

Других решений пока нет …