Плеер под MacOS, похожий на AIMP, версия 1.8 (бета)

Продолжаю дальше птихоньку запиливать функционал плейера, который будет очень похож на AIMP. Как назвать эту статью - лучше не придумал. Накопилось достаточно большое количество изменений, которые я не хочу растягивать по разным статьям. Сделаю это в одной статье.

Кроме различных фиксов было добавлено нового:

Контекстное меню у плейлистов

Частично реализованый функционал меню плейлистов. 
Частично реализованый функционал меню плейлистов. 

Отображение информации по радиостанции с возможностью "сохранения тегов" и отображения дополнительной информации

Информация о радиостанции. 
Информация о радиостанции. 

Предзагрузка следующего трека с середины трека, но не позже чем за минуту до конца

Воспроизведение -> звук -> выход -> предзагрузка следующего трека.
Воспроизведение -> звук -> выход -> предзагрузка следующего трека.

В AIMP в настройках вывода звука есть галочка "Предзагрузка следующего трека (требуется больше памяти)", и у меня она всегда стояла включённой. Теперь такая же есть и в моём плеере, и по умолчанию тоже включена.

Смысл простой: пока играет трек, плеер заранее открывает следующий файл. Раньше он делал это ровно тогда, когда файл уже был нужен, то есть прямо на стыке. С локального диска этого не слышно, а вот с сетевой папки или с внешнего диска, который успел уснуть за длинный микс, начало следующего трека могло запнуться. Теперь диск просыпается где-то посреди предыдущего трека, и этого никто не замечает.

Когда именно открывать, я подсмотрел у самого AIMP. В списке изменений сказано, что предзагрузка начинается с середины трека, но не позже чем за минуту до конца. Так и сделал.

Заодно плеер заранее "прослушивает" следующий трек (это работает даже с выключенной галочкой). Отсюда бонус, которого раньше не было: тихое начало трека пропускается уже при первом прослушивании, длинные паузы внутри тоже, громкость выравнивается с первой секунды, а волна в полосе позиции появляется сразу. Раньше всё это получалось точно только на повторе.

Если следующего файла нет на месте (переименовали, отключили диск), плеер заметит это заранее: строка в плейлисте помечается, пока ещё играет текущий трек, и готовится тот, что стоит за ней.

Цену по памяти я честно замерил: один заранее открытый файл стоит столько, сколько выставлено в "Размере кэша", по умолчанию около 10 МБ. Это написано и в подсказке к галочке, вместо загадочного "требуется больше памяти".

Отдельно повозился с тем, что после смены устройства вывода заранее открытый файл норовил остаться на старом устройстве. Поймал это замером раньше, чем оно успело кому-нибудь испортить переключение на наушники.

Заблокированные пункты кнопок футера ожили

Некоторые пункты меню кнопок в футере были неактивными. Наконец дошли руки реализовать для них функционал. Также вместе с этим были добавлены иконки к некоторым пунктам меню как это сделано в AIMP.

Функционал меню футера "-" плюс иконки.
Функционал меню футера "-" плюс иконки.

AudioUnit

В плеере появились плагины. Как DSP-плагины в AIMP, только маковские: эффекты AudioUnit, которые уже стоят в системе.

Ставишь в цепочку что угодно: эквалайзеры и реверберацию, которые есть на любом маке, FabFilter, бесплатный анализатор SPAN от Voxengo, эффекты из App Store. Порядок сверху вниз - это порядок звучания, его можно менять перетаскиванием (эквалайзер до реверберации и после звучит по-разному, это слышно). Галочка выключает эффект, не теряя его настроек, гаечный ключ открывает окно самого плагина, и всё это переживает перезапуск. У эффектов Apple своего окна нет, они открываются системной панелью.

Эффект стоит один на весь звук, а не на каждый трек. Поэтому он слышит оба трека при сведении: хвост реверберации не обрывается на смене песни и доигрывает после "Стоп".

Включение AudioUnit плагна
Включение AudioUnit плагна
Добавление включенного плагина в цепочку аудиотракта 
Добавление включенного плагина в цепочку аудиотракта 
Настройка плагина по нажатию на ключик 
Настройка плагина по нажатию на ключик 

VST® 3

В плеере заработали плагины VST® 3 - второй большой формат на маке, и часть плагинов выходит только в нём.

Встают они в ту же цепочку, что и AudioUnit: порядок сверху вниз, галочка, гаечный ключ, перетаскивание. Рядом с названием значок формата, чтобы было видно, кто есть кто. Если плагин стоит в двух форматах сразу (у FabFilter так почти всё), плеер предлагает его один раз, в AudioUnit, а VST3 - когда AudioUnit выключен в "Плагинах". В менеджере видны обе строки.

Окно плагина открывается прямо в плеере: эквалайзер рисует спектр под музыку, окно тянется за уголок, настройки переживают перезапуск. Новый плагин, положенный в папку, появляется в списке сам, без перезапуска, а поставить его можно и из плеера.

Тут пришлось выбирать. Чужой AudioUnit система держит в отдельном процессе, а у VST3 такого хозяина нет, и он работает внутри плеера. Значит, упал плагин - упал и плеер. Зато при следующем запуске плеер сам разберётся, кто виноват, и поднимется уже без него, с пометкой "упал" в списке. Проверял на тестовом VST3 плагине, который я специально написал так, чтобы он падал через две секунды звука.

И да, правила Steinberg просят ставить их логотип рядом с упоминанием VST, поэтому он теперь есть и в окне "О приложении".

Плеер под MacOS, похожий на AIMP, версия 1.8 (бета)
Включение VST3 плагина
Включение VST3 плагина
Добавление включенного VST3 плагина в цепочку аудиотракта 
Добавление включенного VST3 плагина в цепочку аудиотракта 
Настройка VST3 плагина по нажатию на ключик 
Настройка VST3 плагина по нажатию на ключик 

Свои плагины

В плеере появились свои плагины, как дополнения в AIMP. Первый из них я написал сам - Яндекс Музыка.

Начинал я вообще со Spotify, но выяснилось, что новым аккаунтам он ключ к звуку больше не выдаёт, и честного способа это обойти нет. Яндекс оказался куда сговорчивее.

После включения плагина плагин добавляет пункт меню "Настройки". 
После включения плагина плагин добавляет пункт меню "Настройки". 
Настройки, которые сам реализует плагин 
Настройки, которые сам реализует плагин 

Как это выглядит. У плагина в настройках своя страница: жмёшь "Войти", плагин показывает код и открывает браузер, вводишь код там - и всё, вход запоминается. Дальше просто вставляешь ссылку на трек, альбом или плейлист с music.yandex.ru (или перетаскиваешь её из браузера прямо в плейлист), и они становятся обычными строками: с названием, исполнителем и обложкой. Можно разом забрать "Мне нравится" и все свои плейлисты, каждый в свою вкладку.

Выполнен вход
Выполнен вход

Играют эти треки как файлы: перемотка, сведение, волна. В плейлисте они стоят своей группой "Яндекс Музыка", а формат и битрейт появляются, когда трек впервые сыграет - честные, из самого звука, а не со слов сервиса.

Импортированные плейлисты из Яндекс Музыки. Сейчас играет трек из этого плейлиста.
Импортированные плейлисты из Яндекс Музыки. Сейчас играет трек из этого плейлиста.

Менеджер плагинов тоже подрос: "Плагины" теперь отдельный раздел настроек, плагин ставится двойным щелчком по файлу, а новый не включается сам, пока не поставишь галочку. Если плагин уронит плеер, при следующем запуске плеер поднимется уже без него.