@@ -3,6 +3,8 @@ mod macos;
33#[ cfg( not( any( target_os = "macos" ) ) ) ]
44mod null;
55
6+ use std:: sync:: { Arc , Mutex } ;
7+
68pub trait MediaBackend {
79 fn set_title ( & self , title : & str ) ;
810 fn set_artist ( & self , artist : & str ) ;
@@ -35,7 +37,7 @@ pub struct Metadata {
3537
3638pub struct MediaSession {
3739 backend : Box < dyn MediaBackend > ,
38- metadata : Metadata ,
40+ metadata : Arc < Mutex < Metadata > > ,
3941}
4042
4143impl 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