实现手机音乐暂停,播放音乐,手表UI同步显示(发现UI刷新较慢,目前较好处理方法解决) 1006/2
authorluozheng <1732036298@qq.com>
Mon, 23 Sep 2024 10:36:04 +0000 (18:36 +0800)
committerluozheng <1732036298@qq.com>
Mon, 23 Sep 2024 10:36:04 +0000 (18:36 +0800)
主界面音乐进度条刷新使用音乐Model中的接口

code/sdk/application/wearable/fd230app/nativeui/bluetooth/src/BluetoothHeadsetEvent.cpp
code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp
code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersModel.h
code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersPresenter.h
code/sdk/application/wearable/fd230app/nativeui/player/src/PlayersModel.cpp
code/sdk/application/wearable/fd230app/nativeui/player/src/PlayersPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/player/src/PlayersView.cpp

index 05852ce..576f3e6 100644 (file)
@@ -426,16 +426,28 @@ static void BtAvrcpCtGetPlayStatusCallback(const bd_addr_t *bd_addr, avrcp_ct_pl
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "null pointer\n");\r
         return;\r
     }\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "test get play status songlen:%u, songpos:%u, playstatus:%u:",\r
-        status->song_length, status->song_position, status->play_status);\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[BtAvrcpCtGetPlayStatusCallback] songlen:%u, songpos:%u, playstatus:%u:",\r
+    status->song_length, status->song_position, status->play_status);\r
 }\r
 \r
 static void BtAvrcpCtHdlNotifyVolumeRspCbk(avrcp_ct_notification_value_cb_t *notification)\r
 {\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Set local volume: 0x%x\n", notification->volume); /* 注册事件后通知的音量 */\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "[BtAvrcpCtHdlNotifyVolumeRspCbk] volume: 0x%x\n", \r
+    notification->volume); /* 注册事件后通知的音量 */\r
     BtAvrcpTgNotifyVolumeChangedProc((uint8_t)notification->volume);\r
 }\r
 \r
+static void BtAvrcpCtHdlNotifyPlaybackStatusChangedRspCbk(avrcp_ct_notification_value_cb_t *notification)\r
+{\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[BtAvrcpCtHdlNotifyPlaybackStatusChangedRspCbk] playback status changed :%u\n",\r
+    notification->play_status);\r
+    if(notification->play_status == AVRCP_PLAY_STATUS_PLAYING) { //AVRCP媒体playing状态\r
+        PlayersModel::GetInstance()->set_player_state(true); //更新UI显示\r
+    } else {\r
+        PlayersModel::GetInstance()->set_player_state(false);\r
+    }\r
+    return;\r
+}\r
 //收到来自TG返回的Notification时回调函数\r
 static void BtAvrcpCtNotificationCallback(\r
     const bd_addr_t *bd_addr, avrcp_notify_event_t event_id, avrcp_ct_notification_value_cb_t *notification)\r
@@ -445,32 +457,40 @@ static void BtAvrcpCtNotificationCallback(
         return;\r
     }\r
 \r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ct notification cbk event_id:0x%x\n", event_id);\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ct notification cbk event_id:0x%x\n", event_id);\r
     bool notify_flag = true;\r
     switch (event_id) {\r
-        case AVRCP_NOTIFY_EVENT_PLAYBACK_STATUS_CHANGED:\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "tg notify ct playback status changed :%u\n",\r
-                notification->play_status);\r
+        case AVRCP_NOTIFY_EVENT_PLAYBACK_STATUS_CHANGED:                //播放状态变更事件,从播放变为暂停、停止等状态,会触发这个事件\r
+            BtAvrcpCtHdlNotifyPlaybackStatusChangedRspCbk(notification);\r
             break;\r
-        case AVRCP_NOTIFY_EVENT_VOLUME_CHANGED:\r
-            BtAvrcpCtHdlNotifyVolumeRspCbk(notification);\r
+        case AVRCP_NOTIFY_EVENT_TRACK_CHANGED:                          //track状态变更事件,切换到下一首、上一首歌曲等情况,会触发此事件\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "track changed event_id:0x%x\n", event_id);\r
             break;\r
-        case AVRCP_NOTIFY_EVENT_NOW_PLAYING_CONTENT_CHANGED:\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "play conent changed event_id:0x%x\n", event_id);\r
+        case AVRCP_NOTIFY_EVENT_TRACK_REACHED_END:                      //track结束事件,当前播放的曲目播放到末尾时,触发这个事件\r
             break;\r
