Skip to content

Commit cc1f054

Browse files
committed
implement Send and Sync for Metadata
1 parent 1a0f3a9 commit cc1f054

File tree

1 file changed

+29
-23
lines changed

1 file changed

+29
-23
lines changed

src/lib.rs

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ mod macos;
33
#[cfg(not(any(target_os = "macos")))]
44
mod null;
55

6+
use std::sync::{Arc, Mutex};
7+
68
pub trait MediaBackend {
79
fn set_title(&self, title: &str);
810
fn set_artist(&self, artist: &str);
@@ -35,7 +37,7 @@ pub struct Metadata {
3537

3638
pub struct MediaSession {
3739
backend: Box<dyn MediaBackend>,
38-
metadata: Metadata,
40+
metadata: Arc<Mutex<Metadata>>,
3941
}
4042

4143
impl MediaSession {
@@ -48,83 +50,87 @@ impl MediaSession {
4850

4951
Self {
5052
backend,
51-
metadata: Metadata {
53+
metadata: Arc::new(Mutex::new(Metadata {
5254
title: "".to_string(),
5355
artist: "".to_string(),
5456
album: "".to_string(),
5557
genre: "".to_string(),
5658
media_type: MediaType::Audio,
57-
duration: 0.0f64,
58-
playback_rate: 0.0f64,
59-
},
59+
duration: 0.0,
60+
playback_rate: 0.0,
61+
})),
6062
}
6163
}
6264

6365
pub fn set_title(&mut self, title: &str) {
64-
self.metadata.title = title.to_string();
66+
Arc::clone(&self.metadata).lock().unwrap().title = title.to_string();
6567
self.backend.set_title(title);
6668
}
6769

68-
pub fn title(&self) -> &str {
69-
&self.metadata.title
70+
pub fn title(&self) -> String {
71+
let data = self.metadata.lock().unwrap();
72+
data.title.clone()
7073
}
7174

7275
pub fn set_artist(&mut self, artist: &str) {
73-
self.metadata.artist = artist.to_string();
76+
Arc::clone(&self.metadata).lock().unwrap().artist = artist.to_string();
7477
self.backend.set_artist(artist);
7578
}
7679

77-
pub fn artist(&self) -> &str {
78-
&self.metadata.artist
80+
pub fn artist(&self) -> String {
81+
let data = self.metadata.lock().unwrap();
82+
data.artist.clone()
7983
}
8084

8185
pub fn set_album(&mut self, album: &str) {
82-
self.metadata.album = album.to_string();
86+
Arc::clone(&self.metadata).lock().unwrap().album = album.to_string();
8387
self.backend.set_album(album);
8488
}
8589

86-
pub fn album(&self) -> &str {
87-
&self.metadata.album
90+
pub fn album(&self) -> String {
91+
let data = self.metadata.lock().unwrap();
92+
data.album.clone()
8893
}
8994

9095
pub fn set_genre(&mut self, genre: &str) {
91-
self.metadata.genre = genre.to_string();
96+
Arc::clone(&self.metadata).lock().unwrap().genre = genre.to_string();
9297
self.backend.set_album(genre);
9398
}
9499

95-
pub fn genre(&self) -> &str {
96-
&self.metadata.genre
100+
pub fn genre(&self) -> String {
101+
let md = self.metadata.lock().unwrap();
102+
md.genre.clone()
97103
}
98104

99105
pub fn set_media_type(&mut self, media_type: MediaType) {
100-
self.metadata.media_type = media_type;
106+
Arc::clone(&self.metadata).lock().unwrap().media_type = media_type;
101107
self.backend.set_media_type(media_type);
102108
}
103109

104110
pub fn media_type(&self) -> MediaType {
105-
self.metadata.media_type
111+
Arc::clone(&self.metadata).lock().unwrap().media_type
106112
}
107113

108114
pub fn set_playback_duration(&mut self, duration: f64) {
109-
self.metadata.duration = duration;
115+
Arc::clone(&self.metadata).lock().unwrap().duration = duration;
110116
self.backend.set_playback_duration(duration);
111117
}
112118

113119
pub fn duration(&self) -> f64 {
114-
self.metadata.duration
120+
Arc::clone(&self.metadata).lock().unwrap().duration
115121
}
116122

117123
pub fn set_elapsed_duration(&self, duration: f64) {
118124
self.backend.set_elapsed_duration(duration);
119125
}
120126

121127
pub fn set_playback_rate(&mut self, rate: f64) {
122-
self.metadata.playback_rate = rate;
128+
Arc::clone(&self.metadata).lock().unwrap().playback_rate = rate;
123129
self.backend.set_playback_rate(rate);
124130
}
125131

126132
pub fn playback_rate(&self) -> f64 {
127-
self.metadata.playback_rate
133+
Arc::clone(&self.metadata).lock().unwrap().playback_rate
128134
}
129135

130136
pub fn start(&self) {

0 commit comments

Comments
 (0)