Создав мастер настройки для очень устаревшего, но хорошо известного приложения A / V для проведения конференций, то, что вы описываете, почти идентично тому, что я сделал.
Несколько соображений:
Поставьте в очередь от 5 до 10 из этих буферов 100 мс в аудиоустройство через waveInAddBuffer. IIRC, когда очередь waveIn становится пустой, происходят странные вещи. Затем, когда выполняются обратные вызовы waveInProc, ищите образец с наибольшим абсолютным значением в заполненном буфере, как вы описали. Затем нанесите это на свою визуализацию. Перезапустите заполненные буферы.
Может показаться очевидным линейное отображение значения семпла следующим образом на визуализацию.
Например, для построения 16-битного семпла
// convert sample magnitude from 0..32768 to 0..N
length = (sample * N) / 32768;
DrawLine(length);
Но тогда, когда вы говорите в микрофон, эта визуализация не будет выглядеть «активной» или «яркой».
Но лучшим подходом было бы придание большей силы этим образцам с более низкой энергией. Простой способ сделать это - провести реплотирование вдоль кривой μ-закона (или использовать поиск по таблице).
length = (sample * N) / 32768;
length = log(1+length)/log(N);
length = max(length,N)
DrawLine(length);
Вы можете настроить вышеуказанный подход на любой, который выглядит хорошо.