-        case AVRCP_NOTIFY_EVENT_TRACK_CHANGED:\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "track changed event_id:0x%x\n", event_id);\r
+        case AVRCP_NOTIFY_EVENT_TRACK_REACHED_START:                    //track开始事件,当曲目开始播放时,触发这个事件\r
+            break;\r
+        case AVRCP_NOTIFY_EVENT_PLAYBACK_POS_CHANGED:                   //播放位置改变事件,当播放进度的位置发生变化时,比如快进、快退等操作导致播放位置改变,会触发此事件\r
+            break;\r
+        case AVRCP_NOTIFY_EVENT_BATT_STATUS_CHANGED:                    //电池状态变更事件,当蓝牙设备的电池状态发生变化时,电量降低、充电状态改变等,会触发这个事件\r
+            break;\r
+        case AVRCP_NOTIFY_EVENT_SYSTEM_STATUS_CHANGED:                 //系统状态变更事件\r
+            break;\r
+        case AVRCP_NOTIFY_EVENT_PLAYER_APPLICATION_SETTING_CHANGED:   //播放器配置变更事件,如音效设置、播放模式设置等,会触发此事件\r
+            break;\r
+        case AVRCP_NOTIFY_EVENT_NOW_PLAYING_CONTENT_CHANGED:         //播放内容变更事件,当 “正在播放” 列表中的内容发生变化时,比如添加了新的曲目、删除了曲目等情况,会触发这个事件。\r
+            break;\r
+        case AVRCP_NOTIFY_EVENT_AVAILABLE_PLAYERS_CHANGED:           //可使用的播放器变更事件,当系统中可用于播放的播放器设备发生变化时,比如新的播放器设备连接到系统或者已有播放器设备断开连接,会触发此事件\r
+            break;\r
+        case AVRCP_NOTIFY_EVENT_ADDRESSED_PLAYER_CHANGED:            //播放地址变更事件\r
+            break;\r
+        case AVRCP_NOTIFY_EVENT_UIDS_CHANGED:                         //UID 变更事件\r
+            break;\r
+        case AVRCP_NOTIFY_EVENT_VOLUME_CHANGED:                      //TG 端音量变更事件\r
+            BtAvrcpCtHdlNotifyVolumeRspCbk(notification);\r
+            break;\r
+        case AVRCP_NOTIFY_EVENT_RESERVED:                           //保留\r
             break;\r
-        case AVRCP_NOTIFY_EVENT_TRACK_REACHED_END:\r
-        case AVRCP_NOTIFY_EVENT_TRACK_REACHED_START:\r
-        case AVRCP_NOTIFY_EVENT_PLAYBACK_POS_CHANGED:\r
-        case AVRCP_NOTIFY_EVENT_BATT_STATUS_CHANGED:\r
-        case AVRCP_NOTIFY_EVENT_SYSTEM_STATUS_CHANGED:\r
-        case AVRCP_NOTIFY_EVENT_PLAYER_APPLICATION_SETTING_CHANGED:\r
-        case AVRCP_NOTIFY_EVENT_AVAILABLE_PLAYERS_CHANGED:\r
-        case AVRCP_NOTIFY_EVENT_ADDRESSED_PLAYER_CHANGED:\r
-        case AVRCP_NOTIFY_EVENT_UIDS_CHANGED:\r
-        case AVRCP_NOTIFY_EVENT_RESERVED:\r
         default:\r
             notify_flag = false;\r
             WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "invalid event id event_id:0x%x\n", event_id);\r
index 3469217..77a4239 100644 (file)
@@ -366,6 +366,7 @@ namespace OHOS
 
     void MainPresenterSample::SetCircleProgress()
     {
+        #if 0
         PlayersView *playersView = dynamic_cast<PlayersView *>(view_->GetViewById(MUSIC_PLAYER));
         if (playersView == nullptr)
         {
@@ -405,6 +406,7 @@ namespace OHOS
             PlayersModel::GetInstance()->SetCircleProgress(playerProgressValue_);
             PlayersPresenter::GetInstance()->SetPlaybackProgress(playerProgressValue_);
         }
+        #endif
     }
 
     void MainPresenterSample::SetCompassRotate()
@@ -460,7 +462,7 @@ namespace OHOS
             break;
 
         case MUSIC_PLAYER:
-            SetCircleProgress();
+            PlayersModel::GetInstance()->SetCircleProgress();
             break;
 
         case WATCH_FACE:
index 1e0da28..1e03112 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-08-05 15:20:03
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-09-21 17:01:40
+ * @LastEditTime: 2024-09-23 16:04:25
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersModel.h
  */
 
@@ -108,6 +108,7 @@ public:
     void UpdateVolumeValue(void);
     bool get_avrcp_ct_or_tg_is_connected(void);
     void set_phone_music_play_state(avrcp_key_operation_t notify);
+    void set_player_state(bool value);
 private:
     bool musicSourceFlag{false};//音乐来源标志:false:默认为手表音乐,true:手机音乐
     int64_t playerCurrentTime_{0};
index 6cb74cb..42d8c5a 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com\r
  * @Date: 2024-08-05 15:20:03\r
  * @LastEditors: luozheng 1732036298@qq.com\r
- * @LastEditTime: 2024-09-23 15:07:25\r
+ * @LastEditTime: 2024-09-23 16:17:55\r
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersPresenter.h\r
  */\r
 \r
@@ -244,6 +244,7 @@ public:
     void OnClickFailBack(void);\r
     void SetPlaybackProgress(int64_t value);\r
     void SetPlayerState(bool value);\r
+    void SetPhonePlayerState(bool value);\r
     void PlayerbackReset(void);\r
     void PlayerHeadsetReset(void);\r
 private:\r
index df1a320..c5997ec 100644 (file)
@@ -916,32 +916,41 @@ bool PlayersModel::GetCurrentMusicIsPlaying(void)
         {
             return;
         }
-        int32_t playerState;
-        PlayersModel::GetInstance()->GetPlayerCtr()->GetPlayerState(playerState);
-        UICheckBox::UICheckBoxState state_ = playersView->GetPlayerButtonState();
-        if ((playerState != PLAYER_STARTED) && (state_ == UICheckBox::UICheckBoxState::SELECTED))
+        if(PlayersModel::GetInstance()->GetMusicSource() == false) //如果当前为本地音乐
         {
-            playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
-        }
-        else if ((playerState == PLAYER_STARTED) && (state_ == UICheckBox::UICheckBoxState::UNSELECTED))
-        {
-            playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);
-        }
-        if (state_ == UICheckBox::UICheckBoxState::SELECTED)
-        {
-            PlayersModel::GetInstance()->GetPlayerCtr()->GetCurrentTime(playerCurrentTime_);
-            PlayersModel::GetInstance()->GetDuration(playerMusicDuration_);
-            if (playerMusicDuration_ != 0)
+            int32_t playerState;
+            PlayersModel::GetInstance()->GetPlayerCtr()->GetPlayerState(playerState);
+            UICheckBox::UICheckBoxState state_ = playersView->GetPlayerButtonState();
+            if ((playerState != PLAYER_STARTED) && (state_ == UICheckBox::UICheckBoxState::SELECTED))
+            {
+                playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
+            }
+            else if ((playerState == PLAYER_STARTED) && (state_ == UICheckBox::UICheckBoxState::UNSELECTED))
             {
-                playerProgressValue_ = (playerCurrentTime_ * 100) / playerMusicDuration_;
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerProgressValue_ %lld", playerProgressValue_);
+                playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);
             }
-            else
+            if (state_ == UICheckBox::UICheckBoxState::SELECTED)
             {
-                playerProgressValue_ = 0; // 100: max progress value
+                PlayersModel::GetInstance()->GetPlayerCtr()->GetCurrentTime(playerCurrentTime_);
+                PlayersModel::GetInstance()->GetDuration(playerMusicDuration_);
+                if (playerMusicDuration_ != 0)
+                {
+                    playerProgressValue_ = (playerCurrentTime_ * 100) / playerMusicDuration_;
+                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "playerProgressValue_ %lld", playerProgressValue_);
+                }
+                else
+                {
+                    playerProgressValue_ = 0; // 100: max progress value
+                }
+                PlayersModel::GetInstance()->SetCircleProgress(playerProgressValue_);
+                PlayersPresenter::GetInstance()->SetPlaybackProgress(playerProgressValue_);
             }
