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