Files
-rpi-sendspin/third_party/sendspin-go/docs/MA_HIRES_ISSUE.md

4.8 KiB

Music Assistant Hi-Res Issue

Problem

Music Assistant shows "signal degraded" and only displays 44.1kHz/16bit and 48kHz/16bit as supported formats, even though our player advertises full hi-res capabilities (up to 192kHz/24bit).

What We're Advertising

Our player sends comprehensive capabilities in client/hello:

{
  "support_formats": [
    {"codec": "pcm", "channels": 2, "sample_rate": 192000, "bit_depth": 24},
    {"codec": "pcm", "channels": 2, "sample_rate": 176400, "bit_depth": 24},
    {"codec": "pcm", "channels": 2, "sample_rate": 96000, "bit_depth": 24},
    {"codec": "pcm", "channels": 2, "sample_rate": 88200, "bit_depth": 24},
    {"codec": "pcm", "channels": 2, "sample_rate": 48000, "bit_depth": 16},
    {"codec": "pcm", "channels": 2, "sample_rate": 44100, "bit_depth": 16},
    {"codec": "opus", "channels": 2, "sample_rate": 48000, "bit_depth": 16}
  ],
  "support_codecs": ["pcm", "opus"],
  "support_sample_rates": [192000, 176400, 96000, 88200, 48000, 44100],
  "support_bit_depth": [24, 16]
}

Both new-style (support_formats) and legacy-style (separate arrays) are provided for maximum compatibility.

Verification

When connecting directly to our own resonate-go server:

  • Server correctly negotiates 192kHz/24bit PCM
  • Player receives and plays hi-res audio
  • Format negotiation works as expected

This proves our implementation is correct.

Possible Causes

1. MA's Resonate Provider Has Hardcoded Limits

Music Assistant's built-in Resonate provider might have:

  • Hardcoded maximum sample rate (48kHz)
  • Hardcoded bit depth (16-bit)
  • Safety filters that only expose "known good" formats

2. MA Filters Based on What It Can Provide

MA might be filtering player capabilities based on what formats MA itself can deliver:

  • If MA's audio pipeline doesn't support >48kHz, it hides those options
  • If MA's source doesn't have hi-res, it might not show hi-res player caps

3. MA Version Limitations

Older versions of Music Assistant might not support hi-res audio at all, regardless of player capabilities.

4. Protocol Parsing Bug

MA's Resonate provider might have a bug in how it parses capabilities:

  • Might only look at legacy arrays and misinterpret them
  • Might do AND logic instead of OR (only showing common formats)
  • Might not understand the newer support_formats array

Debugging Steps

1. Check MA Logs

Look for player connection logs:

# In Music Assistant logs, search for:
- "Resonate player connected"
- "Player capabilities"
- Your player name

2. Check MA Version

  • Go to Settings → Info
  • Check Music Assistant version
  • Check if there are Resonate provider updates

3. Test Direct Connection

Compare behavior:

# Direct to our server (should work)
./resonate-server -debug -no-tui
./resonate-player -server localhost:8927 -name "test"
# Should see: "Stream starting: pcm 192000Hz 2ch 24bit"

# Through MA (shows degraded)
# Connect player to MA
# Check what format MA sends

4. Check MA Settings

  • Settings → Providers → Resonate
  • Look for any sample rate or quality limitations
  • Check if there's a "max quality" or "sample rate" setting

Workarounds

Option 1: Use Direct Connection

Skip Music Assistant and connect directly to our server:

./resonate-server -audio /path/to/hires.flac
./resonate-player -server <server-ip>:8927

Option 2: Request MA Enhancement

File an issue with Music Assistant to:

  • Support hi-res audio (>48kHz)
  • Properly parse player hi-res capabilities
  • Update Resonate provider

Option 3: Custom MA Provider

Create a custom Resonate provider for MA that:

  • Properly reads player capabilities
  • Doesn't filter hi-res formats
  • Passes through native sample rates

Expected vs. Actual

Expected (Direct Connection)

Player advertises: 192kHz/24bit capable
Server provides: 192kHz/24bit source
Negotiation: Match! Use PCM 192kHz/24bit
Result: ✅ Hi-res audio delivered

Actual (Through MA)

Player advertises: 192kHz/24bit capable
MA sees: Only 44.1kHz/16bit, 48kHz/16bit ???
MA sends: 48kHz/16bit (downsampled)
Result: ❌ "Signal degraded" warning

Conclusion

Our player implementation is correct. The issue is in Music Assistant's Resonate provider, which is not properly recognizing or supporting hi-res capabilities.

Next Steps:

  1. Get MA logs to confirm where filtering happens
  2. Check MA version and update if needed
  3. Consider filing MA enhancement request
  4. For now, use direct connection for hi-res audio

Testing MA Compatibility

If you want to ensure our player works with MA's current limitations, we could add a "compatibility mode" that:

  • Only advertises 48kHz/16bit
  • Disables hi-res formats
  • Forces lowest common denominator

But this defeats the purpose of building a hi-res player! Better to fix MA or use direct connections.