LINUX.ORG.RU

PCM Transport - просто аудиоплеер под линукс

 , ,


0

1

Привет всем!

Я сделал небольшой аудиоплеер под линукс для себя, минималистичный, локальный, с некоторыми ностальгическими фичами типа левел метра в духе моего старого панасоник кобры, дисплея как в старом CD плеере и т.п.

Основной формат flac реализован референсно, с качеством Bit-perfect, остальные через ffmpeg (мне не хочется делать много зависимостей). Поддерживается довольно много форматов:

*.flac
*.wav
*.wave
*.aif
*.aiff
*.ape
*.wv
*.bwf
*.au
*.snd
*.caf
*.tak
*.tta
*.mp3
*.m4a
*.aac
*.ogg
*.oga
*.opus
*.wma
*.asf
*.xwma
*.oma
*.aa3
*.at3
*.mpc
*.mp+
*.mpp

А также:

*.cue
*.m3u
*.m3u8

Что бы быть честным, признаю, что я использовал ИИ для помощи.

Мне было бы интересно услышать мнения и отзывы, а если это кому то понравится - это для меня самое приятное.

Плеер естественно открытый, GNU General Public License v3.0.

Для быстрого теста есть AppImage - в AppImage работает все кроме выставления приоритета реального времени (приоритет выставляется в собранной версии).

Нативная сборка работает лучше – на выходе файл 1мб размера, очень минималистичный )))

Надеюсь, что не нарушил правил данного форума )

Страница моего проекта

Сам я постоянный пользователь линукс уже лет 8, и фанат музыки )



Последнее исправление: hobbit (всего исправлений: 3)
Ответ на: комментарий от Loki13

Возможно вариантом будет при открытии каталога m3u не открывать, а только аудио файлы.

Именно. Когда открываешь список, другие списки не нужны.

bbc69
()
Ответ на: комментарий от andrey23512

Уже есть в readme

cmake -S . -B build
cmake --build build -j

По внешнему виду, смотрится интересно у вас.

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

spawn_sp ★★★★
()

Я себе ещё 2 фичи сделал. Есть вопрос, интересны ли они будут для апстрима?

Первая, открытие рекурсивное каталога с музыкой + ленивая загрузка тэгов с помощью ffprobe в отдельном потоке чтобы не блокировался ui.

И вторая, строка фильтра по плейлисту. У меня есть альбом 500 треков в машину и мне стало тяжело по такому количеству ориентироваться без фильтра.

В планах ещё запилить открытие каталога\файла\списка файлов из командной строки, чтобы открывать из терминала или из ФМ по ПКМ.

И ещё один план, сделать сохранение состояния между запусками.

В принципе это всё чего мне на данный момент не хватало или не хватает.

Loki13 ★★★★★
()
Последнее исправление: Loki13 (всего исправлений: 1)
Ответ на: комментарий от Loki13

Я сейчас готовлю версию 0.9.110 - в ней планируется

  • MPRIS (на ~95% ваша реализация + некоторые полировочные моменты),
  • некоторые GUI правки + иконка
  • фикс отображения кривой cp1251 в некоторых форматах (как раз эта проблема с русскими 1251 mp3)
  • сохранение состояния между запусками (как раз это)
  • проигрывание DSD (через ffmpeg) (мне DSD самому не интересен, но это актуальный аудиофильский формат и нужно уметь его играть хотя бы для совместимости)

интересны ли они будут для апстрима?

Первая, открытие рекурсивное каталога с музыкой + ленивая загрузка тэгов с помощью ffprobe в отдельном потоке чтобы не блокировался ui.

Я не хочу это добавлять в плеер, так как не вижу в голове, как это сделать не перегрузив плеер - допустим мы выбираем открыть большой каталог с музыкой (условно 20000 файлов), как это должно отобразится в плеере? Или мы должны открывать только сколько то уровней вложенности, что тоже не изящное решение… Для меня это какой нагромождение и уход от идеи быстрого плеера без обслуживания библиотеки.

