Под масштабом я полагаю, вы имеете в виду горизонтальное увеличение, а не вертикальное. Аудио редакторы делают это, сканируя wavform, разбивая его на временные окна, где каждый пиксель в X представляет некоторое количество выборок. Это может быть дробное число, но вы можете избежать использования дробных коэффициентов масштабирования, не слишком раздражая пользователя. После небольшого уменьшения максимальное значение всегда является положительным целым числом, а минимальное значение всегда отрицательным целым.
для каждого пикселя на экране, вам необходимо знать минимальное значение выборки для этого пикселя и максимальное значение выборки. Таким образом, вам нужна функция, которая сканирует данные формы сигнала в чанках и отслеживает накопленные максимумы и мин для этого чанка.
Это медленный процесс, поэтому профессиональные аудиоредакторы сохраняют предварительно рассчитанную таблицу минимальных и максимальных значений при некотором фиксированном коэффициенте масштабирования. Это может быть в 512/1 или 1024/1. Когда вы рисуете с коэффициентом масштабирования> 1024 выборок / пиксель, вы используете предварительно рассчитанную таблицу. если вы ниже этого соотношения, вы получаете данные непосредственно из файла. Если вы этого не сделаете, вы обнаружите, что код рисования становится слишком медленным при уменьшении масштаба.
Стоит написать код, который обрабатывает все каналы файла за один проход при выполнении этого сканирования, медлительность здесь заставит всю вашу программу чувствовать себя вялой, здесь важен дисковый ввод-вывод, процессор не имеет проблем с сохранением Итак, простой код C ++ подходит для построения таблиц min / max, но вы не хотите просматривать файл более одного раза и хотите делать это последовательно.
Как только у вас будут минимальные / максимальные столы, держите их рядом. Вы хотите вернуться к диску как можно меньше, и многие причины, по которым вы хотите перекрасить окно, не требуют повторного сканирования ваших таблиц min / max. Стоимость памяти для их хранения не так высока по сравнению с дисками, в первую очередь для их создания.
Затем вы рисуете форму волны, рисуя серию вертикальных линий шириной 1 пиксель между максимальным значением и минимальным значением для времени, представленного этим пикселем. Это должно быть довольно быстро, если вы рисуете из предварительно построенных таблиц min / max.