LINUX.ORG.RU

Сбылась мечта идиота

 , ,


3

2

Таки Subj! Мой маленький, грязный хак визуализации аудио-потока.

Поясню: до сих пор графическое представление звука было отдано на откуп главным образам всевозможным плагинам некоторых плееров. И у каждого плеера они свои, а то их и вообще нет. Т.ч. если вы хотите посмотреть на выхлоп mpd или там mplayer, то увы, скорей всего у вас ничего не выйдет.

Мне известна одна единственная программа, позволяющая подобное: extace, но работает она только с Esound и мне к сожалению запустить её за все эти годы так толком и не удалось.

И вот свершилось: в новом релизе OBSD добавили monitoring mode в родной аудио сервер aucat(1), позволяющий считывать обратно то, что на данный момент проигрывает звуковая карта. Конечно, что-то подобное можно соорудить и с ALSA или PulseAudio, но первое это linux-only, да и второго нет под OBSD.

Рад как слон. За код не ругать: это PoC, да и было уже поздно.

★★★★★

Проверено: post-factum ()
Последнее исправление: Dmitry_Sokolowsky (всего исправлений: 1)
Ответ на: комментарий от ChALkeR

красиво.

читаем 16 bit signed из потока и скармливаем это FFT (пока что не нормированно, т.к. я особой разницы не заметил, но думаю таки нормирование добавить), от комплексного выхлопа FFT берём абсолютное значение с коррекцией в sqrt(f) (см. код ниже, так думаю понятней будет), полученый результат скалируем, берём соответствущее значение из палетты и выводим на экран.

void
dofft(fftw_plan plan, double *in, double *out, int n)
{
        int     i;

        memset(out, 0, n * sizeof(double));
        fftw_execute(plan);
        for (i = 1; i < n / 2; i++)
                out[i - 1] = sqrt((out[i] * out[i] + out[n - i] * out[n - i]) * i) / (double)n;
}
beastie ★★★★★
() автор топика
Ответ на: комментарий от beastie

Там не просто FFT.
Там всё бъётся на блоки (это правильно), но дальше от них делается оконное Фурье с перекрытием.
Иначе ерунда будет получаться и назад ты из картинки ничего не соберёшь. Да и некрасиво.

ChALkeR ★★★★★
()
Ответ на: комментарий от beastie

полученый результат скалируем, берём соответствущее значение из палетты и выводим на экран.

Логарифм возьми.

float base = 10*255/decibels;
int value = qBound(0,255 + (int) roundf(
                    base*log10f(spectr_value[c][i][mel?mels[j]:j]/spectr_value_max)
                ),255);

ChALkeR ★★★★★
()
Ответ на: комментарий от ChALkeR

я это тоже уже пробовал, но результат мне что-то не очень понравился. вяло как-то получалось. а вот по поводу оконной функции — это да, это надо добавить.

beastie ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.