Можно было бы сделать открытие каталога не рекурсивное (мне эта идея не близка) (выбрали каталог где лежат файлы и плеер сам смотрит что там ему открыть) - это потребует новую кнопку или опциональное переопределение кнопки открыть, но выигрыш по сравнению с тем как сейчас - выбрать файлы в каталоге - очень маленький.

ленивая загрузка тэгов с помощью ffprobe

Я уже думал об этом, так как не все форматы молниеносно считываются при открытии, это момент который требует обдумывания

И вторая, строка фильтра по плейлисту. У меня есть альбом 500 треков в машину и мне стало тяжело по такому количеству ориентироваться без фильтра.

Хотя у меня нет таких плей листов (500 треков ) , но это не противоречит идеи, поэтому это можно было бы добавить в теории, только есть вопросы как это вписать симпатично в gui.

В планах ещё запилить открытие каталога\файла\списка файлов из командной строки, чтобы открывать из терминала или из ФМ по ПКМ.

Это ок, если это нужно, полезно - можно было бы добавить.

andrey23512
() автор топика
Ответ на: комментарий от andrey23512

Я не хочу это добавлять в плеер, так как не вижу в голове, как это сделать не перегрузив плеер - допустим мы выбираем открыть большой каталог с музыкой (условно 20000 файлов), как это должно отобразится в плеере?

Сделал что мгновенно по имени файла. А потом в фоновом потоке подгружаются тэги. У меня для 500 файлов примерно пол минуты(это HDD). Но слушать можно сразу.

Я уже думал об этом, так как не все форматы молниеносно считываются при открытии, это момент который требует обдумывания

Могу скинуть ссылку на ветку, где это запилил(совместно с открытием каталога, да).

Хотя у меня нет таких плей листов (500 треков ) , но это не противоречит идеи, поэтому это можно было бы добавить в теории, только есть вопросы как это вписать симпатично в gui.

На данный момент вот так:

https://s6.iimage.su/s/20/gWTCEU3xP2RMwvzJY0H0mEdmndwPfRLz5NIVkD1uk.png

Фильтрует по исполнителю и треку. По нажатию очистить(справа в фильтре) или стерев BkSpace появляются обратно все треки.

Loki13 ★★★★★
()
Последнее исправление: Loki13 (всего исправлений: 1)
Ответ на: комментарий от Loki13

И ещё наверное запилю со временем работу с m3u с интернет радиостанциями. Люблю. иногда послушать потоковое аудио.

Да, интернет радиостанции это востребованная фича для многих, и в дальнейшем стоит ее прикрутить

andrey23512
() автор топика
Ответ на: комментарий от Loki13

Это не к спеху, пока хотелось бы отточить локальное проигрывание. Т.е. это не прям ближайший план, это как мысли на будущее. Просто замечу, если будет реализация интернет радио, важно не создавать новые зависимости еще - делать через ffmpeg и ffprobe.

andrey23512
() автор топика
Ответ на: комментарий от andrey23512

Первая, открытие рекурсивное каталога с музыкой

Как компромисс - рекурсивное открытие каталогов можно вынести за пределы основного плеера, что бы было проще в дальнейшем.

В отдельную консольную утилиту, shell-скрипт или действие файлового менеджера.

Такое решение может рекурсивно собирать поддерживаемые файлы, формировать временный M3U и открывать его в плеере.

Это сохраняет основной плеер компактным, а нужная функция полностью остаётся на стороне дополнения.

