AudioQueue портит вывод после модификации - PullRequest
1 голос
/ 13 января 2011

В настоящее время я работаю над разработкой аудио DSP-приложения. Проект требует прямого доступа и модификации аудиоданных. Прямо сейчас я могу успешно получить доступ и изменить необработанные аудиоданные с помощью AudioQueue, но при воспроизведении возникает ошибка. Выходной звук после любой модификации оказывается шумом.

Короче говоря, код выглядит примерно так:

(Изменено из примера кода Speakhere. Остальное остается без изменений.)

void AQPlayer::AQBufferCallback(void *                  inUserData,
                            AudioQueueRef           inAQ,
                            AudioQueueBufferRef     inCompleteAQBuffer) 
{
AQPlayer *THIS = (AQPlayer *)inUserData;

if (THIS->mIsDone) return;

UInt32 numBytes;
UInt32 nPackets = THIS->GetNumPacketsToRead();
OSStatus result = AudioFileReadPackets(THIS->GetAudioFileID(), 
                                       false, 
                                       &numBytes, 
                                       inCompleteAQBuffer->mPacketDescriptions, 
                                       THIS->GetCurrentPacket(), 
                                       &nPackets, 
                                       inCompleteAQBuffer->mAudioData);
if (result)
    printf("AudioFileReadPackets failed: %d", (int)result);
if (nPackets > 0) {
    inCompleteAQBuffer->mAudioDataByteSize = numBytes;      
    inCompleteAQBuffer->mPacketDescriptionCount = nPackets;     

//My modification starts from here
//Modifying audio data

SInt16 *testBuffer = (SInt16*)inCompleteAQBuffer->mAudioData;   
for (int i = 0; i < (inCompleteAQBuffer->mAudioDataByteSize)/sizeof(SInt16); i++)
    {           
        //printf("before modification %d", (int)*testBuffer);   
        *testBuffer = (SInt16) *testBuffer/2; //Say some simple modification
        //printf("after modification %d", (int)*testBuffer);    

        testBuffer++;
        }

AudioQueueEnqueueBuffer(inAQ, inCompleteAQBuffer, 0, NULL);

}

Во время отладки данные в буфере отображаются должным образом, но фактический вывод - только шум.

Вот некоторые другие странные поведения кода, которые сводят с ума всю команду:

  1. Если в данных нет изменений (добавьте / подпишите на 0, умножьте на 1) или весь буфер будет присвоен константе (скажем, 0, тогда звук будет отключен), воспроизведение ведется нормально (Конечно!) Но если я выполню что-то большее, это все равно окажется шумом.

  2. В случае, когда я жестко кодирую один тон в качестве тестового звука, выходной шум распространяется и на другой канал.

Так где же ошибка в этом коде? Или, если я нахожусь на неправильной дорожке, каков правильный подход к изменению аудиоданных и выполнению воспроизведения ПРАВИЛЬНО? Любое понимание будет искренне оценено.

Большое спасибо: -)

Приветствия

Манка

1 Ответ

0 голосов
/ 13 января 2011

ВЫ УВЕРЕНЫ, что образец формата - SInt16? А сколько там каналов? Кажется, вы рассматриваете звук как одноканальный короткий поток, но предположим, что формат на самом деле является двухканальным Float32 или около того, и вы вносите в него изменения, тогда эффект будет точно , как вы описываете, включая шум на других каналах.

...