Чтобы уменьшить сигнал слева, просто умножьте каждую выборку слева на число, меньшее или равное 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