Добавлять именно в плеер полноценно я пока не хочу - такая функция заметно меняет модель плеера (((

andrey23512
() автор топика
Последнее исправление: andrey23512 (всего исправлений: 1)
Ответ на: комментарий от Loki13

На данный момент вот так:https://s6.iimage.su/s/20/gWTCEU3xP2RMwvzJY0H0mEdmndwPfRLz5NIVkD1uk.png

Довольно симпатично, я в голове примерно так и представлял себе - как это могло бы быть. (утром ссылка не открывалась, сейчас посмотрел)

andrey23512
() автор топика
Последнее исправление: andrey23512 (всего исправлений: 1)
Ответ на: комментарий от andrey23512

Я там довольно много собак съел сейчас пока делал. Чтобы не подлагивал интерфейс при подгрузке.

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

Я все фичи делаю отдельными ветками и общую my_patches из которой собираю уже версию для себя.

https://github.com/loki1368/pcm-transport/branches

Посмотрите что у меня там, если что-то будет полезно для апстрима, то могу оформить PR.

- cursor/internet-radio - потоковое интернет радио. вроде получилось неплохо, пришлось повозится(особенно с тем чтобы помечать битые станции и не зависать на них).

- cursor/open-directory-playlist - открытие каталогов и ленивая загрузка для тэгов.

- cursor/playlist-search - поиск и фильтр по плейлисту.

- cursor/session - сохранение сессии и загрузка при следующем старте

- cursor/compact-text-controls - Это точно не интересно, я искал почему в Hyprland глючит интерфейс в master layout.

Loki13 ★★★★★
()
Последнее исправление: Loki13 (всего исправлений: 4)
Ответ на: комментарий от Loki13

Я PR делать наверное не буду, мы скорее всего разошлись сильно. Но в репу свою конечно все ветки залью.

Да, конечно, без проблем. Я только приветствую форк! :)

Посмотрите что у меня там, если что-то будет полезно для апстрима, то могу оформить PR.

Текущий релиз 0.9.110 уже готовлю с тем что есть. Для следующего релиза , буду иметь ввиду, спасибо!

Но в репу свою конечно все ветки залью.

Отлично!

andrey23512
() автор топика
Ответ на: комментарий от andrey23512

Готов релиз PCM Transport v0.9.110

GitHub

В целом, главные улучшения:

  • значительно улучшено понимание разных кейсов с кодировками, теперь «Сектор Газа» запоет по новому :) Если серьезно, разные гуляющие русские mp3 (и другие файлы) в кодировках cp1251, должны нормально отображаться, так же плей листы и cue cp1251 должны нормально находить файлы
  • значительно улучшена обработка мета тегов для разных редких форматов
  • теперь ленивая загрузка файлов при открытии
  • опционально сохранение последнего открытого при новом запуске
  • улучшен интерфейс (более аккуратные отступы) + иконка
  • MPRIS поддержка (спасибо: Loki13) (Loki13 сделал основную работу, от меня была доп оптимизация и некоторые правки уже после merge)
  • поддержка DSD (DSF, DFF), а так же W64, MP2, M4R, AC3, SPX, VOC, RA, DTS
  • фикс cue парсинга для hires файлов
  • улучшение диагностических тестов ALSA вывода
andrey23512
() автор топика
Ответ на: комментарий от andrey23512

Влил в совй форк, максимально переходя на реализации из апстрима. Заметил, что у меня ленивая загрузка была корректнее. Быстрее, видимо из-за многопоточности, а также можно было включать трек не дожидаясь загрузки всех метаданных. Могу попробовать доработать ваш вариант и предложить PR.

Loki13 ★★★★★
()

Заметил что в версии 0.9.110 перестал растягиваться регулятор громкости на всю высоты плейлиста, вот эта строчка:

gtk_box_pack_start(GTK_BOX(softvol_box), soft_volume_scale_, FALSE, FALSE, 0);

вместо того как было:

gtk_box_pack_start(GTK_BOX(softvol_box), soft_volume_scale_, TRUE, TRUE, 0);

Это так задумано? Мне показалось что выглядеть стало хуже в случае когда в тайлинге проигрыватель растягивается на всю высоту тайла. А в changelog про это ничего не было сказано.

Loki13 ★★★★★
()
Последнее исправление: Loki13 (всего исправлений: 1)
Ответ на: комментарий от Loki13

Мне хотелось, что бы софт громкость не тянулась в спагетти при увеличении высоты плеера, т.е. та высота громкости, которая есть в стандартном окне - она не меняется теперь осознанно. Извиняюсь, что потерял это в changelog

andrey23512
() автор топика
Ответ на: комментарий от Loki13

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

Она сейчас примерно такого размера - как обычная ручка на микшере - то как мне видится.

andrey23512
() автор топика
Последнее исправление: andrey23512 (всего исправлений: 1)
Ответ на: комментарий от Loki13

Можно при растягивании там что то добавить декоративное, не знаю пока что, просто сама ручка на мой вкус не должна тянуться

andrey23512
() автор топика
Ответ на: комментарий от andrey23512

Собрал 0.9.111

github

0.9.111

  • Improve lazy metadata loading performance and early playback, based on work contributed by loki1368 (Спасибо!).
  • Refine pending playback and metadata finalization for reliable playback while metadata is still loading.
  • Add opening of local files and directories from Linux file managers and positional command-line arguments.
  • Route file-open requests to the existing application instance.
  • Add asynchronous recursive directory scanning with cancellation, natural ordering and duplicate suppression.
  • Register supported audio, CUE, M3U/M3U8 and directory MIME types.
  • Add multi-file CUE playback across all supported audio formats.
  • Prefer valid single-file CUE sheets during directory scans while avoiding duplicate split-file and playlist entries.
  • Preserve opened directories as top-level sources for startup restoration.
  • Restore vertical soft-volume control expansion.

p.s. вернул громкость, что бы тянулась;

p.s. 2: Открытие каталогов из файловых менеджеров - как удобство интеграции в DE - сам плеер по прежнему я вижу как плеер для открытия 1 альбома (как я его задумывал), поэтому в нем пока нет кнопки открыть каталог;

p.s. 3: Loki13 я вижу PR, спасибо, но скорее всего мы сейчас сильно разошлись, давайте пока их отложим немного, нужно синхронизироваться и погонять плеер, посмотреть как все работает :)

