Как настроить панорамирование звука с помощью RtAudio

Я использую библиотеку Rtaudio, и я хотел бы реализовать аудиопрограмму, в которой я могу управлять панорамированием (например, сдвигать звук с левого канала на правый канал).

В моем конкретном случае я использую дуплексный режим (вы можете найти пример здесь: дуплексный режим). Это означает, что я связываю вход микрофона с выходом динамика.

Должен ли я применять фильтр к выходному буферу? Что за фильтр?
Кто-нибудь может мне помочь?


person user1801724    schedule 06.11.2012    source источник


Ответы (1)


Чтобы уменьшить сигнал слева, просто умножьте каждую выборку слева на число, меньшее или равное 1, назовем его l. Точно так же для правого мы назовем это число r. Вообще говоря, вы не хотите умножать на число больше 1, иначе вы можете исказить сигнал.

l и r являются функциями «положения панорамирования». Как вы переходите от положения панорамы к вашим числам, является предметом некоторого обсуждения. Если это что-то простое, вы можете просто уменьшать значения линейно, используя эти значения в крайних значениях:

Hard Left:
l=1; r=0
Center:
l=1; r=1
Hard Right:
l=0; r=1;

Если это что-то более причудливое, вам следует поискать в Google «pan law». Вот пример, который выглядит как хорошее начало:

http://www.kvraudio.com/forum/viewtopic.php?p=4264576

ОБНОВЛЕНИЕ: я никогда не использовал звук RT (обычно я использую PortAudio, который похож), но я думаю, что код для панорамирования будет выглядеть примерно так, с l и r, как определено выше (при условии, что тип int32_t - 32-битное целое число со знаком) :

int inout( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
           double streamTime, RtAudioStreamStatus status, void *data )
{
  if ( status ) std::cout << "Stream over/underflow detected." << std::endl;

  int32_t *ob = (int32_t *)outputBuffer;
  int32_t *in = (int32_t *)inputBuffer;

  unsigned long *bytes = (unsigned long *) data;
  int i =0;
  while( i < bytes / 4 ) {
     ob[i] = (int32_t) ( ib[i] * l + .5 );
     ++i;
     ob[i] = (int32_t) ( ib[i] * r + .5 );
     ++i;
  }
  return 0;
}
person Bjorn Roche    schedule 06.11.2012
comment
На самом деле, это не то, что мне нужно. Если вы начнете с примера с дуплексным режимом, у меня есть один аудио *outputBuffer в функции inout. Как я могу изменить этот буфер, чтобы получить панорамирование? Я имею в виду простое панорамирование 2D-аудио. - person user1801724; 07.11.2012
comment
Я добавил пример кода, не уверен, что он правильный, но он даст вам представление. Возможно, было бы проще использовать данные с плавающей запятой, которые, я думаю, поддерживает RtAudio. Кроме того, к вашему сведению, большинство людей говорят о 2D-панорамировании, чтобы не было путаницы, но на самом деле это 1D. - person Bjorn Roche; 07.11.2012