snapcast: add package snapserver and snapclient

Snapcast [1] is a multiroom client-server audio player, where all
clients are time synchronized with the server to play perfectly synced
audio.

It's not a standalone player, but an extension that turns your existing
audio player into a Sonos-like multiroom solution.
Audio is captured by the server and routed to the connected clients.
Several players can feed audio to the server in parallel and clients can
be grouped to play the same audio stream.
One of the most generic ways to use Snapcast is in conjunction with the
music player daemon (MPD) [2] or Mopidy [3].

The inclusion starts with version 0.28.0 because of OpenSSL dependency
issues of version 0.29.0. Newer versions (e.g. 0.32.3, see [4])
with optional OpenSSL support, will be incorporated with flavours,
like "-mini" and "-full" in the upcoming PRs.
More about this topic please check the inclusion PR at [5]!

[1]: https://github.com/badaix/snapcast
[2]: http://www.musicpd.org/
[3]: https://www.mopidy.com/
[4]: https://github.com/badaix/snapcast/blob/develop/changelog.md
[5]: https://github.com/openwrt/packages/pull/23956#discussion_r2330463363

Fixes: #23924
Suggested-by: Tianling Shen <cnsztl@immortalwrt.org>
Suggested-by: George Sapkin <george@sapk.in>
Signed-off-by: Szabolcs Hubai <szab.hu@gmail.com>
This commit is contained in:
Szabolcs Hubai
2024-04-18 00:23:26 +02:00
committed by Tianling Shen
parent e5a64aadca
commit eeb8d131fc
6 changed files with 72 additions and 79 deletions

View File

