Compare commits

..

115 Commits

Author SHA1 Message Date
arabianq 180a69bd40 change version to 1.2.0 2025-12-16 21:08:47 +03:00
arabianq 6de51bc11c cargo update 2025-12-16 21:08:47 +03:00
arabianq bc9f086245 fix: do not display files from removed dir 2025-12-16 21:08:47 +03:00
arabianq f84cc03a6c now can select multiple dirs at once 2025-12-16 21:08:47 +03:00
arabianq 96dda1d8a9 fix: incorrect scroll bar rendering 2025-12-16 21:08:47 +03:00
arabianq 87b791ee3a new feature: pause playback when GUI window is closed 2025-12-16 21:08:47 +03:00
arabianq ae5da6d9bd new feature: now can play file without opening any dir 2025-12-16 21:08:47 +03:00
arabianq 546b6fd13f add toggle-pause command to pwsp-cli 2025-12-16 21:08:47 +03:00
arabianq e8d1947f18 change version to 1.1.4 2025-12-16 21:08:47 +03:00
arabianq 9e55cb5f8b cargo update 2025-12-16 21:08:47 +03:00
arabianq 7f57175519 bump clap version to 4.5.53 2025-12-16 21:08:47 +03:00
arabianq b21b32f746 bump egui and eframe to 0.33.3 2025-12-16 21:08:47 +03:00
arabianq 3827d54ba8 change version to 1.1.3 2025-12-16 21:08:47 +03:00
arabianq 9801b0cdf5 cargo update 2025-12-16 21:08:47 +03:00
arabianq 154f33b15b bump rfd to 0.16.0 2025-12-16 21:08:47 +03:00
arabianq fa217c3b25 fix not working with mono input devices 2025-12-16 21:08:47 +03:00
arabianq 1fb8daf389 change version to 1.1.2 2025-12-16 21:08:47 +03:00
arabianq f2213d1def fix incorrect volume slider width 2025-12-16 21:08:47 +03:00
arabianq 6997a6fa71 disable hotkeys when some widget is focused 2025-12-16 21:08:47 +03:00
arabianq e1ae768f26 change version to 1.1.1 2025-12-16 21:08:47 +03:00
arabianq 57c4461952 fix: crash when setting negative position 2025-12-16 21:08:47 +03:00
arabianq 5c46ff4a1e new hotkeys to select dirs, files. 2025-12-16 21:08:47 +03:00
arabianq 9112102c16 cargo update 2025-12-16 21:08:47 +03:00
arabianq 9d1eb8bee9 change version to 1.1.0 2025-12-16 21:08:47 +03:00
arabianq 39fe8a59c7 add 10s timeout before starting pwsp-daemon via systemd service 2025-12-16 21:08:47 +03:00
arabianq 5870f7d440 update dependencies 2025-12-16 21:08:47 +03:00
arabianq 4a060e4669 change version to 1.0.3 2025-12-16 21:08:47 +03:00
arabianq 3981833a3b call pipewire::init in every pipewire thread 2025-12-16 21:08:47 +03:00
arabianq 1ea84dbb28 cargo update 2025-12-16 21:08:47 +03:00
arabianq 195aa56ceb deps: update clap 2025-12-16 21:08:47 +03:00
arabianq b205800a66 deps: update egui, eframe, egui_material_icons 2025-12-16 21:08:47 +03:00
arabianq 5e538db201 fix: now systemd service should wait for pipewire to start 2025-12-16 21:08:47 +03:00
arabianq 0bcd23195f change pwsp version to 1.0.2 2025-12-16 21:08:47 +03:00
arabianq ca0196f927 update dependencies 2025-12-16 21:08:47 +03:00
arabianq 874c8063aa use device name instead of node id to get audio device 2025-12-16 21:08:47 +03:00
arabianq d877f79d5c fix pwsp.spec failed to build 2025-12-16 21:08:47 +03:00
arabianq 3cfd2cb9bd update descriptions in github actions to use new tags format 2025-12-16 21:08:47 +03:00
arabianq bf1f8410c1 change pwsp.spec to use new tags format 2025-12-16 21:08:47 +03:00
arabianq ad7c63617b change package version to 1.0.1 2025-12-16 21:08:47 +03:00
arabianq 00b25dde9d cargo update 2025-12-16 21:08:47 +03:00
arabianq e3118a4b89 bump serde version to 1.0.227 2025-12-16 21:08:47 +03:00
arabianq 23f5ee0d22 change code to work with pipewire 0.9.2 2025-12-16 21:08:47 +03:00
arabianq 5c4df232d5 bump pipewire crate to version 0.9.2 2025-12-16 21:08:47 +03:00
arabianq 7f0e6f7996 change: now, instead of the full path to the file, only its name is displayed at the top 2025-12-16 21:08:47 +03:00
arabianq ab60e6b0ab fix: too large directory names break the interface 2025-12-16 21:08:47 +03:00
arabian 3b3c5c32f9 Delete scripts directory 2025-12-16 21:08:47 +03:00
arabian 74b76dd61d Update README.md 2025-12-16 21:08:47 +03:00
arabian 3b3db608e8 Update release-deb.yml
fix .deb uploading
2025-12-16 21:08:47 +03:00
arabian b1a24cb50e Update release-deb.yml
change name
2025-12-16 21:08:47 +03:00
arabian 1855a8b72c Create release-deb.yml 2025-12-16 21:08:47 +03:00
arabian 42ab513ad9 Update and rename build-release.yml to release-archive.yml 2025-12-16 21:08:47 +03:00
arabian ba04546b17 Update build-release.yml 2025-12-16 21:08:47 +03:00
arabian 6feec98b4c Update build-release.yml
try to fix zip creation
2025-12-16 21:08:47 +03:00
arabian 43e1c60baa Update build-release.yml
change workflow_dispatch description
2025-12-16 21:08:47 +03:00
arabian 2f5fc04244 Update build-release.yml
add build dependencies installation
2025-12-16 21:08:47 +03:00
arabian aa45a49c3a Create build-release.yml 2025-12-16 21:08:47 +03:00
arabian dd8ff8b1bf Update README.md
add installation on Arch Linux from AUR
2025-12-16 21:08:47 +03:00
arabianq 25667ce0f0 update README.md 2025-12-16 21:08:47 +03:00
arabianq ccf48e6426 remove build_rpm.sh and cargo-generate-rpm mentions. Now copr handles rpm builds 2025-12-16 21:08:47 +03:00
arabianq da79be0d22 fix pwsp.spec 2025-12-16 21:08:47 +03:00
arabianq 01afb01198 add missing files to pwsp.spec 2025-12-16 21:08:47 +03:00
arabianq 37723ddc30 specify BuildRequires and %install manually in pwsp.spec 2025-12-16 21:08:47 +03:00
arabianq b672d9bd10 update pwsp.spec file 2025-12-16 21:08:47 +03:00
arabianq fa8a7b7590 update pwsp.spec file 2025-12-16 21:08:47 +03:00
arabianq d3c8706c33 update pwsp.spec file 2025-12-16 21:08:47 +03:00
arabianq 071e805457 fix Source url in pwsp.spec 2025-12-16 21:08:47 +03:00
arabianq 4f30f5047e add pwsp.spec 2025-12-16 21:08:47 +03:00
arabianq e173a27c6e remove generate_rpm_spec.sh 2025-12-16 21:08:47 +03:00
arabianq 5891cc071e use --path . in generate_rpm_spec 2025-12-16 21:08:47 +03:00
arabianq b02acb44fb add rust-pwsp.spec 2025-12-16 21:08:47 +03:00
arabianq c4a01a9f72 add generate_rpm_spec.sh and rust-pwsp.spec 2025-12-16 21:08:47 +03:00
arabianq be5a619b89 fix .rpm configuration 2025-12-16 21:08:47 +03:00
arabianq 00a3aa4ca4 new README 2025-12-16 21:08:47 +03:00
arabianq dee908a347 1.0.0 rewrite 2025-12-16 21:08:47 +03:00
arabianq 4f8681a8c6 clear README 2025-12-16 21:08:47 +03:00
arabianq 675f29f51f remove everything 2025-12-16 21:08:47 +03:00
arabianq 2efe16376c change version to 0.1.8 2025-12-16 21:08:47 +03:00
arabianq 607e30da7c cargo update 2025-12-16 21:08:47 +03:00
arabianq d6f96f3035 better imports 2025-12-16 21:08:47 +03:00
arabianq 81cea863e4 PlayerState::PLAYING -> PlayerState::Playing; PlayerState::PAUSED -> PlayerState::Paused 2025-12-16 21:08:47 +03:00
arabianq ac721d0c4d cargo clippy 2025-12-16 21:08:47 +03:00
arabianq 06f12cd740 bump egui and eframe to 0.32.3 2025-12-16 21:08:47 +03:00
arabianq dda87f3222 change version to 0.1.7 2025-12-16 21:08:47 +03:00
arabianq 8b1c4773c3 update egui and eframe to 0.32.2 2025-12-16 21:08:47 +03:00
arabianq 9b71c105fc change version to 0.1.6 2025-12-16 21:08:47 +03:00
arabianq 82d603cbab update deps 2025-12-16 21:08:47 +03:00
arabianq e6d0e6e128 fix crash when seeking 2025-12-16 21:08:47 +03:00
arabian 4c62d9f1e7 Update README.md 2025-12-16 21:08:47 +03:00
arabianq c40251b2a1 version -> 0.1.5 2025-12-16 21:08:47 +03:00
arabianq b7fa90d37e update dependencies 2025-12-16 21:08:47 +03:00
arabianq e3b787204d rodio -> 0.21.1 2025-12-16 21:08:47 +03:00
arabianq 0a5d61b510 version -> 0.1.4 2025-12-16 21:08:47 +03:00
arabianq ef3cb0f48c fix incorrect dependency for deb package 2025-12-16 21:08:47 +03:00
arabianq 19b5e52ba6 update Cargo.toml 2025-12-16 21:08:47 +03:00
arabianq 6b75654511 egui, eframe -> 0.32.0; egui_material_icons -> 0.4.0 2025-12-16 21:08:47 +03:00
arabianq 22c5ca6384 update build scripts 2025-12-16 21:08:47 +03:00
arabianq eacfaaf8f6 update README 2025-12-16 21:08:47 +03:00
arabianq f3e574e8c9 update screenshot.png 2025-12-16 21:08:47 +03:00
arabianq cc02c6c3c0 new build scripts and .desktop file 2025-12-16 21:08:47 +03:00
arabianq 7ec53f259e version -> 0.1.31 2025-12-16 21:08:47 +03:00
arabianq dddd4c5440 maximum volume -> 1.0 from 5.0 2025-12-16 21:08:47 +03:00
arabianq 1a9836a7d9 version -> 0.1.3 2025-12-16 21:08:47 +03:00
arabianq 26eec0c0ef now use single settings file instead of many; minor refactoring 2025-12-16 21:08:47 +03:00
arabianq 3ba7a79010 new app::run function 2025-12-16 21:08:47 +03:00
arabianq 6ab54d7ec9 move creation of dirs to the separate function 2025-12-16 21:08:47 +03:00
arabianq af4f175e0c split main.rs into main.rs and app.rs 2025-12-16 21:08:47 +03:00
arabianq 9907408541 bump pwsp version to 0.1.2 2025-12-16 21:08:47 +03:00
arabianq b3e0d730da bump edition to 2024 2025-12-16 21:08:47 +03:00
arabianq edfd2ba9b7 fixed setting player position to 0 2025-12-16 21:08:47 +03:00
arabianq f2ce47cdcd bump egui, eframe and rfd versions 2025-12-16 21:08:47 +03:00
arabianq 6b10d365fc v0.1.1 - minor fixes 2025-12-16 21:08:47 +03:00
arabianq da756ccffe Added unlink() function 2025-12-16 21:08:47 +03:00
arabianq 5e99870a71 Update README.md 2025-12-16 21:08:47 +03:00
arabianq ed5d6f63b1 Added Cargo.lock 2025-12-16 21:08:47 +03:00
arabian 89a58c27a0 Create LICENSE 2025-12-16 21:08:47 +03:00
10 changed files with 103 additions and 32 deletions
Generated
+15 -6
View File
@@ -1726,13 +1726,13 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
[[package]] [[package]]
name = "libredox" name = "libredox"
version = "0.1.10" version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" checksum = "df15f6eac291ed1cf25865b1ee60399f57e7c227e7f51bdbd4c5270396a9ed50"
dependencies = [ dependencies = [
"bitflags 2.10.0", "bitflags 2.10.0",
"libc", "libc",
"redox_syscall 0.5.18", "redox_syscall 0.6.0",
] ]
[[package]] [[package]]
@@ -1864,9 +1864,9 @@ dependencies = [
[[package]] [[package]]
name = "moxcms" name = "moxcms"
version = "0.7.10" version = "0.7.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80986bbbcf925ebd3be54c26613d861255284584501595cf418320c078945608" checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97"
dependencies = [ dependencies = [
"num-traits", "num-traits",
"pxfm", "pxfm",
@@ -2601,7 +2601,7 @@ checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773"
[[package]] [[package]]
name = "pwsp" name = "pwsp"
version = "1.1.4" version = "1.2.0"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"clap", "clap",
@@ -2730,6 +2730,15 @@ dependencies = [
"bitflags 2.10.0", "bitflags 2.10.0",
] ]
[[package]]
name = "redox_syscall"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec96166dafa0886eb81fe1c0a388bece180fbef2135f97c1e2cf8302e74b43b5"
dependencies = [
"bitflags 2.10.0",
]
[[package]] [[package]]
name = "redox_users" name = "redox_users"
version = "0.5.2" version = "0.5.2"
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "pwsp" name = "pwsp"
version = "1.1.4" version = "1.2.0"
edition = "2024" edition = "2024"
authors = ["arabian"] authors = ["arabian"]
description = "PWSP lets you play audio files through your microphone. Has both CLI and GUI clients." description = "PWSP lets you play audio files through your microphone. Has both CLI and GUI clients."
+1 -1
View File
@@ -4,7 +4,7 @@
%global cargo_install_lib 0 %global cargo_install_lib 0
Name: pwsp Name: pwsp
Version: 1.1.4 Version: 1.2.0
Release: %autorelease Release: %autorelease
Summary: Lets you play audio files through your microphone Summary: Lets you play audio files through your microphone
+10 -7
View File
@@ -14,17 +14,17 @@ struct Cli {
#[derive(Subcommand, Debug)] #[derive(Subcommand, Debug)]
enum Commands { enum Commands {
/// Perform an action (ping, pause, resume, stop, play) /// Perform an action (ping, pause, resume, toggle-pause, stop, play)
Action { Action {
#[clap(subcommand)] #[clap(subcommand)]
action: Actions, action: Actions,
}, },
/// Get information from the player (is paused, volume, position, state) /// Get information from the player (is paused, volume, position, duration, state, current-file-path, input, inputs)
Get { Get {
#[clap(subcommand)] #[clap(subcommand)]
parameter: GetCommands, parameter: GetCommands,
}, },
/// Set information in the player (volume, position) /// Set information in the player (volume, position, input)
Set { Set {
#[clap(subcommand)] #[clap(subcommand)]
parameter: SetCommands, parameter: SetCommands,
@@ -39,6 +39,8 @@ enum Actions {
Pause, Pause,
/// Resume audio playback /// Resume audio playback
Resume, Resume,
/// Toggle pause
TogglePause,
/// Stop audio playback and clear the queue /// Stop audio playback and clear the queue
Stop, Stop,
/// Play a file /// Play a file
@@ -51,11 +53,11 @@ enum GetCommands {
IsPaused, IsPaused,
/// Playback volume /// Playback volume
Volume, Volume,
/// Playback position /// Playback position (in seconds)
Position, Position,
/// Duration of the current file /// Duration of the current file
Duration, Duration,
/// Player state /// Player state (Playing, Paused or Stopped)
State, State,
/// Current playing file path /// Current playing file path
CurrentFilePath, CurrentFilePath,
@@ -69,9 +71,9 @@ enum GetCommands {
enum SetCommands { enum SetCommands {
/// Playback volume /// Playback volume
Volume { volume: f32 }, Volume { volume: f32 },
/// Playback position /// Playback position (in seconds)
Position { position: f32 }, Position { position: f32 },
/// Input /// Audio input id (see pwsp-cli get inputs)
Input { name: String }, Input { name: String },
} }
@@ -86,6 +88,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
Actions::Ping => Request::ping(), Actions::Ping => Request::ping(),
Actions::Pause => Request::pause(), Actions::Pause => Request::pause(),
Actions::Resume => Request::resume(), Actions::Resume => Request::resume(),
Actions::TogglePause => Request::toggle_pause(),
Actions::Stop => Request::stop(), Actions::Stop => Request::stop(),
Actions::Play { file_path } => Request::play(file_path.to_str().unwrap()), Actions::Play { file_path } => Request::play(file_path.to_str().unwrap()),
}, },
+23 -12
View File
@@ -1,7 +1,7 @@
use crate::gui::SoundpadGui; use crate::gui::{SUPPORTED_EXTENSIONS, SoundpadGui};
use egui::{ use egui::{
AtomExt, Button, Color32, ComboBox, FontFamily, Label, RichText, ScrollArea, Slider, TextEdit, Align, AtomExt, Button, Color32, ComboBox, FontFamily, Label, Layout, RichText, ScrollArea,
Ui, Vec2, Slider, TextEdit, Ui, Vec2,
}; };
use egui_material_icons::icons; use egui_material_icons::icons;
use pwsp::types::audio_player::PlayerState; use pwsp::types::audio_player::PlayerState;
@@ -48,10 +48,15 @@ impl SoundpadGui {
&mut self.config.save_scale_factor, &mut self.config.save_scale_factor,
"Always remember UI scale factor", "Always remember UI scale factor",
); );
let pause_on_exit_response = ui.checkbox(
&mut self.config.pause_on_exit,
"Pause audio playback when the window is closed",
);
if save_volume_response.changed() if save_volume_response.changed()
|| save_input_response.changed() || save_input_response.changed()
|| save_scale_response.changed() || save_scale_response.changed()
|| pause_on_exit_response.changed()
{ {
self.config.save_to_file().ok(); self.config.save_to_file().ok();
} }
@@ -182,6 +187,8 @@ impl SoundpadGui {
ui.set_min_height(area_size.y); ui.set_min_height(area_size.y);
ScrollArea::vertical().id_salt(0).show(ui, |ui| { ScrollArea::vertical().id_salt(0).show(ui, |ui| {
ui.set_min_width(area_size.x);
let mut dirs: Vec<PathBuf> = self.app_state.dirs.iter().cloned().collect(); let mut dirs: Vec<PathBuf> = self.app_state.dirs.iter().cloned().collect();
dirs.sort(); dirs.sort();
for path in dirs.iter() { for path in dirs.iter() {
@@ -216,10 +223,18 @@ impl SoundpadGui {
} }
ui.horizontal(|ui| { ui.horizontal(|ui| {
let add_dir_button = egui::Button::new(icons::ICON_ADD).frame(false); let add_dirs_button = Button::new(icons::ICON_ADD).frame(false);
let add_dir_button_response = ui.add_sized([18.0, 18.0], add_dir_button); let add_dirs_button_response = ui.add_sized([18.0, 18.0], add_dirs_button);
if add_dir_button_response.clicked() { if add_dirs_button_response.clicked() {
self.add_dir(); self.add_dirs();
}
});
ui.with_layout(Layout::bottom_up(Align::Min), |ui| {
let play_file_button = Button::new("Play file");
let play_file_button_response = ui.add(play_file_button);
if play_file_button_response.clicked() {
self.open_file();
} }
}); });
}); });
@@ -227,10 +242,6 @@ impl SoundpadGui {
} }
fn draw_files(&mut self, ui: &mut Ui, area_size: Vec2) { fn draw_files(&mut self, ui: &mut Ui, area_size: Vec2) {
let extensions = [
"mp3", "wav", "ogg", "flac", "mp4", "m4a", "aac", "mov", "mkv", "webm", "avi",
];
ui.vertical(|ui| { ui.vertical(|ui| {
ui.horizontal(|ui| { ui.horizontal(|ui| {
let search_field = ui.add_sized( let search_field = ui.add_sized(
@@ -256,7 +267,7 @@ impl SoundpadGui {
continue; continue;
} }
if !extensions if !SUPPORTED_EXTENSIONS
.contains(&entry_path.extension().unwrap_or_default().to_str().unwrap()) .contains(&entry_path.extension().unwrap_or_default().to_str().unwrap())
{ {
continue; continue;
+24 -4
View File
@@ -23,6 +23,10 @@ use std::{
sync::{Arc, Mutex}, sync::{Arc, Mutex},
}; };
const SUPPORTED_EXTENSIONS: [&str; 11] = [
"mp3", "wav", "ogg", "flac", "mp4", "m4a", "aac", "mov", "mkv", "webm", "avi",
];
struct SoundpadGui { struct SoundpadGui {
pub app_state: AppState, pub app_state: AppState,
pub config: GuiConfig, pub config: GuiConfig,
@@ -68,10 +72,19 @@ impl SoundpadGui {
}; };
} }
pub fn add_dir(&mut self) { pub fn open_file(&mut self) {
let file_dialog = FileDialog::new().add_filter("Audio File", &SUPPORTED_EXTENSIONS);
if let Some(path) = file_dialog.pick_file() {
self.play_file(&path);
}
}
pub fn add_dirs(&mut self) {
let file_dialog = FileDialog::new(); let file_dialog = FileDialog::new();
if let Some(path) = file_dialog.pick_folder() { if let Some(paths) = file_dialog.pick_folders() {
self.app_state.dirs.insert(path); for path in paths {
self.app_state.dirs.insert(path);
}
self.config.dirs = self.app_state.dirs.clone(); self.config.dirs = self.app_state.dirs.clone();
self.config.save_to_file().ok(); self.config.save_to_file().ok();
} }
@@ -83,6 +96,7 @@ impl SoundpadGui {
&& current_dir == path && current_dir == path
{ {
self.app_state.current_dir = None; self.app_state.current_dir = None;
self.app_state.files.clear();
} }
self.config.dirs = self.app_state.dirs.clone(); self.config.dirs = self.app_state.dirs.clone();
self.config.save_to_file().ok(); self.config.save_to_file().ok();
@@ -138,7 +152,13 @@ pub async fn run() -> Result<(), Box<dyn Error>> {
Ok(Box::new(SoundpadGui::new(&cc.egui_ctx))) Ok(Box::new(SoundpadGui::new(&cc.egui_ctx)))
}), }),
) { ) {
Ok(_) => Ok(()), Ok(_) => {
let config = get_gui_config();
if config.pause_on_exit {
make_request_sync(Request::pause()).ok();
}
Ok(())
}
Err(e) => Err(e.into()), Err(e) => Err(e.into()),
} }
} }
+22 -1
View File
@@ -1,5 +1,5 @@
use crate::{ use crate::{
types::socket::Response, types::{audio_player::PlayerState, socket::Response},
utils::{daemon::get_audio_player, pipewire::get_all_devices}, utils::{daemon::get_audio_player, pipewire::get_all_devices},
}; };
use async_trait::async_trait; use async_trait::async_trait;
@@ -16,6 +16,8 @@ pub struct PauseCommand {}
pub struct ResumeCommand {} pub struct ResumeCommand {}
pub struct TogglePauseCommand {}
pub struct StopCommand {} pub struct StopCommand {}
pub struct IsPausedCommand {} pub struct IsPausedCommand {}
@@ -75,6 +77,25 @@ impl Executable for ResumeCommand {
} }
} }
#[async_trait]
impl Executable for TogglePauseCommand {
async fn execute(&self) -> Response {
let mut audio_player = get_audio_player().await.lock().await;
if audio_player.get_state() == PlayerState::Stopped {
return Response::new(false, "Audio is not playing");
}
if audio_player.is_paused() {
audio_player.resume();
Response::new(true, "Audio was resumed")
} else {
audio_player.pause();
Response::new(true, "Audio was paused")
}
}
}
#[async_trait] #[async_trait]
impl Executable for StopCommand { impl Executable for StopCommand {
async fn execute(&self) -> Response { async fn execute(&self) -> Response {
+2
View File
@@ -36,6 +36,7 @@ pub struct GuiConfig {
pub save_volume: bool, pub save_volume: bool,
pub save_input: bool, pub save_input: bool,
pub save_scale_factor: bool, pub save_scale_factor: bool,
pub pause_on_exit: bool,
pub dirs: HashSet<PathBuf>, pub dirs: HashSet<PathBuf>,
} }
@@ -48,6 +49,7 @@ impl Default for GuiConfig {
save_volume: false, save_volume: false,
save_input: false, save_input: false,
save_scale_factor: false, save_scale_factor: false,
pause_on_exit: false,
dirs: HashSet::default(), dirs: HashSet::default(),
} }
+4
View File
@@ -32,6 +32,10 @@ impl Request {
Request::new("resume", vec![]) Request::new("resume", vec![])
} }
pub fn toggle_pause() -> Self {
Request::new("toggle_pause", vec![])
}
pub fn stop() -> Self { pub fn stop() -> Self {
Request::new("stop", vec![]) Request::new("stop", vec![])
} }
+1
View File
@@ -7,6 +7,7 @@ pub fn parse_command(request: &Request) -> Option<Box<dyn Executable + Send>> {
"ping" => Some(Box::new(PingCommand {})), "ping" => Some(Box::new(PingCommand {})),
"pause" => Some(Box::new(PauseCommand {})), "pause" => Some(Box::new(PauseCommand {})),
"resume" => Some(Box::new(ResumeCommand {})), "resume" => Some(Box::new(ResumeCommand {})),
"toggle_pause" => Some(Box::new(TogglePauseCommand {})),
"stop" => Some(Box::new(StopCommand {})), "stop" => Some(Box::new(StopCommand {})),
"is_paused" => Some(Box::new(IsPausedCommand {})), "is_paused" => Some(Box::new(IsPausedCommand {})),
"get_state" => Some(Box::new(GetStateCommand {})), "get_state" => Some(Box::new(GetStateCommand {})),