Репл — крохотный открытый плеер для Мака

в 17:01, , рубрики: mac os x, objective-c, мак, плеер, разработка, метки: , , ,

Некоторое время назад я перешел на Мак и стал подбирать себе софт для повседневного использования. Проблема возникла с аудиоплеером. Я перепробовал множество плееров, но ни один меня не устраивал. Поэтому я решил написать свой собственный. Заодно мне было интересно попробовать разработку на Objеctive-C под Мак.

В результате, у меня получился плеер Репл, что означает "резидентный плеер":

image

Требования к аудиоплееру

По поводу того, каким должен быть аудиоплеер, у меня имеются следующие соображения:

1. Аудиоплееру не нужен графический интерфейс.

Звук идет в фоне, смотреть на него не нужно, поэтому нет никакой необходимости делать для аудиоплеера какой-либо графический интерфейс. Конечно, плеером нужно как-то управлять, но все управление можно свести всего к четырем кнопкам — меню, пуск/пауза, следующий и предыдущий трек.

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

2. Аудиоплееру не нужна собственная библиотека.

Организация хранилища музыки отлично выполняется с помощью файловой системы. В подавляющем большинстве случаев коллекция музыки имеет иерархическую структуру (например, Жанр — Исполнитель — Альбом — Трек), которая без проблем воспроизводится с помощью вложенных папок файловой системы. Более того, из папок можно создать более развесистую структуру, чем из ограниченного набора id3-тегов.

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

3. Аудиоплееру не нужны плейлисты.

Если имеется хорошо организованная, структурированная коллекция треков в файловой системе, то достаточно просто открыть для проигрывания нужные папки. Хочешь — открывай один альбом, хочешь — несколько разных альбомов, хочешь — исполнителя со всеми его альбомами.

Не нужно делать прослойку между файлами и плеером, плеер должен просто играть содержимое диска «как есть».

Разработка

До этого момента я никогда не программировал под Мак вообще и на Objective-C в частности. Так что плеер я писал параллельно с изучением Objective-C.

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

Я точно знал, каким должен быть плеер, как должен выглядеть и какой должен иметь функционал. Поэтому у меня не было какого-то обдумывательного, проектировочного этапа. Я просто по шагам находил решения для каждого возникающего вопроса и тут же писал код. В процессе я даже написал несколько заметок у себя в ЖЖ — как настроить Xcode, как засунуть иконку приложения в статус-бар, как прочитать файлы и.т.д. Этакий учебник для самого себя.

Самым сложным вопросом оказалось воспроизведение звука. Я начал эксперименты с класса NSSound. Я так понял, это некий «стандартный» класс для воспроизведения звука в Objective-C. Сначала у меня долго не получалось заставить этот класс воспроизводить звук, потом не получалось отловить момент окончания трека, чтобы запустить следующий. У меня начало складываться впечатление, что класс NSSound вообще не предназначен для использования в плеере, скорее он нужен для однократного воспроизведения какого-нибудь короткого звука, типа сигнала об окончания закачки файла, или типа того.

Тогда я решил попробовать разобраться с фреймворком AV Foundation, уж на нем-то точно можно написать плеер. Однако, как-то так получилось, что мне подсказали способ заставить NSSound издавать звуки, а отлавливать момент окончания трека я научился сам. И я сделал плеер на основе NSSound.

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

Прочие вопросы, типа чтения файлов или создания меню, не показались мне сложными. Ну, не сложнее любых других вопросов, возникающих при изучении новой технологии. По моментам создания плеера я также написал несколько заметок в ЖЖ.

Результат

В результате я написал для себя аудиоплеер, который полностью меня устраивает. И теперь я хочу поделиться результом со всеми желающими.

Репл — открытый и совершенно бесплатный плеер. Я сделал маленький сайт-визитку re-pl.ru, там можно прочитать краткое описание и скачать готовое компилированное приложение. Все исходники находятся на Гитхабе, там же есть небольшой список фич, которые я еще хочу прикрутить к Реплу.

Буду раз любым замечаниям и предложениям, а равно и пулл-реквестам:)

Автор: ivanych

Источник


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js