@@ -1,22 +1,20 @@
# # SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2015 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME := snapcast PKG_NAME:=snapcast
PKG_VERSION := 0.27.0 PKG_VERSION:=0.28.0
PKG_RELEASE := $(PKG_SOURCE_VERSION) PKG_RELEASE:=1
PKG_USE_MIPS16 := 0
# PKG_MIRROR_HASH=skip
PKG_SOURCE_PROTO:=git PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/badaix/snapcast.git PKG_SOURCE_URL:=https://github.com/badaix/snapcast.git
PKG_SOURCE_VERSION:=v0.27.0 PKG_SOURCE_VERSION:=v$(PKG_VERSION)
PKG_BUILD_DIR:=$(BUILD_DIR)/snapcast-$(PKG_VERSION) PKG_MIRROR_HASH=288325fc8b134502adb522711c18210794734675684cf5d8eba8a0a82778f6c9
PKG_MAINTAINER:=Szabolcs Hubai <szab.hu@gmail.com>, David Andreoletti <david@andreoletti.net>
PKG_LICENSE:=GPL-3.0-or-later
PKG_LICENSE_FILES:=LICENSE
PKG_CPE_ID:=cpe:/a:badaix:snapcast
include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/cmake.mk include $(INCLUDE_DIR)/cmake.mk
@@ -24,73 +22,58 @@ include $(INCLUDE_DIR)/cmake.mk
CMAKE_OPTIONS += -DBUILD_TESTS=OFF CMAKE_OPTIONS += -DBUILD_TESTS=OFF
define Package/snapcast/Default define Package/snapcast/Default
SECTION := sound SECTION:=sound
CATEGORY := Sound CATEGORY:=Sound
TITLE := Synchronous multiroom audio player TITLE:=Synchronous multiroom audio player
DEPENDS := +AUDIO_SUPPORT:alsa-lib +libstdcpp +libavahi-client +libatomic +libogg +libflac +libopus +boost +libsoxr DEPENDS:=+AUDIO_SUPPORT:alsa-lib +libavahi-client +libatomic +libogg +libflac +libopus +boost +libsoxr
URL := https://github.com/badaix/snapcast URL:=https://github.com/badaix/snapcast
endef endef
define Package/snapcast/description/Default define Package/snapcast/Default/description
Synchronous audio player Synchronous audio player - Snapcast
endef
define Package/snapcast
$(call Package/snapcast/Default)
TITLE += packages
endef
define Package/snapcast/description
$(call Package/snapcast/description/Default)
Snapcast is a multi-room client-server audio player, Snapcast is a multi-room client-server audio player,
where all clients are time synchronized with the server where all clients are time synchronized with the server
to play perfectly synced audio to play perfectly synced audio.
It's not a standalone player, but an extension that turns
your existing audio player into a Sonos-like multiroom solution.
Audio is captured by the server and routed to the connected clients.
Several players can feed audio to the server in parallel
and clients can be grouped to play the same audio stream.
One of the most generic ways to use Snapcast is in conjunction
with the Music Player Daemon (MPD) or Mopidy.
endef endef
define Package/snapserver define Package/snapserver
$(call Package/snapcast/Default) $(call Package/snapcast/Default)
TITLE += Snapserver TITLE+= (server)
DEPENDS += +AUDIO_SUPPORT:alsa-lib +libvorbis +libsoxr DEPENDS+=+libvorbis
HIDDEN := 1
endef endef
define Package/snapclient define Package/snapclient
$(call Package/snapcast/Default) $(call Package/snapcast/Default)
TILE += Snapclient TITLE+= (client)
DEPENDS += +libvorbisidec +libsoxr DEPENDS+=+libvorbisidec
HIDDEN := 1
endef endef
define Package/snapserver/description define Package/snapserver/description
$(call Package/snapcast/description/Default) $(call Package/snapcast/Default/description)
Snapcast server This package contains the Snapcast server.
endef endef
define Package/snapclient/description define Package/snapclient/description
$(call Package/snapcast/description/Default) $(call Package/snapcast/Default/description)
Snapcast client This package contains the Snapcast client.
endef endef
define Package/snapcast/config define Package/snapserver/conffiles
menu "Select Snapcast Options" /etc/config/snapserver
depends on PACKAGE_snapcast /etc/snapserver.conf
comment "Choose server or client"
config PACKAGE_snapserver
prompt "Snapserver"
help
Snapcast server
default n
config PACKAGE_snapclient
prompt "Snapclient"
help
Snapcast client
default y
endmenu
endef endef
define Package/snapcast/Default/install define Package/snapclient/conffiles
true /etc/config/snapclient
endef endef
define Package/snapserver/install define Package/snapserver/install
@@ -98,8 +81,6 @@ define Package/snapserver/install
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/snapserver $(1)/usr/bin/ $(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/snapserver $(1)/usr/bin/
$(INSTALL_DIR) $(1)/etc/init.d $(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/snapserver.init $(1)/etc/init.d/snapserver $(INSTALL_BIN) ./files/snapserver.init $(1)/etc/init.d/snapserver
$(INSTALL_DIR) $(1)/etc/default
$(INSTALL_BIN) $(CURDIR)/../../debian/snapserver.default $(1)/etc/default/snapserver
$(INSTALL_BIN) $(PKG_BUILD_DIR)/server/etc/snapserver.conf $(1)/etc/snapserver.conf $(INSTALL_BIN) $(PKG_BUILD_DIR)/server/etc/snapserver.conf $(1)/etc/snapserver.conf
endef endef
@@ -108,10 +89,7 @@ define Package/snapclient/install
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/snapclient $(1)/usr/bin/ $(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/snapclient $(1)/usr/bin/
$(INSTALL_DIR) $(1)/etc/init.d $(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/snapclient.init $(1)/etc/init.d/snapclient $(INSTALL_BIN) ./files/snapclient.init $(1)/etc/init.d/snapclient
$(INSTALL_DIR) $(1)/etc/default
$(INSTALL_BIN) $(CURDIR)/../../debian/snapclient.default $(1)/etc/default/snapclient
endef endef
$(eval $(call BuildPackage,snapserver)) $(eval $(call BuildPackage,snapserver))
$(eval $(call BuildPackage,snapclient)) $(eval $(call BuildPackage,snapclient))
$(eval $(call BuildPackage,snapcast))

View File

@@ -0,0 +1,4 @@
config snapclient 'config'
option enabled '0'
option log_sink 'system'
option opts ''

View File

@@ -1,5 +1,6 @@
#!/bin/sh /etc/rc.common #!/bin/sh /etc/rc.common
# Author: Johannes Pohl <johannes.pohl@badaix.de> # Author: Johannes Pohl <johannes.pohl@badaix.de>
# Co-Author: Szabolcs Hubai <szab.hu@gmail.com>
START=90 START=90
USE_PROCD=1 USE_PROCD=1
@@ -7,21 +8,22 @@ USE_PROCD=1
NAME=snapclient NAME=snapclient
PROG=/usr/bin/$NAME PROG=/usr/bin/$NAME
PID_FILE=/var/run/$NAME.pid PID_FILE=/var/run/$NAME.pid
CONFIG_FILE=/etc/default/$NAME
start_service() start_service()
{ {
local autostart opts config_load "$NAME"
autostart=$(grep ^START_SNAPCLIENT $CONFIG_FILE |cut -d= -f2) local enabled
[ "$autostart" != "true" ] && logger -t $NAME "Not starting due to START_SNAPCLIENT" && exit 0 config_get_bool enabled "config" enabled 0
[ "$enabled" -ne "1" ] && logger -t $NAME "Disabled in /etc/config/$NAME" && return 1
opts=$(grep ^SNAPCLIENT_OPTS $CONFIG_FILE |cut -d "\"" -f2) local log_sink opts
opts="--logsink system $opts" config_get log_sink "config" log_sink system
config_get opts "config" opts ""
procd_open_instance procd_open_instance
procd_set_param command $PROG procd_set_param command $PROG
procd_append_param command --logsink $log_sink
procd_append_param command $opts procd_append_param command $opts
procd_set_param pidfile $PID_FILE procd_set_param pidfile $PID_FILE
procd_set_param respawn # use the defaults for respawing crashed process procd_set_param respawn # use the defaults for respawing crashed process

View File

@@ -0,0 +1,4 @@
config snapserver 'config'
option enabled '0'
option log_sink 'system'
option opts ''

View File

@@ -1,5 +1,6 @@
#!/bin/sh /etc/rc.common #!/bin/sh /etc/rc.common
# Author: Johannes Pohl <johannes.pohl@badaix.de> # Author: Johannes Pohl <johannes.pohl@badaix.de>
# Co-Author: Szabolcs Hubai <szab.hu@gmail.com>
START=90 START=90
USE_PROCD=1 USE_PROCD=1
@@ -7,21 +8,22 @@ USE_PROCD=1
NAME=snapserver NAME=snapserver
PROG=/usr/bin/$NAME PROG=/usr/bin/$NAME
PID_FILE=/var/run/$NAME.pid PID_FILE=/var/run/$NAME.pid
CONFIG_FILE=/etc/default/$NAME
start_service() start_service()
{ {
local autostart opts config_load "$NAME"
autostart=$(grep ^START_SNAPSERVER $CONFIG_FILE |cut -d= -f2) local enabled
[ "$autostart" != "true" ] && logger -t $NAME "Not starting due to START_SNAPSERVER" && exit 0 config_get_bool enabled "config" enabled 0
[ "$enabled" -ne "1" ] && logger -t $NAME "Disabled in /etc/config/$NAME" && return 1
opts=$(grep ^SNAPSERVER_OPTS $CONFIG_FILE |cut -d "\"" -f2) local log_sink opts
opts="--logging.sink system $opts" config_get log_sink "config" log_sink system
config_get opts "config" opts ""
procd_open_instance procd_open_instance
procd_set_param command $PROG procd_set_param command $PROG
procd_append_param command --logging.sink $log_sink
procd_append_param command $opts procd_append_param command $opts
procd_set_param pidfile $PID_FILE procd_set_param pidfile $PID_FILE
procd_set_param respawn # use the defaults for respawing crashed process procd_set_param respawn # use the defaults for respawing crashed process

3
sound/snapcast/test.sh Executable file
View File

@@ -0,0 +1,3 @@
#!/bin/sh
"$1" --version | grep -F "$PKG_VERSION"