/*---------------------------------------------------------------------------- * Copyright (c) TJD Technologies Co., Ltd. 2025. All rights reserved. * * Description: TjdUiAppPlayerPresenter.h * * Author: luziquan@ss-tjd.com * * Create: 2024-06-07 *--------------------------------------------------------------------------*/ #ifndef TJD_UI_APP_PLAYER_PRESENTER_H #define TJD_UI_APP_PLAYER_PRESENTER_H #include "LyricParser.h" #include "Presenter.h" #include "TjdUiAppPlayerBTImpl.h" #include "TjdUiScreenDrag.h" #include "TjdUiTaskListener.h" #include "audio_manager.h" #include "cmsis_os2.h" #include "components/root_view.h" #include "components/ui_slider.h" #include "player.h" #include #include #include #include #include #include namespace TJD { #define BTN_MUSIC_LIST_VIEW_ID "btnMusicList" #define BTN_LEFT_VIEW_ID "btnLeft" #define BTN_RIGHT_VIEW_ID "btnRight" #define BTN_START_VIEW_ID "btnStart" #define BTN_CONNECT_VIEW_ID "btnConnect" #define BTN_LOOP_VIEW_ID "btnLoop" #define BTN_VOLUME_VIEW_ID "btnVolume" #define BTN_SEARCH_VIEW_ID "btnSearch" #define BTN_TARGET_HEADSET_VIEW_ID "btnTargetHeadset" #define BTN_CONNECT_ENTER_VIEW_ID "btnConnectEnter" #define BTN_CONNECT_CANCEL_VIEW_ID "btnConnectCancel" #define BTN_DEVICE_UNPAIR_VIEW_ID "btnDeviceUnpair" #define BTN_DELETE_ENTRY_MUSIC_VIEW_ID "btnDeleteEntryMusic" #define BTN_DELETE_CANCEL_MUSIC_VIEW_ID "btnDeleteCancelMusic" enum PlayerViewIndex { PLAYER_VIEW = 0, MUSIC_LIST_VIEW, VOLUME_VIEW, DEVICE_VIEW, CONNECT_LIST_VIEW, CONNECT_STATUS_VIEW, LOW_POWER_VIEW, SEARCH_LIST_VIEW, SEARCHING_VIEW, DEVICE_CONNECT_VIEW, CONNECT_SUCCESS_VIEW, CONNECT_FAIL_VIEW, CONNECT_APP_FAIL_VIEW, DELETE_MUSIC_VIEW, PLAYER_UNKNOWN }; enum PlayerDeviceState { PLAYER_PHONE = 0, // 手机音乐 PLAYER_WATCH, // 手表音乐 PLAYER_WATCH_BT, // 蓝牙耳机音乐 }; #define VOLUME_MIN 0 #define VOLUME_MAX 100 enum PlayMode : uint8_t { SEQUENCE, // 顺序 REPEATS, // 单曲 RANDOM // 随机 }; struct PlayerCaseInfo { char sliceId[256]; int16_t index; }; class PlayerListOnClickListener : public OHOS::UIView::OnClickListener { public: bool OnClick(OHOS::UIView &view, const OHOS::ClickEvent &event) override; }; class PlayerInterruptListener : public Audio::InterruptListener { public: void SetOwner(std::shared_ptr player) { player_ = player; } void SetPaused(bool value) { isPaused_ = value; } void SetResumed(bool value) { isResumed_ = value; } void ResetFlag() { isPaused_ = false; isDelayed_ = false; isResumed_ = false; isBeginStopped_ = false; isEndStopped_ = false; }; bool IsPaused() { return isPaused_; } bool IsDelayed() { return isDelayed_; } bool IsResumed() { return isResumed_; } bool IsBeginStopped() { return isBeginStopped_; } bool IsEndStopped() { return isEndStopped_; } void OnInterrupt(int32_t type, int32_t hint) override; static void PausePlayer(void); static void ResumePlayer(void); static void StopPlayer(void); std::shared_ptr GetPlayer() { return player_; }; private: std::shared_ptr player_{nullptr}; bool isPaused_{false}; bool isDelayed_{false}; bool isResumed_{false}; bool isBeginStopped_{false}; bool isEndStopped_{false}; }; class PlayerCallbackImpl : public OHOS::Media::PlayerCallback { public: void OnPlaybackComplete(); void OnError(int32_t errorType, int32_t errorCode); void OnInfo(int type, int extra); void OnRewindToComplete(); private: }; class VolumeChangeListener : public OHOS::UISlider::UISliderEventListener { public: VolumeChangeListener(); ~VolumeChangeListener(); void DebouncedSetVolume(); virtual void OnChange(int32_t value) override; virtual void OnRelease(int32_t sounding) override; private: std::atomic lastVolume_{-1}; std::atomic debounceActive_{false}; std::mutex mtx_; std::condition_variable cv_; bool stopThread_{false}; std::thread debounceThread_; uint32_t debounceInterval_{150}; // 防抖间隔时间,单位为毫秒 }; class TjdUiAppPlayerView; class TjdUiAppPlayerPresenter : public OHOS::Presenter, public TjdUiTaskListener, public OHOS::UIView::OnClickListener, public TjdUiScreenDragListener, public OHOS::RootView::OnKeyActListener, public OHOS::UISlider::UISliderEventListener { public: TjdUiAppPlayerPresenter(); virtual ~TjdUiAppPlayerPresenter(); static TjdUiAppPlayerPresenter *GetInstance(void); void Notify() override; void OnStart() override; void OnStop() override; void ScreenDragEventCallback(OHOS::UIView &view, const OHOS::DragEvent &event) override { ViewExitProcess(true); } void PhonePlayerStatusChange(int state); void UpdateLrcData(void); void LrcSyncCallback(const char *lrc, bool isFirst); virtual bool OnKeyAct(OHOS::UIView &view, const OHOS::KeyEvent &event) override; virtual bool OnClick(OHOS::UIView &view, const OHOS::ClickEvent &event) override; virtual void OnChange(int32_t value) override; virtual void OnRelease(int32_t value) override; void MusicListOnClick(); void LeftOnClick(); void RightOnClick(); void StartOnClick(); void ConnectOnClick(); void LoopOnClick(); void VolumeOnClick(); void ScanHeadsetOnClick(); void SelectPhoneDeviceOnClick(void); void SelectWatchDeviceOnClick(void); void HeadsetConnectOnClick(void); void HeadsetConnectDeviceOnClick(void); void HeadsetConnectCancelOnClick(void); void ClickDeleteCancelEvent(void); void ClickDeleteEntryEvent(void); void PlayerButtonReset(void); void PlayerBackReset(void); void SetMusicName(const char *musicName); int16_t GetCurMusicIndex(void); bool IsPlaying(); void SetConnectDeviceAddr(bd_addr_t addr); void HeadsetUnpairDeviceOnClick(void); void HeadsetEnableOnClick(void); void HeadsetDisableOnClick(void); void StartJumpTimer(PlayerViewIndex jumpView, uint32_t ticks = 2000); void DeleteJumpTimer(void); void SetSelectView(OHOS::UIView *view) { if (view == nullptr) { selectView_ = nullptr; return; } selectView_ = view; } OHOS::UIView *GetSelectView() { return selectView_; } bool ClickListMusic(OHOS::UIView *view, bool isDelete); std::unique_ptr &GetVolumeListener() { return volumeListener_; } std::list &GetHeadsetList() { return btImpl_->GetHeadsetList(); } bool IsNeedUpdateHeadsetList{false}; bool IsDragSlider{false}; private: std::unique_ptr volumeListener_; std::unique_ptr btImpl_; std::unique_ptr lrcParser_; void ExitPlayerView(void); void ViewExitProcess(bool isSwipe); std::string *GetLrcPath(); osTimerId_t jumpTimerId_{nullptr}; std::string lrcPath_; std::string lrc_{""}; OHOS::UIView *selectView_{nullptr}; int selectIndex_; bool seekFlag_{false}; int64_t seekTime_{0}; std::atomic lrcRunning_{false}; std::unordered_map playModeResMap; }; } // namespace TJD #endif