void ConnectTgStateChangedCallback(const bd_addr_t *bdAddr, profile_connect_state_t state);\r
void InitBtHeadsetEvent(void);\r
void BtAvrcpVolumeChangedSyncMedia(uint8_t a2dp_volume);\r
+void user_avrcp_ct_press_button(const bd_addr_t *bd_addr, int32_t key_operation);\r
\r
#ifdef __cplusplus\r
}\r
#include "PlayersModel.h"\r
#include "service_id_define.h"\r
#include "graphic_service.h"\r
+#include <bts_a2dp_source.h>\r
\r
using namespace OHOS;\r
\r
}\r
}\r
\r
+/* -------------------------------------------------------------------------- */\r
+void user_avrcp_ct_press_button(const bd_addr_t *bd_addr, int32_t key_operation)\r
+{\r
+ (void)avrcp_ct_press_button(bd_addr, key_operation);\r
+ uint8_t sleep_cnt = 0;\r
+ while (1) { //持续等待接收一个响应消息来确认按键按下操作已被正确处理\r
+ osal_msleep(100); /* sleep 1000 ms */\r
+ if (g_avrcp_srv_inf.avrcp_button_flag == AVRCP_SRV_PRESS_VALUE) {\r
+ (void)avrcp_ct_release_button(bd_addr, key_operation);\r
+ break;\r
+ }\r
+ sleep_cnt++;\r
+ if (sleep_cnt > 20) { /* sleep 20 times */\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP,"not receive rsp press button msg\n");\r
+ break;\r
+ }\r
+ }\r
+}\r
+/* -------------------------------------------------------------------------- */\r
+//记录按下按钮的回调事件以及按键操作值\r
static void BtAvrcpCtPressButtonRspCallback(const bd_addr_t *bd_addr, int32_t key_operation)\r
{\r
if (bd_addr == nullptr) {\r
}\r
}\r
\r
+//记录释放按钮的回调事件以及按键操作值\r
static void BtAvrcpCtReleaseButtonRspCallback(const bd_addr_t *bd_addr, int32_t key_operation)\r
{\r
UNUSED(bd_addr);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "avrcp ct release button cbk key:%d\n", key_operation);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "avrcp ct release button cbk key:%x\n", key_operation);\r
if (g_avrcp_srv_inf.avrcp_button_flag == AVRCP_SRV_PRESS_VALUE) {\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "avrcp ct released button button_flag change:%u->%u\n",\r
g_avrcp_srv_inf.avrcp_button_flag, AVRCP_SRV_RELEASED_VALUE);\r
* @Author: luozheng 1732036298@qq.com\r
* @Date: 2024-08-05 15:20:03\r
* @LastEditors: luozheng 1732036298@qq.com\r
- * @LastEditTime: 2024-08-20 17:57:54\r
+ * @LastEditTime: 2024-09-23 15:07:25\r
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/player/include/PlayersPresenter.h\r
*/\r
\r
bool OnClick(UIView& view, const ClickEvent& event) override;\r
private:\r
void PlayerButtonOnClick();\r
+ void NextButtonOnClick();\r
+ void PreButtonOnClick();\r
void SoundButtonOnClick();\r
void PlayerModelButtonOnClick();\r
void OptionsButtonOnClick();\r
* @Author: luozheng 1732036298@qq.com
* @Date: 2024-08-12 11:31:43
* @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-09-03 20:31:31
+ * @LastEditTime: 2024-09-23 15:42:03
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/player/src/MusicPlayerBTConnectFailedView.cpp
*/
#include "player/include/MusicPlayerBTConnectFailedView.h"
}
if (strcmp(view.GetViewId(), CLOSEBUTTON_VIEWID) == 0)
{
- playersView->ChangeView(PlayersView::MUSIC_BT_CONNECTFAILED_VIEW, PlayersView::MAIN_MUSICPLAYER_VIEW);
+ playersView->ChangeView(PlayersView::MUSIC_BT_CONNECTFAILED_VIEW, PlayersView::MUSIC_BLUETOOTH_DISCONN_VIEW);
}
return true;
}
* @Author: luozheng 1732036298@qq.com
* @Date: 2024-08-10 16:23:46
* @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-08-12 12:01:13
+ * @LastEditTime: 2024-09-23 15:40:20
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/player/src/MusicPlayerBluetoothDisConView.cpp
*/
#include "player/include/MusicPlayerBluetoothDisConView.h"
{
playersView->ChangeView(PlayersView::MUSIC_BLUETOOTH_DISCONN_VIEW, PlayersView::MAIN_MUSICPLAYER_VIEW);
}
+ else if(strcmp(view.GetViewId(), MUISC_PLAYER_BLUETOOTH_DISCONN_VIEW) == 0)
+ {
+ //跳转到蓝牙连接失败视图
+ playersView->ChangeView(PlayersView::MUSIC_BLUETOOTH_DISCONN_VIEW, PlayersView::MUSIC_BT_CONNECTFAILED_VIEW);
+ }
return true;
}
}
}
group->SetOnDragListener(dragListener);
+ group->SetOnClickListener(this);
/* -------------------------------------------------------------------------- */
if (scrollView == nullptr)
{
PlayersModel::GetInstance()->SetMusicSource(false);\r
UpdateBluetoothHeadSetViewIsVisible();\r
/* -------------------------------------------------------------------------- */\r
- if (a2dp)\r
- {\r
- uapi_a2dp_snk_disconnect(); // 切换通道主动断开atdp\r
- }\r
+ PlayersModel::GetInstance()->set_phone_music_play_state(AVRCP_KEY_STOP);//切换到手机音乐停止音乐\r
/* -------------------------------------------------------------------------- */\r
playersView->ChangeView(PlayersView::MUSIC_SOURCE_VIEW, PlayersView::MUISC_CONNECTING);\r
}\r
#include <service/graphic_service.h>
#include "MainViewSample.h"
#include "settings/include/SettingModel.h"
+#include "bluetooth/include/BluetoothHeadsetEvent.h"
namespace OHOS {
static constexpr int VOLUME_MAXIMUM = 100;
}
bool type = PlayersModel::GetInstance()->GetMusicSource();
if(type) {
- bool phonebluetoothcon = SettingModel::GetInstance().GetPhoneConnectStatus(); // 获取手机连接状态
- bool a2dp = uapi_a2dp_snk_get_device_connect_state(); // 获取a2dp连接状态
+ bool phoneMusicConnectStatus = uapi_a2dp_snk_get_device_connect_state(); // 获取a2dp连接状态
if(g_PlayerTimes < 3) /*3秒切换时间*/
{
- if (!phonebluetoothcon)
+ if (!phoneMusicConnectStatus)
{
playersView->ChangeView(PlayersView::MUISC_CONNECTING, PlayersView::MUSIC_BLUETOOTH_DISCONN_VIEW);
}
- else if (phonebluetoothcon && !a2dp) // 如果手机蓝牙已连接但手表与手机的a2dp未连接手表主动去连接a2dp
- {
- playersView->ChangeView(PlayersView::MUISC_CONNECTING, PlayersView::MUSIC_BT_CONNECTFAILED_VIEW);
- }
- else if (phonebluetoothcon && a2dp)
+ else if (phoneMusicConnectStatus)
{
playersView->ChangeView(PlayersView::MUISC_CONNECTING, PlayersView::MAIN_MUSICPLAYER_VIEW);
}
SetCircleProgress();
}
+ //更新音乐的声音进度条
void PlayersModel::UpdateVolumeValue(void)
{
if(PlayersView::GetInstance())
return false;
}
+ //用来控制手机音乐的播放,暂停,下一首,上一首音乐
void PlayersModel::set_phone_music_play_state(avrcp_key_operation_t notify)
{
- #if 0
- int ret;
- int playerState;
bd_addr_t bdAddr={0};
uapi_get_br_address(&bdAddr); //获取手机蓝牙地址
- int a2dp_play_stat = a2dp_src_get_playing_state(&bdAddr);
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[a2dp_play_stat]%d", a2dp_play_stat);
switch(notify)
{
case AVRCP_KEY_PLAY://播放
- if(a2dp_play_stat == A2DP_IS_PLAYING)
- return;
- ret = a2dp_src_start_playing(&bdAddr);//设置手机音乐的状态为播放
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[a2dp_src_start_playing],ret:%x", ret);
- playerState = AVRCP_PLAY_STATUS_PLAYING;
+ user_avrcp_ct_press_button(&bdAddr,AVRCP_KEY_PLAY);
break;
case AVRCP_KEY_STOP: //停止
- ret = a2dp_src_stop_playing(&bdAddr);//设置手机的状态停止
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[a2dp_src_stop_playing],ret:%x", ret);
- playerState = AVRCP_PLAY_STATUS_STOPPED;
+ user_avrcp_ct_press_button(&bdAddr,AVRCP_KEY_STOP);
break;
case AVRCP_KEY_PAUSE://暂停
- ret = a2dp_src_suspend_playing(&bdAddr);//设置手机的状态暂停
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[a2dp_src_suspend_playing],ret:%x", ret);
- playerState = AVRCP_PLAY_STATUS_PAUSED;
+ user_avrcp_ct_press_button(&bdAddr,AVRCP_KEY_PAUSE);
+ break;
+ case AVRCP_KEY_FORWARD: // 下一曲
+ user_avrcp_ct_press_button(&bdAddr,AVRCP_KEY_FORWARD);
+ break;
+ case AVRCP_KEY_BACKWARD: // 上一曲
+ user_avrcp_ct_press_button(&bdAddr,AVRCP_KEY_BACKWARD);
break;
default:
- playerState = AVRCP_PLAY_STATUS_STOPPED;
+ user_avrcp_ct_press_button(&bdAddr,AVRCP_KEY_STOP);//停止
break;
}
- avrcp_tg_notify_playback_status_changed((unsigned char)(playerState));
- #endif
}
}
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[PlayerButtonOnClick] calling phone");\r
return;\r
}\r
+ /* -------------------------- 若ct或tg端是已连接状态且当前为手机音乐 ------------------------- */\r
if(PlayersModel::GetInstance()->get_avrcp_ct_or_tg_is_connected() && PlayersModel::GetInstance()->GetMusicSource())\r
{\r
if (state == UICheckBox::UICheckBoxState::SELECTED) \r
{\r
- PlayersModel::GetInstance()->set_phone_music_play_state(AVRCP_KEY_PLAY);\r
+ PlayersModel::GetInstance()->set_phone_music_play_state(AVRCP_KEY_PLAY); //控制手机音乐播放\r
} \r
else if (state == UICheckBox::UICheckBoxState::UNSELECTED) \r
{\r
- PlayersModel::GetInstance()->set_phone_music_play_state(AVRCP_KEY_PAUSE);\r
+ PlayersModel::GetInstance()->set_phone_music_play_state(AVRCP_KEY_PAUSE);//控制手机音乐暂停\r
}\r
return;\r
}\r
+ /* -------------------------------------------------------------------------- */\r
\r
if (state == UICheckBox::UICheckBoxState::SELECTED) {\r
/* start play */\r
/* -------------------------------------------------------------------------- */\r
PlayersModel::GetInstance()->SetCurrentIndex(PlayersModel::GetInstance()->GetCurrentIndex());\r
}\r
-\r
+/*下一首按钮被点击时调用*/\r
+void ButtonOnClickListener::NextButtonOnClick()\r
+{\r
+ /* -------------------------- 若ct或tg端是已连接状态且当前为手机音乐 ------------------------- */\r
+ if(PlayersModel::GetInstance()->get_avrcp_ct_or_tg_is_connected() && PlayersModel::GetInstance()->GetMusicSource())\r
+ {\r
+ PlayersModel::GetInstance()->set_phone_music_play_state(AVRCP_KEY_FORWARD); //控制手机音乐下一首\r
+ return;\r
+ }\r
+ else\r
+ {\r
+ PlayersView *playersView = PlayersView::GetInstance();\r
+ if (playersView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::GetInstance");\r
+ return;\r
+ }\r
+ if (playersView->GetPlaybackProgress() != nullptr) {\r
+ playersView->GetPlaybackProgress()->SetValue(0); // 0:进度0%\r
+ playersView->GetPlaybackProgress()->Invalidate();\r
+ }\r
+ PlayersModel::GetInstance()->LoopingPlayout();\r
+ }\r
+}\r
+/*上一首按钮被点击时调用*/\r
+void ButtonOnClickListener::PreButtonOnClick()\r
+{\r
+ /* -------------------------- 若ct或tg端是已连接状态且当前为手机音乐 ------------------------- */\r
+ if(PlayersModel::GetInstance()->get_avrcp_ct_or_tg_is_connected() && PlayersModel::GetInstance()->GetMusicSource())\r
+ {\r
+ PlayersModel::GetInstance()->set_phone_music_play_state(AVRCP_KEY_BACKWARD); //控制手机音乐上一首\r
+ return;\r
+ }\r
+ else\r
+ {\r
+ PlayersView *playersView = PlayersView::GetInstance();\r
+ if (playersView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayersView::GetInstance");\r
+ return;\r
+ }\r
+ if (playersView->GetPlaybackProgress() != nullptr) {\r
+ playersView->GetPlaybackProgress()->SetValue(0); // 0:进度0%\r
+ playersView->GetPlaybackProgress()->Invalidate();\r
+ }\r
+ PlayersModel::GetInstance()->PreviousPlayout();\r
+ }\r
+}\r
/*当声音按钮被点击时候调用*/\r
void ButtonOnClickListener::SoundButtonOnClick()\r
{\r
PlayersListGroup::GetInstance()->SetUpListCase();\r
return;\r
}\r
+//当音乐播放模式按钮被点击时候调用\r
void ButtonOnClickListener::PlayerModelButtonOnClick()\r
{\r
+ PlayersModel::GetInstance()->SetPlayerModelAddOne();\r
+ if (PlayersModel::GetInstance()->GetPlayerModel() > RANDOM) {\r
+ PlayersModel::GetInstance()->SetPlayerModel(LOOP);\r
+ }\r
PlayersView *playersView = PlayersView::GetInstance();\r
if (playersView == nullptr) {\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerModelButtonOnClick playersView nullptr err");\r
if (&view == (UIView *)playersView->GetPlayerButton()) {\r
PlayerButtonOnClick();\r
} else if (&view == (UIView *)playersView->GetNextButton()) {\r
- if (playersView->GetPlaybackProgress() != nullptr) {\r
- playersView->GetPlaybackProgress()->SetValue(0); // 0:进度0%\r
- playersView->GetPlaybackProgress()->Invalidate();\r
- }\r
- PlayersModel::GetInstance()->LoopingPlayout();\r
+ NextButtonOnClick();\r
} else if (&view == (UIView *)playersView->GetPreButton()) {\r
- if (playersView->GetPlaybackProgress() != nullptr) {\r
- playersView->GetPlaybackProgress()->SetValue(0); // 0:进度0%\r
- playersView->GetPlaybackProgress()->Invalidate();\r
- }\r
- PlayersModel::GetInstance()->PreviousPlayout();\r
+ PreButtonOnClick();\r
} else if (&view == (UIView *)playersView->GetPlayerModelButton()) {\r
- PlayersModel::GetInstance()->SetPlayerModelAddOne();\r
- if (PlayersModel::GetInstance()->GetPlayerModel() > RANDOM) {\r
- PlayersModel::GetInstance()->SetPlayerModel(LOOP);\r
- }\r
PlayerModelButtonOnClick();\r
} else if (&view == (UIView *)playersView->GetSoundButton()) {\r
SoundButtonOnClick();\r
X_DRAG_FLAG = true;\r
}\r
}\r
-/*从蓝牙连接失败视图回到音乐主视图*/\r
+/*从蓝牙连接失败视图回到蓝牙未连接视图*/\r
void PlayerOnDragListener::OnDragChangMusicPlayerBTConnectFailedView(const DragEvent& event)\r
{\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnDragChangMusicPlayerBTConnectFailedView");\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playersView GetInstance fail");\r
return;\r
}\r
- playersView->ChangeView(PlayersView::MUSIC_BT_CONNECTFAILED_VIEW,PlayersView::MAIN_MUSICPLAYER_VIEW);\r
+ playersView->ChangeView(PlayersView::MUSIC_BT_CONNECTFAILED_VIEW,PlayersView::MUSIC_BLUETOOTH_DISCONN_VIEW);\r
X_DRAG_FLAG = true;\r
}\r
}\r
if (play_or_pause_Button && preMusicButton && nextMusicButton && soundButton && playerModelButton)\r
{\r
bool touchableState = !musicSourceType;\r
- play_or_pause_Button->SetTouchable(touchableState);\r
- preMusicButton->SetTouchable(touchableState);\r
- nextMusicButton->SetTouchable(touchableState);\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
void PlayersView::UpdatePlayerView(void)\r
{\r
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdatePlayerView");\r
- // 1.a2dp未连接,向手机发起a2dp连接\r
- bool phonebluetoothcon = SettingModel::GetInstance().GetPhoneConnectStatus(); // 获取手机连接状态\r
- bool a2dp = uapi_a2dp_snk_get_device_connect_state(); // 获取a2dp连接状态\r
-\r
- bool phoneMusicConnectStatus = phonebluetoothcon && a2dp;\r
+ bool phoneMusicConnectStatus = uapi_a2dp_snk_get_device_connect_state();// 获取a2dp连接状态\r
bool musicSourceType = PlayersModel::GetInstance()->GetMusicSource();\r
- // 2.\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "phoneMusicConnectStatus %d,musicSourceType %d",phoneMusicConnectStatus,musicSourceType);\r
ImageInfo *image;\r
if (musicSourceType)\r
{\r