andrey23512
() автор топика
Последнее исправление: andrey23512 (всего исправлений: 4)

Учитывая плотную и плодотворную совместную работу, предлагаю обменятся какими нибудь более удобными контактами. Тут странно. PR на github не подразумевают свободного общения. А есть некоторые моменты которые хотелось бы иногда проговорить.

Loki13 ★★★★★
()
Последнее исправление: Loki13 (всего исправлений: 1)
Ответ на: комментарий от Loki13

Из не предложенных PR осталось internet radio. Я его уже несколько дней отлаживаю, но хотелось бы его после session предложить, он объемный и там есть некоторые зависимости от сессий.

Ну и есть несколько идей, которые просто по UI\UX, тут надо понимать видение автора прежде чем предлагать.

Loki13 ★★★★★
()
Ответ на: комментарий от Loki13

Если контакты давать не хочется, то может быть откроете GitHub Discussions? Там можно поговорить.

Loki13 ★★★★★
()
Ответ на: комментарий от Loki13

Да, конечно, я написал контакт в комментарии к Persist playlist and current track across restarts, потом просто удалю там комментарий, как увижу письмо

andrey23512
() автор топика
Ответ на: комментарий от andrey23512

Собрал 0.9.111

github

Собрал 0.9.112

Из главного

Добавлен фильтр поиска, теперь отображается Альбом, улучшено выравнивание списков, теперь можно файлы или папки перетаскивать мышкой из папки в плеер (кидать в плеер прямо), на кнопке открыть по правому клику открытие папок; + Так же исправление ошибок.

github

0.9.112

  • Initial playlist filter implementation contributed by @loki1368.
  • Further filter integration, optimization, bug fixes and release polishing.
  • Add Album metadata to FLAC, FFprobe, CUE and WAV/BWF probes, including RIFF INFO and embedded-ID3 fallback; publish Album through MPRIS xesam:album.
  • Parse WAV RIFF INFO Artist, Title, Album and ITRK/IPRT track numbers through the fast metadata path.
  • Add drag-and-drop opening of local files, CUE, M3U/M3U8 and directories.
  • Add right-click directory selection to the existing Open button.
  • Refine playlist layout and sizing.
  • Improve the settings-saving algorithm.
  • Release the playlist model reference when the main window is destroyed and tie DSP size groups to the dialog lifetime.
  • Improve alignment of GUI display elements.
andrey23512
() автор топика
Ответ на: комментарий от andrey23512

Готова версия 0.9.113 !

