Манипулирование AudioQueueBuffer аудио данными приводит к шуму - PullRequest
2 голосов
/ 17 января 2010

Я пытаюсь реализовать приложение для обработки звука на iPhone, используя пример приложения SpeakHere в качестве отправной точки. Приложение включает в себя манипулирование буферизованными аудиосэмплами во время воспроизведения. Когда я умножаю выборки на дробное число (например, 0,9), я получаю шум в результате. Самое странное в этом то, что при умножении сэмплов на целые числа (например, 1,0, 2,0) или добавлении или вычитании из них воспроизведение звучит, как и ожидалось.

Я делаю это в функции PlayCallback AudioPlayer.m со следующим фрагментом кода:

  //------------------
  //If buffer samples are multiplied by 0.9 we get noise. If we multiply it by 1.0 or add to it everything's fine.
  short *buffer = (short *)calloc(1, numPackets * 2);
  memmove(buffer, bufferReference->mAudioData, numPackets * 2);
  for (int i = 0; i < numPackets; i++)
  {
   buffer[i] *= 0.9;
   //buffer[i] *= 1.0;
   //buffer[i] += 10.0;
  }
  memmove(bufferReference->mAudioData, buffer, numPackets * 2);
  free(buffer);
  buffer = NULL;
  //-------------------

Полный проект можно скачать здесь: http://depositfiles.com/files/lmnkq68n8

Может ли кто-нибудь указать мне, что я делаю неправильно? Я боролся с этим уже пару дней, и я полностью потерян.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 сентября 2014

Вероятно, это всего лишь вопрос преобразования формата с прямым порядком байтов буферов в системный формат с прямым порядком байтов для умножения и повторного сохранения его в буфере как значения с прямым порядком байтов. "js" data-hide = "false">

SInt16* pBuffer = (SInt16*)inCompleteAQBuffer->mAudioData;
for (int i=0; i<44100; i++) {
        sample = CFSwapInt16BigToHost(pBuffer[i]);
        newSample = sample * 0.1;
        pBuffer[i]=CFSwapInt16HostToBig (newSample);
    }
0 голосов
/ 17 января 2010

Я не смог загрузить ваш проект (хостер файлов всегда говорит мне, что все слоты заполнены), но, читая фрагмент, который вы разместили, вы, похоже, умножаете 16-битные целочисленные (короткие) значения со знаком на 0,9 (a значение с плавающей точкой). Это приводит к неявному приведению к короткой позиции. Таким образом, вы теряете все, что находится за десятичной точкой, что, в свою очередь, приводит к эффекту сглаживания в вашем сигнале.

Обновление:
Я проверил твой код, но не смог понять, откуда этот шум.
Почему вы используете memmove для работы с буфером?
Вы можете напрямую получить доступ к буферу с помощью:

SInt16* pBuffer = (SInt16*)inCompleteAQBuffer->mAudioData;

Мне было бы любопытно узнать, что также вызывает этот шум. Так что, если вы узнаете это, пожалуйста, опубликуйте свое решение здесь (может быть, кто-то из списка рассылки Core Audio может помочь - они действительно полезны там)

Если вам просто нужно изменить усиление, вы можете просто использовать AudioQueueSetParameter .
Другой вариант - использовать аудиоустройство RemoteIO вместо AudioQueueServices.

...