@@ -14,6 +14,7 @@ pub struct AudioChannel {
1414 pub auto_consume : Arc < Mutex < bool > > ,
1515 currently_playing : Arc < Mutex < Option < AudioSink > > > ,
1616 effects_chain : Arc < Mutex < Vec < ActionType > > > ,
17+ channel_volume : Arc < Mutex < f32 > > ,
1718}
1819
1920impl fmt:: Debug for AudioSink {
@@ -33,9 +34,17 @@ impl AudioChannel {
3334
3435 pub fn consume ( & mut self ) {
3536 if let Some ( mut sink) = self . pop ( ) {
37+ let volume = self . channel_volume . lock ( ) . unwrap ( ) ;
38+ let _ = sink. set_volume ( * volume) ;
3639 let _ = sink. play ( ) ;
3740 }
3841 }
42+
43+ pub fn set_volume ( & mut self , volume : f32 ) {
44+ if let Ok ( mut volume_guard) = self . channel_volume . lock ( ) {
45+ * volume_guard = volume;
46+ }
47+ }
3948}
4049
4150#[ pymethods]
@@ -47,6 +56,7 @@ impl AudioChannel {
4756 auto_consume : Arc :: new ( Mutex :: new ( false ) ) ,
4857 currently_playing : Arc :: new ( Mutex :: new ( None ) ) ,
4958 effects_chain : Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ,
59+ channel_volume : Arc :: new ( Mutex :: new ( 1.0 ) ) ,
5060 } ;
5161
5262 let channel_arc = Arc :: new ( Mutex :: new ( channel) ) ;
@@ -72,6 +82,8 @@ impl AudioChannel {
7282 {
7383 if playing_guard. is_none ( ) && !queue_guard. is_empty ( ) {
7484 let mut next_sink = queue_guard. remove ( 0 ) ;
85+ let volume = channel. channel_volume . lock ( ) . unwrap ( ) ;
86+ let _ = next_sink. set_volume ( * volume) ;
7587
7688 drop ( queue_guard) ;
7789
@@ -137,6 +149,18 @@ impl AudioChannel {
137149 }
138150 }
139151
152+ #[ setter]
153+ pub fn channel_volume ( & mut self , volume : f32 ) {
154+ if let Ok ( mut volume_guard) = self . channel_volume . lock ( ) {
155+ * volume_guard = volume;
156+ if let Ok ( mut currently_playing) = self . currently_playing . lock ( ) {
157+ if let Some ( ref mut sink) = * currently_playing {
158+ let _ = sink. set_volume ( volume) ;
159+ }
160+ }
161+ }
162+ }
163+
140164 #[ getter]
141165 pub fn auto_consume ( & self ) -> bool {
142166 if let Ok ( auto_consume_guard) = self . auto_consume . lock ( ) {
0 commit comments