В настоящее время я работаю над разработкой аудио 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);
}
Во время отладки данные в буфере отображаются должным образом, но фактический вывод - только шум.
Вот некоторые другие странные поведения кода, которые сводят с ума всю команду:
Если в данных нет изменений (добавьте / подпишите на 0, умножьте на 1) или весь буфер будет присвоен константе (скажем, 0, тогда звук будет отключен), воспроизведение ведется нормально (Конечно!) Но если я выполню что-то большее, это все равно окажется шумом.
В случае, когда я жестко кодирую один тон в качестве тестового звука, выходной шум распространяется и на другой канал.
Так где же ошибка в этом коде? Или, если я нахожусь на неправильной дорожке, каков правильный подход к изменению аудиоданных и выполнению воспроизведения ПРАВИЛЬНО? Любое понимание будет искренне оценено.
Большое спасибо: -)
Приветствия
Манка