diff options
author | Simon Himmelbauer <simfreak@deliciae.at> | 2023-02-02 14:05:59 +0300 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2023-02-09 01:02:30 +0300 |
commit | 3c31c98d9536fe32cf56c7665cb75abdba1de252 (patch) | |
tree | 55cf2a215f401bf4bc76fa6dd9416f4ab5dfab86 /audio | |
parent | 0f383a65453640d9333aec943c412ac8120a238c (diff) |
spotifyaudiosrc: Support configurable bitrate
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1073>
Diffstat (limited to 'audio')
-rw-r--r-- | audio/spotify/src/spotifyaudiosrc/imp.rs | 24 | ||||
-rw-r--r-- | audio/spotify/src/spotifyaudiosrc/mod.rs | 31 |
2 files changed, 53 insertions, 2 deletions
diff --git a/audio/spotify/src/spotifyaudiosrc/imp.rs b/audio/spotify/src/spotifyaudiosrc/imp.rs index 58f30edd0..05f342431 100644 --- a/audio/spotify/src/spotifyaudiosrc/imp.rs +++ b/audio/spotify/src/spotifyaudiosrc/imp.rs @@ -31,6 +31,8 @@ use librespot::playback::{ player::{Player, PlayerEvent}, }; +use super::Bitrate; + static CAT: Lazy<gst::DebugCategory> = Lazy::new(|| { gst::DebugCategory::new( "spotifyaudiosrc", @@ -71,6 +73,7 @@ struct Settings { cache_files: String, cache_max_size: u64, track: String, + bitrate: Bitrate, } #[derive(Default)] @@ -132,6 +135,11 @@ impl ObjectImpl for SpotifyAudioSrc { .default_value(Some("")) .mutable_ready() .build(), + glib::ParamSpecEnum::builder::<Bitrate>("bitrate") + .nick("Spotify bitrate") + .blurb("Spotify audio bitrate in kbit/s") + .mutable_ready() + .build() ] }); @@ -164,6 +172,10 @@ impl ObjectImpl for SpotifyAudioSrc { let mut settings = self.settings.lock().unwrap(); settings.track = value.get().expect("type checked upstream"); } + "bitrate" => { + let mut settings = self.settings.lock().unwrap(); + settings.bitrate = value.get().expect("type checked upstream"); + } _ => unimplemented!(), } } @@ -194,6 +206,10 @@ impl ObjectImpl for SpotifyAudioSrc { let settings = self.settings.lock().unwrap(); settings.track.to_value() } + "bitrate" => { + let settings = self.settings.lock().unwrap(); + settings.bitrate.to_value() + } _ => unimplemented!(), } } @@ -434,7 +450,7 @@ impl SpotifyAudioSrc { } } - let (credentials, cache, track) = { + let (credentials, cache, track, bitrate) = { let settings = self.settings.lock().unwrap(); let credentials_cache = if settings.cache_credentials.is_empty() { @@ -482,7 +498,10 @@ impl SpotifyAudioSrc { bail!("track is not set") } - (credentials, cache, settings.track.clone()) + let bitrate = settings.bitrate.into(); + gst::debug!(CAT, imp: self, "Requesting bitrate {:?}", bitrate); + + (credentials, cache, settings.track.clone(), bitrate) }; let (session, _credentials) = @@ -490,6 +509,7 @@ impl SpotifyAudioSrc { let player_config = PlayerConfig { passthrough: true, + bitrate, ..Default::default() }; diff --git a/audio/spotify/src/spotifyaudiosrc/mod.rs b/audio/spotify/src/spotifyaudiosrc/mod.rs index a33988f33..183110c76 100644 --- a/audio/spotify/src/spotifyaudiosrc/mod.rs +++ b/audio/spotify/src/spotifyaudiosrc/mod.rs @@ -11,11 +11,42 @@ use gst::prelude::*; mod imp; +#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy, glib::Enum)] +#[repr(u32)] +#[enum_type(name = "GstRsSpotifyBitrate")] +enum Bitrate { + #[enum_value(name = "96 kbit/s", nick = "96")] + B96, + #[enum_value(name = "160 kbit/s", nick = "160")] + B160, + #[enum_value(name = "320 kbit/s", nick = "320")] + B320, +} + +impl Default for Bitrate { + fn default() -> Self { + Self::B160 + } +} + +impl From<Bitrate> for librespot::playback::config::Bitrate { + fn from(value: Bitrate) -> Self { + match value { + Bitrate::B96 => Self::Bitrate96, + Bitrate::B160 => Self::Bitrate160, + Bitrate::B320 => Self::Bitrate320, + } + } +} + glib::wrapper! { pub struct SpotifyAudioSrc(ObjectSubclass<imp::SpotifyAudioSrc>) @extends gst_base::PushSrc, gst_base::BaseSrc, gst::Element, gst::Object, @implements gst::URIHandler; } pub fn register(plugin: &gst::Plugin) -> Result<(), glib::BoolError> { + #[cfg(feature = "doc")] + Bitrate::static_type().mark_as_plugin_api(gst::PluginAPIFlags::empty()); + gst::Element::register( Some(plugin), "spotifyaudiosrc", |