-            PlayersModel::GetInstance()->SetCircleProgress(playerProgressValue_);
-            PlayersPresenter::GetInstance()->SetPlaybackProgress(playerProgressValue_);
+        }
+        else //如果当前为手机音乐
+        {
+            //更新手机音乐的进度,暂时没实现
+            PlayersModel::GetInstance()->SetCircleProgress(0);
+            PlayersPresenter::GetInstance()->SetPlaybackProgress(0);
         }
     }
 
@@ -1009,6 +1018,16 @@ bool PlayersModel::GetCurrentMusicIsPlaying(void)
                 break;
         }
     }
+
+    //设置按钮播放状态
+    void PlayersModel::set_player_state(bool value)
+    {
+        PlayersPresenter *playersPresenter = PlayersPresenter::GetInstance();
+        if (playersPresenter != nullptr) 
+        {
+            playersPresenter->SetPhonePlayerState(value);
+        }
+    }
 }
 
 #ifdef __cplusplus
index 22442fd..198f934 100644 (file)
@@ -1565,6 +1565,16 @@ void PlayersPresenter::SetPlayerState(bool value)
     }\r
 }\r
 \r
+void PlayersPresenter::SetPhonePlayerState(bool value)\r
+{\r
+    PlayersView *playersView = PlayersView::GetInstance();\r
+    if (playersView != nullptr) {\r
+        PlayersModel::GetInstance()->SetPlayButtonState(value);\r
+        playersView->SetPlayerButtonState(value ? UICheckBox::UICheckBoxState::SELECTED:UICheckBox::UICheckBoxState::UNSELECTED);\r
+    }\r
+    return;\r
+}\r
+\r
 void PlayersPresenter::PlayerbackReset(void)\r
 {\r
     PlayersView *playersView = PlayersView::GetInstance();\r
index 7b611c4..21dfa9d 100644 (file)
@@ -158,12 +158,11 @@ namespace OHOS
     // 设置播放或暂停按钮的状态\r
     void PlayersView::SetPlayerButtonState(UICheckBox::UICheckBoxState state)\r
     {\r
-        if (play_or_pause_Button == nullptr)\r
+        if (play_or_pause_Button != nullptr)\r
         {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::SetPlayerButtonState play_or_pause_Button NULL");\r
-            return;\r
+            play_or_pause_Button->SetState(state);\r
+            play_or_pause_Button->Invalidate();\r
         }\r
-        return play_or_pause_Button->SetState(state);\r
     }\r
 \r
     void PlayersView::SetPlayerCtrVolume(float leftVolume, float rightVolume)\r
@@ -842,8 +841,9 @@ namespace OHOS
     // 停止当前正在播放的音乐\r
     void PlayersView::StopCurPlayingMusic()\r
     {\r
-        uint8_t state = GetPlayerButtonState();\r
-        if (state == UICheckBox::UICheckBoxState::SELECTED)\r
+        int32_t playerState;\r
+        PlayersModel::GetInstance()->GetPlayerCtr()->GetPlayerState(playerState);\r
+        if (playerState == PLAYER_STARTED || playerState == PLAYER_PAUSED) //如果当前是已经播放或播放暂停状态\r
         {\r
             PlayersModel::GetInstance()->PlayerStop();\r
             PlayersModel::GetInstance()->ClearActivateAudioInterrupt();\r
@@ -865,16 +865,9 @@ namespace OHOS
     /// @param phoneMusicConnectStatus 手机音乐连接状态\r
     void PlayersView::SetMusicPlayerButtonIsTouchable(bool musicSourceType)\r
     {\r
-        // 1.如果为手机音乐且手机音乐已连接那么上一首,下一首,播放或暂停,声音等按钮设置为可点击.\r
-        // 2.如果不为手机音乐按钮就可点击\r
-        /* -------------------------------------------------------------------------- */\r
-        if (play_or_pause_Button && preMusicButton && nextMusicButton && soundButton && playerModelButton)\r
+        if (playerModelButton)\r
         {\r
             bool touchableState = !musicSourceType;\r
-            // play_or_pause_Button->SetTouchable(touchableState);\r
-            // preMusicButton->SetTouchable(touchableState);\r
-            // nextMusicButton->SetTouchable(touchableState);\r
-            // soundButton->SetTouchable(touchableState);\r
             playerModelButton->SetTouchable(touchableState); // 如果音乐来源为手机音乐,播放顺序按钮就不可用\r
             /* -------------------------------------------------------------------------- */\r
             if (musicSourceType) // 如果切換到手机音乐,且当前在放歌,就停止音乐\r