2011-01-13 4 views
1

В настоящее время я работаю над созданием аудио 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); 

} 

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

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

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

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

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

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

Cheers,

Manca

ответ

0

Вы уверены, что формат выборки SInt16? И сколько каналов есть? Вы, кажется, относитесь к звуку как к короткому потоку с одним каналом, но предположим, что формат на самом деле является двухканальным Float32 или около того, и вы делаете там модификации, чем эффект будет точно, как вы описали, включая шум на других каналах ,

Смежные вопросы