Плеер под MacOS, похожий на AIMP, версия 1.8 (бета)
Продолжаю дальше птихоньку запиливать функционал плейера, который будет очень похож на AIMP. Как назвать эту статью - лучше не придумал. Накопилось достаточно большое количество изменений, которые я не хочу растягивать по разным статьям. Сделаю это в одной статье.
Кроме различных фиксов было добавлено нового:
Контекстное меню у плейлистов
Отображение информации по радиостанции с возможностью "сохранения тегов" и отображения дополнительной информации
Предзагрузка следующего трека с середины трека, но не позже чем за минуту до конца
В AIMP в настройках вывода звука есть галочка "Предзагрузка следующего трека (требуется больше памяти)", и у меня она всегда стояла включённой. Теперь такая же есть и в моём плеере, и по умолчанию тоже включена.
Смысл простой: пока играет трек, плеер заранее открывает следующий файл. Раньше он делал это ровно тогда, когда файл уже был нужен, то есть прямо на стыке. С локального диска этого не слышно, а вот с сетевой папки или с внешнего диска, который успел уснуть за длинный микс, начало следующего трека могло запнуться. Теперь диск просыпается где-то посреди предыдущего трека, и этого никто не замечает.
Когда именно открывать, я подсмотрел у самого AIMP. В списке изменений сказано, что предзагрузка начинается с середины трека, но не позже чем за минуту до конца. Так и сделал.
Заодно плеер заранее "прослушивает" следующий трек (это работает даже с выключенной галочкой). Отсюда бонус, которого раньше не было: тихое начало трека пропускается уже при первом прослушивании, длинные паузы внутри тоже, громкость выравнивается с первой секунды, а волна в полосе позиции появляется сразу. Раньше всё это получалось точно только на повторе.
Если следующего файла нет на месте (переименовали, отключили диск), плеер заметит это заранее: строка в плейлисте помечается, пока ещё играет текущий трек, и готовится тот, что стоит за ней.
Цену по памяти я честно замерил: один заранее открытый файл стоит столько, сколько выставлено в "Размере кэша", по умолчанию около 10 МБ. Это написано и в подсказке к галочке, вместо загадочного "требуется больше памяти".
Отдельно повозился с тем, что после смены устройства вывода заранее открытый файл норовил остаться на старом устройстве. Поймал это замером раньше, чем оно успело кому-нибудь испортить переключение на наушники.
Заблокированные пункты кнопок футера ожили
Некоторые пункты меню кнопок в футере были неактивными. Наконец дошли руки реализовать для них функционал. Также вместе с этим были добавлены иконки к некоторым пунктам меню как это сделано в AIMP.
AudioUnit
В плеере появились плагины. Как DSP-плагины в AIMP, только маковские: эффекты AudioUnit, которые уже стоят в системе.
Ставишь в цепочку что угодно: эквалайзеры и реверберацию, которые есть на любом маке, FabFilter, бесплатный анализатор SPAN от Voxengo, эффекты из App Store. Порядок сверху вниз - это порядок звучания, его можно менять перетаскиванием (эквалайзер до реверберации и после звучит по-разному, это слышно). Галочка выключает эффект, не теряя его настроек, гаечный ключ открывает окно самого плагина, и всё это переживает перезапуск. У эффектов Apple своего окна нет, они открываются системной панелью.
Эффект стоит один на весь звук, а не на каждый трек. Поэтому он слышит оба трека при сведении: хвост реверберации не обрывается на смене песни и доигрывает после "Стоп".
VST® 3
В плеере заработали плагины VST® 3 - второй большой формат на маке, и часть плагинов выходит только в нём.
Встают они в ту же цепочку, что и AudioUnit: порядок сверху вниз, галочка, гаечный ключ, перетаскивание. Рядом с названием значок формата, чтобы было видно, кто есть кто. Если плагин стоит в двух форматах сразу (у FabFilter так почти всё), плеер предлагает его один раз, в AudioUnit, а VST3 - когда AudioUnit выключен в "Плагинах". В менеджере видны обе строки.
Окно плагина открывается прямо в плеере: эквалайзер рисует спектр под музыку, окно тянется за уголок, настройки переживают перезапуск. Новый плагин, положенный в папку, появляется в списке сам, без перезапуска, а поставить его можно и из плеера.
Тут пришлось выбирать. Чужой AudioUnit система держит в отдельном процессе, а у VST3 такого хозяина нет, и он работает внутри плеера. Значит, упал плагин - упал и плеер. Зато при следующем запуске плеер сам разберётся, кто виноват, и поднимется уже без него, с пометкой "упал" в списке. Проверял на тестовом VST3 плагине, который я специально написал так, чтобы он падал через две секунды звука.
И да, правила Steinberg просят ставить их логотип рядом с упоминанием VST, поэтому он теперь есть и в окне "О приложении".
Свои плагины
В плеере появились свои плагины, как дополнения в AIMP. Первый из них я написал сам - Яндекс Музыка.
Начинал я вообще со Spotify, но выяснилось, что новым аккаунтам он ключ к звуку больше не выдаёт, и честного способа это обойти нет. Яндекс оказался куда сговорчивее.
Как это выглядит. У плагина в настройках своя страница: жмёшь "Войти", плагин показывает код и открывает браузер, вводишь код там - и всё, вход запоминается. Дальше просто вставляешь ссылку на трек, альбом или плейлист с music.yandex.ru (или перетаскиваешь её из браузера прямо в плейлист), и они становятся обычными строками: с названием, исполнителем и обложкой. Можно разом забрать "Мне нравится" и все свои плейлисты, каждый в свою вкладку.
Играют эти треки как файлы: перемотка, сведение, волна. В плейлисте они стоят своей группой "Яндекс Музыка", а формат и битрейт появляются, когда трек впервые сыграет - честные, из самого звука, а не со слов сервиса.
Менеджер плагинов тоже подрос: "Плагины" теперь отдельный раздел настроек, плагин ставится двойным щелчком по файлу, а новый не включается сам, пока не поставишь галочку. Если плагин уронит плеер, при следующем запуске плеер поднимется уже без него.