1010///
1111
1212use std:: { error, fmt} ;
13+ use std:: collections:: HashMap ;
1314use std:: fmt:: { Display , Formatter } ;
1415use heos_lib:: { HeosDevice , HeosGroup , HeosReply } ;
1516use ratatui:: widgets:: ListState ;
@@ -165,6 +166,13 @@ impl App {
165166 }
166167
167168 fn set_volume ( & mut self , step : i16 ) {
169+ match self . focus_state {
170+ Focus :: Devices => self . set_player_volume ( step) ,
171+ Focus :: Groups => self . set_group_volume ( step) ,
172+ }
173+ }
174+
175+ fn set_player_volume ( & mut self , step : i16 ) {
168176 if let Some ( i) = self . dev_list_state . selected ( ) {
169177 let dev_list = Arc :: clone ( & self . dev_list ) ;
170178 let read_list = dev_list. read ( ) . unwrap ( ) ;
@@ -188,17 +196,19 @@ impl App {
188196
189197 let level_str = level. to_string ( ) ;
190198
191- info ! ( "set_volume : level={}" , level_str) ;
199+ info ! ( "set_player_volume : level={}" , level_str) ;
192200
193201 let cmd = HeosCommand :: new ( )
194202 . group ( "player" )
195203 . cmd ( "set_volume" )
196204 . attr ( "level" , & * level_str) ;
197205
198- let reply = dev. send_command ( & cmd) . await . unwrap ( ) ;
206+ let reply = dev. send_command ( & cmd) . await . unwrap_or_else ( |err| {
207+ HeosReply :: Error ( false , err. to_string ( ) , HashMap :: new ( ) )
208+ } ) ;
199209
200210 if let HeosReply :: Volume ( success, _) = reply {
201- info ! ( "set_volume : success={}, level={}" , success, level) ;
211+ info ! ( "set_player_volume : success={}, level={}" , success, level) ;
202212
203213 if success {
204214 let mut write_list = dev_list. write ( ) . unwrap ( ) ;
@@ -211,7 +221,56 @@ impl App {
211221 cloned_sender. send ( Event :: Redraw ) . unwrap ( ) ;
212222 }
213223 } else if let HeosReply :: Error ( success, command, message) = reply {
214- error ! ( "set_state: success={}, command={:?}, message={:?}" ,
224+ error ! ( "set_player_volume: success={}, command={:?}, message={:?}" ,
225+ success, command, message) ;
226+ }
227+ } ) ;
228+ }
229+ }
230+
231+ fn set_group_volume ( & mut self , step : i16 ) {
232+ if let Some ( i) = self . group_list_state . selected ( ) {
233+ let group_list = Arc :: clone ( & self . group_list ) ;
234+ let read_list = group_list. read ( ) . unwrap ( ) ;
235+
236+ let mut group = read_list. get ( i) . unwrap ( ) . clone ( ) ;
237+
238+ drop ( read_list) ;
239+
240+ let cloned_sender = self . sender . clone ( ) ;
241+
242+ tokio:: spawn ( async move {
243+
244+ /* Calculate and normalize new volume level */
245+ let new_level = group. volume as i16 + step;
246+
247+ let level : u16 = if 0 > new_level {
248+ 0
249+ } else {
250+ new_level as u16
251+ } ;
252+
253+ let level_str = level. to_string ( ) ;
254+
255+ info ! ( "set_group_volume: level={}" , level_str) ;
256+
257+ let cmd = HeosCommand :: new ( )
258+ . group ( "group" )
259+ . cmd ( "set_volume" )
260+ . attr ( "level" , & * level_str) ;
261+
262+ let reply = group. send_command ( & cmd) . await . unwrap_or_else ( |err| {
263+ HeosReply :: Error ( false , err. to_string ( ) , HashMap :: new ( ) )
264+ } ) ;
265+
266+ if let HeosReply :: Volume ( success, _) = reply {
267+ info ! ( "set_group_volume: success={}, level={}" , success, level) ;
268+
269+ if success {
270+ cloned_sender. send ( Event :: Redraw ) . unwrap ( ) ;
271+ }
272+ } else if let HeosReply :: Error ( success, command, message) = reply {
273+ error ! ( "set_group_volume: success={}, command={:?}, message={:?}" ,
215274 success, command, message) ;
216275 }
217276 } ) ;
0 commit comments