diff --git a/src/qconnect.rs b/src/qconnect.rs index 78abd1a..8c7192d 100644 --- a/src/qconnect.rs +++ b/src/qconnect.rs @@ -385,10 +385,12 @@ fn msg_volume_changed(volume: u64) -> Vec { } /// RNDR_SRVR_MAX_AUDIO_QUALITY_CHANGED (28): renderer confirms quality setting. -/// Includes maxAudioQuality (field 1) and networkType (field 2: 1=WIFI, 2=CELLULAR, 3=UNKNOWN). -fn msg_max_audio_quality_changed(quality: u64) -> Vec { +/// networkType (field 2) is optional; when absent, quality applies generically. +fn msg_max_audio_quality_changed(quality: u64, network_type: Option) -> Vec { let mut payload = encode_field_varint(1, quality); - payload.extend(encode_field_varint(2, 1)); // networkType = WIFI + if let Some(network_type) = network_type { + payload.extend(encode_field_varint(2, network_type)); + } build_qconnect_message(28, &payload) } @@ -1312,7 +1314,7 @@ async fn run_connection( max_audio_quality = *quality; // Confirm quality change to server - let resp = msg_max_audio_quality_changed(*quality as u64); + let resp = msg_max_audio_quality_changed(*quality as u64, None); ws_tx.send(Message::Binary(build_payload_frame(msg_id, &resp).into())).await?; msg_id += 1; @@ -1390,6 +1392,11 @@ async fn run_connection( ws_tx.send(Message::Binary(build_payload_frame(msg_id, &dev_msg).into())).await?; msg_id += 1; } + // Re-emit quality confirmation after successful restart + // so controllers observing the currently active stream update promptly. + let confirm = msg_max_audio_quality_changed(*quality as u64, None); + ws_tx.send(Message::Binary(build_payload_frame(msg_id, &confirm).into())).await?; + msg_id += 1; current_buffer_state = 2; // OK(2) info!("Restarted at format_id={}", format_id); }