Удаление тишины, детект настоящих перегрузок, информации о файле, редактор тэгов, запись радиостанции с перекодированием

Продолжю дальше потихонечку пилить музыкальный плейер, похожий на АIMP для MacOS. Выпустил бету RGMP 1.7 в которой исправлены некоторые недочеты и добавлен новый функционал:

Удаление тишины

Настройки удаления тишины
Настройки удаления тишины

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

Теперь плеер сам находит, где в файле начинается и кончается звук, и играет трек от одного до другого. Сведение отсчитывается от конца звука, а не файла, так что следующий трек заходит на музыку.

Вторая половина - тишина внутри трека. Это скорее про записи эфира: станция пропала на пару секунд, а в записи остался провал. Пауза длиннее заданной длительности сокращается до неё. Как в AIMP, первые полсекунды тишины слышно, остальное плеер пропускает, и полоса позиции просто перескакивает этот кусок. Длительность на экране остаётся длиной файла, чтобы плейлист и полоса не спорили друг с другом.

Детект настоящих перегрузок

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

Информации о файле и редактор тэгов

Информация о файле и редактор тегов
Информация о файле и редактор тегов

Сделал в плеере редактор тегов. В AIMP это окно открывается из меню трека пунктом "Информация о файле", у меня теперь так же, а ещё по ⌘I.

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

Редактор тегов. 
Редактор тегов. 

Вкладки как в оригинале: "Общее", "Текст песни" и по вкладке на каждый тег, который в файле есть или может быть. У MP3 их два - старый короткий ID3v1 и нормальный ID3v2, у FLAC свой, у APE свой. Если тега в файле нет, вкладка просто пустая: заполнил, сохранил - тег появился. Файлы M4A пока только показываются, писать в них я не рискнул.

Больше всего времени ушло не на окно, а на то, чтобы не испортить людям их музыку. Файл с тегами - это чаще всего единственная копия, и если запись пойдёт криво, заметишь это через месяц. Поэтому плеер сначала собирает новый файл рядом, перечитывает его целиком и сверяет: изменилось ровно то, что ты поменял, а всё остальное (чужие поля, которых редактор не понимает, обложки) осталось как было. Только после этого он подменяет старый файл. Если что-то не сошлось, исходный файл просто не трогается. Пока проверял, нашёл ещё одну дыру: если закрыть плеер прямо во время сохранения большого файла, запись обрывалась на середине. Теперь плеер дожидается.

Править можно и тот трек, который сейчас играет: музыка не прерывается, а наверху сразу появляется новое название.

Запись радиостанции с перекодированием

Выбор формата перекодирования 
Выбор формата перекодирования 
Настройки параметра перекодирования для формата 
Настройки параметра перекодирования для формата 

Запись радио в плеере научилась двум вещам, ради которых её, собственно, и включают.

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

Вторая - перекодирование. До сих пор плеер сохранял поток ровно таким, каким он пришёл, и это по-прежнему поведение по умолчанию: лучше исходных байтов ничего не бывает. Но если станция передаёт AAC, а надо только MP3, теперь можно выбрать формат (MP3, AAC, Apple Lossless, FLAC, Ogg Vorbis, Opus, WAV или AIFF), битрейт, частоту и моно или стерео. Громкость, эквалайзер и эффекты в запись не попадают: она делается из самого эфира, а не из того, что слышно в наушниках.

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

11