Я использую библиотеку Rtaudio и хотел бы реализовать аудиопрограмму, в которой я могу управлять панорамированием (например, сдвигая звук с левого канала на правый канал).
В моем конкретном случае я использую дуплексный режим (пример можно найти здесь: дуплексный режим). Это означает, что я связываю вход микрофона с выходом динамика.
Должен ли я применить фильтр к выходному буферу? Что за фильтр?
Может кто-нибудь мне помочь?
Чтобы уменьшить сигнал слева, просто умножьте каждую выборку слева на число, меньшее или равное 1, назовем его l. Аналогично для права, мы назовем этот номер r. Вообще говоря, вы не хотите умножать на число больше 1, иначе вы можете вызвать искажение сигнала.
l и r являются функциями «положения панорамирования». Как вы переходите от положения панорамирования к вашим номерам, является предметом некоторого обсуждения. Если это для чего-то простого, вы можете просто линейно уменьшить значения, используя эти значения в крайних значениях:
Hard Left:
l=1; r=0
Center:
l=1; r=1
Hard Right:
l=0; r=1;
Если это что-то причудливое, вы должны погуглить по «закону о панорамировании». Вот пример, который выглядит как хорошее начало:
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;
}
Других решений пока нет …