Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/sdroege/gst-plugin-rs.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/audio
diff options
context:
space:
mode:
authorSimon Himmelbauer <simfreak@deliciae.at>2023-02-02 14:05:59 +0300
committerSebastian Dröge <sebastian@centricular.com>2023-02-09 01:02:30 +0300
commit3c31c98d9536fe32cf56c7665cb75abdba1de252 (patch)
tree55cf2a215f401bf4bc76fa6dd9416f4ab5dfab86 /audio
parent0f383a65453640d9333aec943c412ac8120a238c (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.rs24
-rw-r--r--audio/spotify/src/spotifyaudiosrc/mod.rs31
2 files changed, 53 insertions, 2 deletions
diff --git a/audio/spotify/src/spotifyaudiosrc/imp.rs b/audio/spotify/src/spotifyaudiosrc/imp.rs
index 58f30edd..05f34243 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 a33988f3..183110c7 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",