Я пишу редактор звуковой волны в Cocoa с широким диапазоном параметров масштабирования. В самом широком смысле, он показывает форму волны для всей песни (~ 10 миллионов образцов в поле зрения). В самом узком, он показывает точное пиксельное представление звуковой волны (~ 1 тыс. Выборок в представлении). Я хочу, чтобы плавный переход между этими уровнями масштабирования. Некоторые коммерческие редакторы вроде Ableton Live, похоже, делают это очень недорого.
Моя текущая реализация удовлетворяет желаемому диапазону масштабирования, но неэффективна и изменчива. Дизайн во многом вдохновлен этой замечательной статьей о рисовании сигналов с кварцем:
http://supermegaultragroovy.com/blog/2009/10/06/drawing-waveforms/
Я создаю несколько CGMutablePathRef для аудиофайла на различных уровнях сокращения. Когда я увеличен до конца, я использую путь, который был уменьшен до одной точки на х-тысячу выборок. Когда я увеличен до конца, я использую этот путь, который содержит точку для каждого образца. Я масштабирую траекторию горизонтально, когда я нахожусь между уровнями сокращения. Это становится функциональным, но все еще довольно дорого и артефакты появляются при переходе между уровнями сокращения.
Одна мысль о том, как я могу сделать это дешевле, - это вывести сглаживание. Форма волны в моем редакторе сглажена, а в Ableton нет (см. Сравнение ниже).
Я не вижу способа отключить сглаживание для CGMutablePathRef. Есть ли альтернатива CGMutablePathRef, не поддерживающая сглаживание, в мире Cocoa? Если нет, знает ли кто-нибудь о некоторых классах OpenGL или пример кода, которые могут повлиять на курс, чтобы сделать мою огромную линию более эффективной?
Обновление 1-21-2014: Там теперь отличная библиотека, которая делает именно то, что я искал: https://github.com/syedhali/EZAudio