Это большое обновление, главное:

  • ! переход с ffmpeg cli –> FFmpeg shared libraries: libavformat, libavcodec, libavutil and libswresample , как следствие повышение скорости, отзывчивости;

Изменилась сборка, на некоторых системах может потребовать установка соответствующих библиотек (штатные для ffmpeg)

  • переосмысление gapless политики. например, теперь возможны бесшовные переходы раздельных файлов вида m4a–>flac; wv–>mp3; ape–>tak; wav–>flac и т.п.
  • сортировка плейлистов в любом направлении
  • появление random; теперь есть комбинации repeat; random; random+repeat; normal
  • запоминание последнего трека, настройка количества строк плей листа при открытии плеера
  • переработка level meter и общая оптимизация скорости

Полный лог:

  • Replace FFmpeg and FFprobe command-line processes with direct FFmpeg API integration for playback, seeking and metadata probing; building now requires the FFmpeg development libraries listed in README.
  • Rework gapless playback around verified sample boundaries and trusted decoder completion; retain RangeLimitedDecoder for known ranges, improve CUE and resampled transitions, and remove silence keepalive.
  • Add playlist sorting by track number, artist, title, album and source, with ascending, descending and original-order states while preserving playback and selection.
  • Rework in-process metadata probing with native fast paths for FLAC, MP3 and PCM WAV/BWF, verified sample-count paths for WavPack, APE, TAK, PCM Wave64 and ALAC, a bounded presentation-origin probe for Ogg Vorbis, and bounded validation for raw ADTS AAC. Cache results and use libavformat for remaining formats and ambiguous inputs.
  • Add a unified MODE control for Repeat, Random and Random + Repeat; align navigation, history and availability across the player, media keys and MPRIS.
  • Rework level-meter updates with lock-free peak delivery and time-based ballistics; reduce unnecessary GUI polling while preserving transport responsiveness.
  • Add optional restoration of the last active track and configurable startup playlist height adapted to GTK metrics and the available work area.
  • Preserve native multichannel playback and bypass stereo tonal processing above two channels while retaining soft volume, level metering and clip detection.
  • Improve ALSA setup, fallback negotiation, recovery and diagnostics; keep playback state unpublished until output initialization succeeds.
  • Improve MPRIS track identity, stopped-state selection, seeking, track advancement and state-notification consistency.
  • Improve playlist filtering, metadata updates and interface refresh efficiency.
  • Derive the Lossless indicator from probed codec properties, including correct handling of WavPack hybrid streams.
  • Improve cancellation, error recovery and resource ownership; remove obsolete code and unused state.

github

andrey23512
() автор топика
Последнее исправление: andrey23512 (всего исправлений: 2)
Ответ на: комментарий от anonymous

Готова версия 0.9.114 !

Главное, это переход на событийную (event-driven) модель.

Полный лог:

  • Reworked playback around an event-driven model. Removed periodic transport polling and reduced unnecessary GUI wakeups.
  • Defined the library compatibility baseline: FFmpeg 4.4 or newer and libFLAC 1.3.3 or newer. Added public-API compatibility paths across supported FFmpeg versions.
  • Added verified separate-file gapless support for AIFF/AIF PCM, AU/SND PCM, CAF LPCM and TTA.
  • Added strict AAC-LC/MOV boundary verification. Ambiguous or inconsistent files remain on the normal non-gapless playback path.
  • Added optional character-based width limits for Artist, Title, Album and Source. Full metadata remains available for search, sorting and MPRIS. Default limit: 25 characters.
  • Added exact decoded-span handling for DSF and raw DFF DSD while keeping separate-file DSD gapless disabled.
  • Improved FLAC error handling and exact-range seeking.
  • Added automatic SoXr → FFmpeg SWR fallback and runtime resampler reporting.
  • Improved CUE and gapless transition handling under the new event model.
  • Improved Search window resizing and preference saving; removed redundant timers.
  • Added runtime library and realtime-service information to About.
  • Removed the obsolete experimental –file console playback path and cleaned up unused code.

github

andrey23512
() автор топика
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария