Skip to content

add (experimental) support for Sendspin Multiroom Audio Client Renderer#731

Open
m-mrks wants to merge 13 commits into
moode-player:developfrom
m-mrks:render-sendspin
Open

add (experimental) support for Sendspin Multiroom Audio Client Renderer#731
m-mrks wants to merge 13 commits into
moode-player:developfrom
m-mrks:render-sendspin

Conversation

@m-mrks
Copy link
Copy Markdown

@m-mrks m-mrks commented Jan 16, 2026

First attempt to include Sendspin as renderer in moOde.

See the setup_3rdparty_sendspin.txt file for additional details on installing sendspin-cli in moOde; in short:

sudo pip install uv --break-system-packages
sudo uv tool install sendspin@4.0.0

To test via SSH if the Sendspin server can be reached; and desired audio device is available:

sudo /root/.local/share/uv/tools/sendspin/bin/sendspin --list-servers
sudo /root/.local/share/uv/tools/sendspin/bin/sendspin --list-audio-devices

Probably overlooked some basics, but am happy to learn / improve / collaborate :-)

@moodeaudio
Copy link
Copy Markdown
Contributor

At first glance it looks like all the parts are there for a 3rd party renderer. Nice effort :-)

If people want to test this what has to be installed as a player client?

@m-mrks
Copy link
Copy Markdown
Author

m-mrks commented Jan 17, 2026

I've tested this with the latest beta version from Music Assistant.

@poupounetjoyeux
Copy link
Copy Markdown

Hey thanks for this work!

Really nice way to simply integrate Music Assistant with multiple moode players!

Hope you will have more chance than me in #712 getting it merged and that the sendspin protocol will be more efficient with Bluetooth speaker as output 😁

Will try to test soon

@BGC42
Copy link
Copy Markdown

BGC42 commented Feb 7, 2026

Exciting stuff! I've been looking for an endpoint for Music Assistant to work with my RasPi 4b with 7in display and HiFiberry DAC for some time and the existing solutions don't seem to fully work for me (up to 192/24 with full metadata including album art).

Just moved from another player to Moode in hope of it getting merged. If/when it does I can imagine many more Home/Music Assistant users jumping onto it too.

Any tips on how I might test it before then? Have tried to follow setup_3rdparty_sendspin.txt but so far can only get it to work by manually running the sendspin client interactively via SSH:
sendspinclient
Guess I could run as daemon for now.

Very happy to do any testing, am not a coder but I do have 25+ years experience as systems integrator/network engineer.

@m-mrks
Copy link
Copy Markdown
Author

m-mrks commented Feb 10, 2026

Thanks for the reactions!

The idea of this PR is to run sendspin in daemon mode, and add elements at the Renderer page in moOde to switch that service on/off.

In retrospect, I think that this PR was a bit too early; for instance I was not aware of Open Home Foundation's sendspin-cli install as daemon-script that simplifies the setup and configuration of the required package to run it in daemon mode.

This PR does not (yet) uses this method.

I'll refactor in the upcoming days and then will post a more elaborate guide on how to test.

@m-mrks
Copy link
Copy Markdown
Author

m-mrks commented Feb 28, 2026

Sorry for the delay.

The new commits remove 'Sendspin configuration'-components and only keep a 'switch' in the moOde GUI at the 'Renderers'-section for Sendspin.

To test it; review the development with Gulp-guide, and on a test device:

sudo apt update && sudo apt upgrade
sudo apt install git gulp npm
curl -fsSL https://raw.githubusercontent.com/Sendspin/sendspin-cli/refs/heads/main/scripts/systemd/install-systemd.sh | sudo bash
cd ~/
git clone https://github.com/m-mrks/moode.git
cd ~/moode
npm ci
git checkout render-sendspin
gulp --tasks
gulp build
sudo gulp deploy
sudo sqlite3 /var/local/www/db/moode-sqlite3.db "UPDATE cfg_system SET value='490423' WHERE param='feat_bitmask'"
sudo gulp deploymoodeutl
moodeutl -r
moodeutl -q "INSERT INTO cfg_system (param, value) VALUES ('sendspinsvc', '0');"
moodeutl -q "INSERT INTO cfg_system (param, value) VALUES ('sendspin_installed', 'no');"

One issue that still puzzles me are the 'device in use'-errors:

  • moOde displays Failed to open "ALSA Default" (alsa); Failed to open ALSA device "_audioout": Device or resource busy;
  • sendspin shows sounddevice.PortAudioError: Error opening RawOutputStream: Device unavailable [PaErrorCode -9985]

For now, prior to starting the Sendspin installation, and prior to enabling the Sendspin renderer, switch moOde to a 'dummy' audio output first.

Maybe that will change, later, in the future.

@kiwipaulrob
Copy link
Copy Markdown

Any progress? Keen to try but above error suggests not stable yet. Thanks for this.

@chrraffi1
Copy link
Copy Markdown

Also upvoting this PR 👍
would be great to see further progress.
I run experimental version based on early version of it and is quite stable (with manual steps).
Thanks for the great work.

@Mindfunk68
Copy link
Copy Markdown

This is a wonderful expansion, thank you for the PR.
I would be very happy to see progress in its development.
This is exactly the solution I was looking for today, the integration of the Sendspin Multiroom Audio Client into moOde.

@yourgis
Copy link
Copy Markdown

yourgis commented May 9, 2026

Thank you for your efforts! Do you plan to develop it further?

@m-mrks
Copy link
Copy Markdown
Author

m-mrks commented May 18, 2026

Thank you all for the interest.

Status update: yes, I hope to finish this, but I have no idea when it's finished.

Some progress I'm happy to share - on the topic of fixing the 'device in use' error:

File /etc/alsa/conf.d/_audioout.conf holds moOde's audio paths and is managed by moOde.
Change the plug type ( hw: or plughw: ) manually to to the dmix: type, reboot, and 'device in use'-errors are gone.

Although I haven't tested that route extensively I think it might be a fruitful route because the dmix plug type allows multiple audio streams simultaneously by design.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants