From c4c497bcab81124de5e1628cf1767c42466e01ce Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 3 Jan 2025 03:12:41 -0800 Subject: [PATCH] feat: make play/pause buttons behave as-expected --- src-tauri/src/lib.rs | 8 ++++--- src-tauri/src/macos_interop/now_playing.rs | 26 ++++++++++++++-------- src-tauri/src/music/commands.rs | 14 +++++++++--- src-tauri/src/music/mod.rs | 2 +- 4 files changed, 34 insertions(+), 16 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 9a283ef..633f8ed 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -9,7 +9,7 @@ use migration::{Migrator, MigratorTrait}; use rodio::OutputStream; use sea_orm::Database; use state::AppDataNew; -use tauri::{Manager, Theme}; +use tauri::{Manager, State, Theme}; use tauri_plugin_decorum::WebviewWindowExt; use window_vibrancy::{apply_mica, apply_vibrancy, NSVisualEffectMaterial}; @@ -40,14 +40,16 @@ pub async fn run() { .plugin(tauri_plugin_opener::init()) .plugin(tauri_plugin_window_state::Builder::default().build()) .plugin(tauri_plugin_decorum::init()) - // .plugin(macos_interop::now_playing::init()) .setup(|app| { let state = state::AppData::new(AppDataNew { db, stream_handle }); app.manage(state.clone()); if cfg!(target_os = "macos") { #[cfg(target_os = "macos")] - macos_interop::now_playing::setup_handlers(state.clone()); + unsafe { + let static_state: State<'static, state::AppData> = std::mem::transmute(app.state::()); + macos_interop::now_playing::setup_handlers(&app.app_handle(), static_state); + } } let main_window = app.get_webview_window("main").unwrap(); diff --git a/src-tauri/src/macos_interop/now_playing.rs b/src-tauri/src/macos_interop/now_playing.rs index a372237..210d42e 100644 --- a/src-tauri/src/macos_interop/now_playing.rs +++ b/src-tauri/src/macos_interop/now_playing.rs @@ -12,31 +12,39 @@ use objc2_media_player::{ MPNowPlayingInfoPropertyMediaType, MPNowPlayingPlaybackState, }; +use tauri::plugin::{Builder, TauriPlugin}; +use tauri::{AppHandle, Manager, Runtime, State}; + #[cfg(target_os = "macos")] -pub fn setup_handlers(state: crate::state::AppData) { +pub fn setup_handlers(app: &AppHandle, state: State<'static, crate::state::AppData>) { unsafe { - let state_clone = state.clone(); let shared = objc2_media_player::MPRemoteCommandCenter::sharedCommandCenter(); + let state_clone = state.clone(); + let app_clone = app.clone(); let play_handler = block2::StackBlock::new( move |_: core::ptr::NonNull| { - crate::music::core::resume(&state_clone); + crate::music::commands::resume_inner(app_clone.clone(), state_clone.clone()); objc2_media_player::MPRemoteCommandHandlerStatus::Success }, ); let state_clone = state.clone(); - let pause_handler = block2::RcBlock::new( + let app_clone = app.clone(); + let pause_handler = block2::StackBlock::new( move |_: core::ptr::NonNull| { - crate::music::core::pause(&state_clone); + crate::music::commands::pause_inner(app_clone.clone(), state_clone.clone()); objc2_media_player::MPRemoteCommandHandlerStatus::Success }, ); let state_clone = state.clone(); - let toggle_play_pause_handler = block2::RcBlock::new( + let app_clone = app.clone(); + let toggle_play_pause_handler = block2::StackBlock::new( move |_: core::ptr::NonNull| { - if crate::music::core::is_playing(&state_clone) { - crate::music::core::pause(&state_clone); + let app_clone_clone = app_clone.clone(); + let state_clone_clone = state_clone.clone(); + if crate::music::core::is_playing(&state_clone_clone) { + crate::music::commands::pause(app_clone_clone, state_clone_clone); } else { - crate::music::core::resume(&state_clone); + crate::music::commands::resume(app_clone_clone, state_clone_clone); } objc2_media_player::MPRemoteCommandHandlerStatus::Success }, diff --git a/src-tauri/src/music/commands.rs b/src-tauri/src/music/commands.rs index e75c264..b3be2e0 100644 --- a/src-tauri/src/music/commands.rs +++ b/src-tauri/src/music/commands.rs @@ -71,18 +71,26 @@ pub fn seek_to( Ok(()) } -#[tauri::command] -pub fn pause(app: AppHandle, state: State<'_, AppData>) { +pub fn pause_inner(app: AppHandle, state: State<'_, AppData>) { core::pause(&state); app.emit("SERVER_SYNC_EVENT", "").unwrap(); } #[tauri::command] -pub fn resume(app: AppHandle, state: State<'_, AppData>) { +pub fn pause(app: AppHandle, state: State<'_, AppData>) { + pause_inner(app, state); +} + +pub fn resume_inner(app: AppHandle, state: State<'_, AppData>) { core::resume(&state); app.emit("SERVER_SYNC_EVENT", "").unwrap(); } +#[tauri::command] +pub fn resume(app: AppHandle, state: State<'_, AppData>) { + resume_inner(app, state); +} + #[tauri::command] pub fn get_redux_store_state(state: State<'_, AppData>) -> core::PlayerState { core::get_player_state(&state) diff --git a/src-tauri/src/music/mod.rs b/src-tauri/src/music/mod.rs index ebe7959..f2f0499 100644 --- a/src-tauri/src/music/mod.rs +++ b/src-tauri/src/music/mod.rs @@ -1,4 +1,4 @@ -mod commands; +pub(crate) mod commands; pub(crate) mod core; mod tags; pub(crate) mod types; -- 2.51.2