/
/
/
1"""Tests for Sendspin player-specific processing plans."""
2
3from __future__ import annotations
4
5from typing import TYPE_CHECKING
6from unittest.mock import MagicMock
7
8from music_assistant_models.audio_processing import (
9 AudioDSPDetails,
10 AudioOutputDetails,
11)
12from music_assistant_models.dsp import DSPConfig
13from music_assistant_models.enums import ContentType
14from music_assistant_models.media_items import AudioFormat
15
16from music_assistant.controllers.streams.audio_processing import AudioOutputPlan
17from music_assistant.providers.sendspin.playback import SendspinPlaybackSession
18
19if TYPE_CHECKING:
20 import pytest
21
22
23def test_empty_plan_does_not_require_transform(
24 monkeypatch: pytest.MonkeyPatch,
25) -> None:
26 """A plan without filters keeps the member on the shared Sendspin channel."""
27 player = MagicMock(player_id="leader")
28 player.mass.config.get_player_dsp_config.return_value = DSPConfig(enabled=False)
29 player.mass.config.get_raw_player_config_value.return_value = "stereo"
30 pcm_format = AudioFormat(
31 content_type=ContentType.PCM_F32LE,
32 sample_rate=48000,
33 bit_depth=32,
34 channels=2,
35 )
36 output_details = AudioOutputDetails(
37 player_ids=["member"],
38 dsp=AudioDSPDetails(),
39 output_format=pcm_format,
40 )
41 output_plan = AudioOutputPlan(
42 filter_params=[],
43 output_details=output_details,
44 input_format=pcm_format,
45 )
46 player.mass.streams.audio.get_player_output_plan.return_value = output_plan
47 session = SendspinPlaybackSession(player)
48 session._pcm_format = pcm_format
49 session._queue_id = "queue-1"
50 session._queue_session_id = "session-1"
51 monkeypatch.setattr(session, "_get_member_output_format", lambda _player_id: pcm_format)
52
53 config = session._read_pipeline_config("member")
54
55 assert not config.requires_transform
56 player.mass.streams.audio_processing.update_output.assert_called_once_with(
57 "member",
58 output_plan,
59 queue_id="queue-1",
60 session_id="session-1",
61 )
62