From a1327763ab70dbf4996e032dd227de368f78f4ad Mon Sep 17 00:00:00 2001 From: jacqueline Date: Mon, 28 Aug 2023 10:36:18 +1000 Subject: [PATCH] Support play/pause toggling --- src/audio/audio_fsm.cpp | 12 +++++++++++- src/audio/include/audio_events.hpp | 2 ++ src/audio/include/audio_fsm.hpp | 3 +++ src/ui/screen_playing.cpp | 8 ++++++++ 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/audio/audio_fsm.cpp b/src/audio/audio_fsm.cpp index cd36b398..6cca8211 100644 --- a/src/audio/audio_fsm.cpp +++ b/src/audio/audio_fsm.cpp @@ -133,6 +133,12 @@ void Standby::react(const QueueUpdate& ev) { sFileSource->SetPath(db->GetTrackPath(*current_track)); } +void Standby::react(const TogglePlayPause& ev) { + if (sCurrentTrack) { + transit(); + } +} + void Playback::entry() { ESP_LOGI(kTag, "beginning playback"); sOutput->SetInUse(true); @@ -142,7 +148,7 @@ void Playback::exit() { ESP_LOGI(kTag, "finishing playback"); // TODO(jacqueline): Second case where it's useful to wait for the i2s buffer // to drain. - vTaskDelay(pdMS_TO_TICKS(250)); + vTaskDelay(pdMS_TO_TICKS(10)); sOutput->SetInUse(false); events::System().Dispatch(PlaybackFinished{}); @@ -170,6 +176,10 @@ void Playback::react(const QueueUpdate& ev) { sFileSource->SetPath(db->GetTrackPath(*current_track)); } +void Playback::react(const TogglePlayPause& ev) { + transit(); +} + void Playback::react(const PlaybackUpdate& ev) { ESP_LOGI(kTag, "elapsed: %lu, total: %lu", ev.seconds_elapsed, ev.seconds_total); diff --git a/src/audio/include/audio_events.hpp b/src/audio/include/audio_events.hpp index 1d3690a4..8ee8b057 100644 --- a/src/audio/include/audio_events.hpp +++ b/src/audio/include/audio_events.hpp @@ -37,6 +37,8 @@ struct PlayFile : tinyfsm::Event { struct VolumeChanged : tinyfsm::Event {}; +struct TogglePlayPause : tinyfsm::Event {}; + namespace internal { struct InputFileOpened : tinyfsm::Event {}; diff --git a/src/audio/include/audio_fsm.hpp b/src/audio/include/audio_fsm.hpp index 430bc298..cfa65551 100644 --- a/src/audio/include/audio_fsm.hpp +++ b/src/audio/include/audio_fsm.hpp @@ -57,6 +57,7 @@ class AudioState : public tinyfsm::Fsm { virtual void react(const PlayFile&) {} virtual void react(const QueueUpdate&) {} virtual void react(const PlaybackUpdate&) {} + virtual void react(const TogglePlayPause&) {} virtual void react(const internal::InputFileOpened&) {} virtual void react(const internal::InputFileClosed&) {} @@ -90,6 +91,7 @@ class Standby : public AudioState { void react(const PlayFile&) override; void react(const internal::InputFileOpened&) override; void react(const QueueUpdate&) override; + void react(const TogglePlayPause&) override; using AudioState::react; }; @@ -102,6 +104,7 @@ class Playback : public AudioState { void react(const PlayFile&) override; void react(const QueueUpdate&) override; void react(const PlaybackUpdate&) override; + void react(const TogglePlayPause&) override; void react(const internal::InputFileOpened&) override; void react(const internal::InputFileClosed&) override; diff --git a/src/ui/screen_playing.cpp b/src/ui/screen_playing.cpp index ce0f71d6..7538d093 100644 --- a/src/ui/screen_playing.cpp +++ b/src/ui/screen_playing.cpp @@ -8,6 +8,7 @@ #include #include +#include "audio_events.hpp" #include "core/lv_event.h" #include "core/lv_obj.h" #include "core/lv_obj_scroll.h" @@ -63,6 +64,10 @@ static void below_fold_focus_cb(lv_event_t* ev) { instance->OnFocusBelowFold(); } +static void play_pause_cb(lv_event_t* ev) { + events::Audio().Dispatch(audio::TogglePlayPause{}); +} + static lv_style_t scrubber_style; auto info_label(lv_obj_t* parent) -> lv_obj_t* { @@ -159,7 +164,10 @@ Playing::Playing(std::weak_ptr db, audio::TrackQueue* queue) LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); play_pause_control_ = control_button(controls_container, LV_SYMBOL_PLAY); + lv_obj_add_event_cb(play_pause_control_, play_pause_cb, LV_EVENT_CLICKED, + NULL); lv_group_add_obj(group_, play_pause_control_); + lv_group_add_obj(group_, control_button(controls_container, LV_SYMBOL_PREV)); lv_group_add_obj(group_, control_button(controls_container, LV_SYMBOL_NEXT)); lv_group_add_obj(group_,