Skip to content

Commit eedc2b1

Browse files
committed
Added init handling of group volume
1 parent 6c8a86d commit eedc2b1

File tree

1 file changed

+63
-4
lines changed

1 file changed

+63
-4
lines changed

heos-tui/src/app.rs

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
///
1111
1212
use std::{error, fmt};
13+
use std::collections::HashMap;
1314
use std::fmt::{Display, Formatter};
1415
use heos_lib::{HeosDevice, HeosGroup, HeosReply};
1516
use 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

Comments
 (0)