mirror of
https://github.com/librespot-org/librespot.git
synced 2025-10-06 03:50:06 +02:00
Cache volume across restarts (#220)
* create Volume struct for use with Cache * add "volume" file to Cache * load cached volume on start, intial overrides cached overrides default * amend volume_to_mixer function to cache the volume on every change * pass cache to Spirc and SpircTask so volume_to_mixer has access * rustfmt changes * revert volume_to_mixer function and Spirc/SpircTask cache variable * Volume implements Copy, pass by value instead of reference * clamp volume to 100 if cached value exceeds limit * convert Volume to u16 internally, use float and round to convert hex->dec * convert initial_volume and ConnectConfig.volume to u16 as well * add cache_volume function to SpircTask * remove conversion to/from percentage on cached volume * consolidate device.set_volume, mixer.set_volume, and caching * streamline intial volume logic
This commit is contained in:
parent
21f1ccfb5a
commit
d40c0f50db
8 changed files with 84 additions and 26 deletions
|
@ -7,6 +7,7 @@ use std::path::PathBuf;
|
|||
|
||||
use authentication::Credentials;
|
||||
use spotify_id::FileId;
|
||||
use volume::Volume;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Cache {
|
||||
|
@ -52,6 +53,23 @@ impl Cache {
|
|||
}
|
||||
}
|
||||
|
||||
// cache volume to root/volume
|
||||
impl Cache {
|
||||
fn volume_path(&self) -> PathBuf {
|
||||
self.root.join("volume")
|
||||
}
|
||||
|
||||
pub fn volume(&self) -> Option<u16> {
|
||||
let path = self.volume_path();
|
||||
Volume::from_file(path)
|
||||
}
|
||||
|
||||
pub fn save_volume(&self, volume: Volume) {
|
||||
let path = self.volume_path();
|
||||
volume.save_to_file(&path);
|
||||
}
|
||||
}
|
||||
|
||||
impl Cache {
|
||||
fn file_path(&self, file: FileId) -> PathBuf {
|
||||
let name = file.to_base16();
|
||||
|
|
|
@ -81,6 +81,6 @@ impl Default for DeviceType {
|
|||
pub struct ConnectConfig {
|
||||
pub name: String,
|
||||
pub device_type: DeviceType,
|
||||
pub volume: i32,
|
||||
pub volume: u16,
|
||||
pub linear_volume: bool,
|
||||
}
|
||||
|
|
|
@ -52,3 +52,4 @@ pub mod session;
|
|||
pub mod spotify_id;
|
||||
pub mod util;
|
||||
pub mod version;
|
||||
pub mod volume;
|
||||
|
|
31
core/src/volume.rs
Normal file
31
core/src/volume.rs
Normal file
|
@ -0,0 +1,31 @@
|
|||
use std::fs::File;
|
||||
use std::io::{Read, Write};
|
||||
use std::path::Path;
|
||||
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct Volume {
|
||||
pub volume: u16,
|
||||
}
|
||||
|
||||
impl Volume {
|
||||
// read volume from file
|
||||
fn from_reader<R: Read>(mut reader: R) -> u16 {
|
||||
let mut contents = String::new();
|
||||
reader.read_to_string(&mut contents).unwrap();
|
||||
contents.trim().parse::<u16>().unwrap()
|
||||
}
|
||||
|
||||
pub(crate) fn from_file<P: AsRef<Path>>(path: P) -> Option<u16> {
|
||||
File::open(path).ok().map(Volume::from_reader)
|
||||
}
|
||||
|
||||
// write volume to file
|
||||
fn save_to_writer<W: Write>(&self, writer: &mut W) {
|
||||
writer.write_all(self.volume.to_string().as_bytes()).unwrap();
|
||||
}
|
||||
|
||||
pub(crate) fn save_to_file<P: AsRef<Path>>(&self, path: P) {
|
||||
let mut file = File::create(path).unwrap();
|
||||
self.save_to_writer(&mut file)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue