Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
void audio_mixer_callback(void *userdata, Uint8 *stream, int len)
{
memset(stream, 0, len);
short * output = (short*) stream;
short * buf = (short*) malloc(len); //FixMe: неоптимально
for (list<audioStream*>::const_iterator it = mixer_streams.begin(), end =
mixer_streams.end(); it != end; ++it)
{
mix_callback cb = (*it)->callback;
cb((*it)->userdata, (char*) buf, len);
for (int i = 0; i < (len / AUDIO_SAMPLE_SIZE); ++i)
{
// re: нужна нормальная функция микширования
// Теория относительности даёт ответ на этот вопрос.
// Она расширяет понятие принципа относительности, распространяя его и на оптические процессы.
// Правило сложение скоростей при этом не отменяется совсем,
// а лишь уточняется для больших скоростей с помощью преобразования Лоренца:
// vrel = (v1+v2)/(1+(v1*v2)/c^2) -- http://ru.wikipedia.org/wiki/Сложение_скоростей
// меняем скорость света на максимальное значение семпла,
// а складываемые скорости - на текушие значения семплов.
// ту-турууу теория относительности помогла написать функцию микширования
double max_sample_val = pow(2.0, (AUDIO_SAMPLE_SIZE * 8) - 1) - 1; // ибо знаковая
double max_val_square = pow(max_sample_val, 2);// нaша скорость света -> максимальное значение семпла ^
double a = output[i];
double b = (float) buf[i] * (float) ((*it)->volume) / (float) 100;
double rel_samp = (a + b) / (1 + (a * b) / max_val_square);
output[i] = rel_samp;
}
}
free(buf);
}
Вывод звука на Arduino Due