From 2315d0090957050ce9cd037f22c18356f5d0099c Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Sun, 5 Oct 2025 20:53:05 +0200 Subject: [PATCH] Implementation de rendering control --- pmoupnp/src/mediarenderer/mod.rs | 1 + .../renderingcontrol/actions/getmute.rs | 10 ++ .../renderingcontrol/actions/getvolume.rs | 10 ++ .../renderingcontrol/actions/mod.rs | 9 ++ .../renderingcontrol/actions/setmute.rs | 10 ++ .../renderingcontrol/actions/setvolume.rs | 10 ++ .../src/mediarenderer/renderingcontrol/mod.rs | 99 +++++++++++++++++++ .../variables/a_arg_type_channel.rs | 8 ++ .../variables/a_arg_type_instanceid.rs | 5 + .../renderingcontrol/variables/mod.rs | 9 ++ .../renderingcontrol/variables/mute.rs | 7 ++ .../renderingcontrol/variables/volume.rs | 7 ++ 12 files changed, 185 insertions(+) create mode 100644 pmoupnp/src/mediarenderer/renderingcontrol/actions/getmute.rs create mode 100644 pmoupnp/src/mediarenderer/renderingcontrol/actions/getvolume.rs create mode 100644 pmoupnp/src/mediarenderer/renderingcontrol/actions/mod.rs create mode 100644 pmoupnp/src/mediarenderer/renderingcontrol/actions/setmute.rs create mode 100644 pmoupnp/src/mediarenderer/renderingcontrol/actions/setvolume.rs create mode 100644 pmoupnp/src/mediarenderer/renderingcontrol/mod.rs create mode 100644 pmoupnp/src/mediarenderer/renderingcontrol/variables/a_arg_type_channel.rs create mode 100644 pmoupnp/src/mediarenderer/renderingcontrol/variables/a_arg_type_instanceid.rs create mode 100644 pmoupnp/src/mediarenderer/renderingcontrol/variables/mod.rs create mode 100644 pmoupnp/src/mediarenderer/renderingcontrol/variables/mute.rs create mode 100644 pmoupnp/src/mediarenderer/renderingcontrol/variables/volume.rs diff --git a/pmoupnp/src/mediarenderer/mod.rs b/pmoupnp/src/mediarenderer/mod.rs index b9365d5a..bdbc0780 100644 --- a/pmoupnp/src/mediarenderer/mod.rs +++ b/pmoupnp/src/mediarenderer/mod.rs @@ -1 +1,2 @@ pub mod avtransport; +pub mod renderingcontrol; diff --git a/pmoupnp/src/mediarenderer/renderingcontrol/actions/getmute.rs b/pmoupnp/src/mediarenderer/renderingcontrol/actions/getmute.rs new file mode 100644 index 00000000..f39e1e2c --- /dev/null +++ b/pmoupnp/src/mediarenderer/renderingcontrol/actions/getmute.rs @@ -0,0 +1,10 @@ +use crate::mediarenderer::renderingcontrol::variables::{A_ARG_TYPE_INSTANCE_ID, A_ARG_TYPE_CHANNEL, MUTE}; +use crate::define_action; + +define_action! { + pub static GETMUTE = "GetMute" { + in "InstanceID" => A_ARG_TYPE_INSTANCE_ID, + in "Channel" => A_ARG_TYPE_CHANNEL, + out "CurrentMute" => MUTE, + } +} diff --git a/pmoupnp/src/mediarenderer/renderingcontrol/actions/getvolume.rs b/pmoupnp/src/mediarenderer/renderingcontrol/actions/getvolume.rs new file mode 100644 index 00000000..c6610618 --- /dev/null +++ b/pmoupnp/src/mediarenderer/renderingcontrol/actions/getvolume.rs @@ -0,0 +1,10 @@ +use crate::mediarenderer::renderingcontrol::variables::{A_ARG_TYPE_INSTANCE_ID, A_ARG_TYPE_CHANNEL, VOLUME}; +use crate::define_action; + +define_action! { + pub static GETVOLUME = "GetVolume" { + in "InstanceID" => A_ARG_TYPE_INSTANCE_ID, + in "Channel" => A_ARG_TYPE_CHANNEL, + out "CurrentVolume" => VOLUME, + } +} diff --git a/pmoupnp/src/mediarenderer/renderingcontrol/actions/mod.rs b/pmoupnp/src/mediarenderer/renderingcontrol/actions/mod.rs new file mode 100644 index 00000000..b7998a94 --- /dev/null +++ b/pmoupnp/src/mediarenderer/renderingcontrol/actions/mod.rs @@ -0,0 +1,9 @@ +mod getvolume; +mod setvolume; +mod getmute; +mod setmute; + +pub use getvolume::GETVOLUME; +pub use setvolume::SETVOLUME; +pub use getmute::GETMUTE; +pub use setmute::SETMUTE; diff --git a/pmoupnp/src/mediarenderer/renderingcontrol/actions/setmute.rs b/pmoupnp/src/mediarenderer/renderingcontrol/actions/setmute.rs new file mode 100644 index 00000000..5220f00f --- /dev/null +++ b/pmoupnp/src/mediarenderer/renderingcontrol/actions/setmute.rs @@ -0,0 +1,10 @@ +use crate::mediarenderer::renderingcontrol::variables::{A_ARG_TYPE_INSTANCE_ID, A_ARG_TYPE_CHANNEL, MUTE}; +use crate::define_action; + +define_action! { + pub static SETMUTE = "SetMute" { + in "InstanceID" => A_ARG_TYPE_INSTANCE_ID, + in "Channel" => A_ARG_TYPE_CHANNEL, + in "DesiredMute" => MUTE, + } +} diff --git a/pmoupnp/src/mediarenderer/renderingcontrol/actions/setvolume.rs b/pmoupnp/src/mediarenderer/renderingcontrol/actions/setvolume.rs new file mode 100644 index 00000000..d403fa45 --- /dev/null +++ b/pmoupnp/src/mediarenderer/renderingcontrol/actions/setvolume.rs @@ -0,0 +1,10 @@ +use crate::mediarenderer::renderingcontrol::variables::{A_ARG_TYPE_INSTANCE_ID, A_ARG_TYPE_CHANNEL, VOLUME}; +use crate::define_action; + +define_action! { + pub static SETVOLUME = "SetVolume" { + in "InstanceID" => A_ARG_TYPE_INSTANCE_ID, + in "Channel" => A_ARG_TYPE_CHANNEL, + in "DesiredVolume" => VOLUME, + } +} diff --git a/pmoupnp/src/mediarenderer/renderingcontrol/mod.rs b/pmoupnp/src/mediarenderer/renderingcontrol/mod.rs new file mode 100644 index 00000000..4c441233 --- /dev/null +++ b/pmoupnp/src/mediarenderer/renderingcontrol/mod.rs @@ -0,0 +1,99 @@ +//! # RenderingControl Service - Service de contrôle du rendu audio UPnP +//! +//! Ce module implémente le service RenderingControl:1 selon la spécification UPnP AV. +//! Le service RenderingControl permet de contrôler les paramètres de rendu audio +//! (volume, mute, etc.) sur un MediaRenderer. +//! +//! ## Fonctionnalités +//! +//! Le service RenderingControl permet : +//! - **Contrôle du volume** : GetVolume, SetVolume +//! - **Contrôle du mute** : GetMute, SetMute +//! - Support multi-canal (Master, LF, RF) +//! +//! ## Conformité UPnP +//! +//! Cette implémentation suit la spécification **UPnP RenderingControl:1 Service Template**. +//! Toutes les actions obligatoires (Required) sont implémentées : +//! +//! - ✅ GetVolume +//! - ✅ SetVolume +//! - ✅ GetMute +//! - ✅ SetMute +//! +//! ## Variables d'état +//! +//! Le service expose les variables d'état conformes à la spécification : +//! +//! ### Contrôle audio +//! - [`VOLUME`] : Niveau de volume (0-100) +//! - [`MUTE`] : État mute (true/false) +//! +//! ### Arguments +//! - [`A_ARG_TYPE_INSTANCE_ID`] : ID d'instance +//! - [`A_ARG_TYPE_CHANNEL`] : Canal audio (Master, LF, RF) +//! +//! ## Examples +//! +//! ```rust +//! use pmoupnp::mediarenderer::renderingcontrol::RENDERINGCONTROL; +//! +//! // Accéder au service +//! let service = &*RENDERINGCONTROL; +//! println!("Service: {}", service.name()); +//! println!("Type: {}", service.service_type()); +//! ``` +//! +//! ## Références +//! +//! - [UPnP RenderingControl:1 Service Template](https://upnp.org/specs/av/UPnP-av-RenderingControl-v1-Service.pdf) +//! - [UPnP AV Architecture](https://upnp.org/specs/av/) + +use crate::define_service; + +pub mod variables; +pub mod actions; + +use actions::{GETMUTE, GETVOLUME, SETMUTE, SETVOLUME}; +use variables::{A_ARG_TYPE_CHANNEL, A_ARG_TYPE_INSTANCE_ID, MUTE, VOLUME}; + +/// Service RenderingControl:1 conforme à la spécification UPnP AV. +/// +/// Ce service permet de contrôler les paramètres de rendu audio sur un MediaRenderer. +/// +/// # Initialisation +/// +/// Le service est initialisé paresseusement (lazy) au premier accès via la macro +/// [`define_service!`]. Toutes les variables d'état et actions sont automatiquement +/// enregistrées. +/// +/// # Exemples +/// +/// ```rust +/// use pmoupnp::mediarenderer::renderingcontrol::RENDERINGCONTROL; +/// +/// let service = &*RENDERINGCONTROL; +/// assert_eq!(service.name(), "RenderingControl"); +/// assert_eq!(service.version(), 1); +/// ``` +/// +/// # Voir aussi +/// +/// - Module [`actions`] : Définition de toutes les actions UPnP +/// - Module [`variables`] : Définition de toutes les variables d'état +define_service! { + pub static RENDERINGCONTROL = "RenderingControl" { + variables: [ + A_ARG_TYPE_CHANNEL, + A_ARG_TYPE_INSTANCE_ID, + MUTE, + VOLUME, + ], + actions: [ + GETMUTE, + GETVOLUME, + SETMUTE, + SETVOLUME, + ] + } +} diff --git a/pmoupnp/src/mediarenderer/renderingcontrol/variables/a_arg_type_channel.rs b/pmoupnp/src/mediarenderer/renderingcontrol/variables/a_arg_type_channel.rs new file mode 100644 index 00000000..41d588d7 --- /dev/null +++ b/pmoupnp/src/mediarenderer/renderingcontrol/variables/a_arg_type_channel.rs @@ -0,0 +1,8 @@ +use crate::define_variable; + +define_variable! { + pub static A_ARG_TYPE_CHANNEL: String = "A_ARG_TYPE_Channel" { + allowed: ["Master", "LF", "RF"], + default: "Master", + } +} diff --git a/pmoupnp/src/mediarenderer/renderingcontrol/variables/a_arg_type_instanceid.rs b/pmoupnp/src/mediarenderer/renderingcontrol/variables/a_arg_type_instanceid.rs new file mode 100644 index 00000000..264b1f91 --- /dev/null +++ b/pmoupnp/src/mediarenderer/renderingcontrol/variables/a_arg_type_instanceid.rs @@ -0,0 +1,5 @@ +use crate::define_variable; + +define_variable! { + pub static A_ARG_TYPE_INSTANCE_ID: UI4 = "A_ARG_TYPE_InstanceID" +} diff --git a/pmoupnp/src/mediarenderer/renderingcontrol/variables/mod.rs b/pmoupnp/src/mediarenderer/renderingcontrol/variables/mod.rs new file mode 100644 index 00000000..11a2e2c4 --- /dev/null +++ b/pmoupnp/src/mediarenderer/renderingcontrol/variables/mod.rs @@ -0,0 +1,9 @@ +mod a_arg_type_instanceid; +mod a_arg_type_channel; +mod volume; +mod mute; + +pub use a_arg_type_instanceid::A_ARG_TYPE_INSTANCE_ID; +pub use a_arg_type_channel::A_ARG_TYPE_CHANNEL; +pub use volume::VOLUME; +pub use mute::MUTE; diff --git a/pmoupnp/src/mediarenderer/renderingcontrol/variables/mute.rs b/pmoupnp/src/mediarenderer/renderingcontrol/variables/mute.rs new file mode 100644 index 00000000..bbae7f0d --- /dev/null +++ b/pmoupnp/src/mediarenderer/renderingcontrol/variables/mute.rs @@ -0,0 +1,7 @@ +use crate::define_variable; + +define_variable! { + pub static MUTE: Boolean = "Mute" { + evented: true, + } +} diff --git a/pmoupnp/src/mediarenderer/renderingcontrol/variables/volume.rs b/pmoupnp/src/mediarenderer/renderingcontrol/variables/volume.rs new file mode 100644 index 00000000..f59ee701 --- /dev/null +++ b/pmoupnp/src/mediarenderer/renderingcontrol/variables/volume.rs @@ -0,0 +1,7 @@ +use crate::define_variable; + +define_variable! { + pub static VOLUME: UI2 = "Volume" { + evented: true, + } +}