From 5276ce16648fcf38c8717372a991139719c274a0 Mon Sep 17 00:00:00 2001 From: Anatole SCHRAMM Date: Tue, 16 May 2023 13:45:41 +0200 Subject: [PATCH] Added a timer to update the playing's music current position, will have to do a minor rework for it to be flawless. --- src/W800_SDK_v1.00.10/app/gfx/gfx_task.c | 1 + .../app/gfx/music_player_screen.c | 53 +++++++++++++++++-- .../app/gfx/music_player_screen.h | 11 ++-- .../music_player_screen.c | 2 - 4 files changed, 58 insertions(+), 9 deletions(-) diff --git a/src/W800_SDK_v1.00.10/app/gfx/gfx_task.c b/src/W800_SDK_v1.00.10/app/gfx/gfx_task.c index fb43715..759287a 100644 --- a/src/W800_SDK_v1.00.10/app/gfx/gfx_task.c +++ b/src/W800_SDK_v1.00.10/app/gfx/gfx_task.c @@ -556,6 +556,7 @@ void gfx_task(void *param) music_player_screen_init(&musicPlayerScreen); music_player_screen_register_music_playback_control_cb(&musicPlayerScreen, &(sendMusicPlaybackBLECommandCb)); + music_player_screen_register_os_time_ms_ref_cb(&musicPlayerScreen, &(elapsed_ms)); settings_screen_init(&settingsScreen); settings_screen_register_API_interface(&settingsScreen, &settingsScreenAPIInterface); diff --git a/src/W800_SDK_v1.00.10/app/gfx/music_player_screen.c b/src/W800_SDK_v1.00.10/app/gfx/music_player_screen.c index 457d468..adb8a50 100644 --- a/src/W800_SDK_v1.00.10/app/gfx/music_player_screen.c +++ b/src/W800_SDK_v1.00.10/app/gfx/music_player_screen.c @@ -70,6 +70,13 @@ static void music_player_button_click_event_cb(lv_event_t *e) } } +static void track_position_update_cb(lv_timer_t *timer) +{ + MusicPlayerScreen_t *musicPlayerScreen = timer->user_data; + + music_player_screen_set_music_position(musicPlayerScreen, ++musicPlayerScreen->currentMusicPosition); +} + void music_player_screen_init(MusicPlayerScreen_t * const musicPlayerScreen) { if(!musicPlayerScreen) @@ -93,6 +100,17 @@ void music_player_screen_register_music_playback_control_cb(MusicPlayerScreen_t musicPlayerScreen->musicPlaybackCtrlCb = musicPlaybackCtrlCb; } +void music_player_screen_register_os_time_ms_ref_cb(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlayerTimeRefCb_t musicPlayerTimeRefCb) +{ + if(!musicPlayerScreen) + { + LV_LOG_ERROR("NULL pointer given !"); + return; + } + + musicPlayerScreen->musicPlayerTimeRefCb = musicPlayerTimeRefCb; +} + void music_player_screen_notify_BLE_connection_state(MusicPlayerScreen_t * const musicPlayerScreen, bool connected) { if(!musicPlayerScreen) @@ -169,9 +187,13 @@ void music_player_screen_set_music_position(MusicPlayerScreen_t * const musicPla return; } - if(positionInSeconds > musicPlayerScreen->currentMusicDuration) positionInSeconds = musicPlayerScreen->currentMusicDuration; - + positionInSeconds = positionInSeconds > musicPlayerScreen->currentMusicDuration ? musicPlayerScreen->currentMusicDuration : positionInSeconds; musicPlayerScreen->currentMusicPosition = positionInSeconds; + + //Let's update the time ref + if(musicPlayerScreen->musicPlayerTimeRefCb) + musicPlayerScreen->osTimeRef = musicPlayerScreen->musicPlayerTimeRefCb(); + //If the widget is currently displayed, we update it as well ! if(!musicPlayerScreen->playbackArc) return; @@ -196,6 +218,11 @@ void music_player_screen_set_music_playing_state(MusicPlayerScreen_t * const mus musicPlayerScreen->currentPlayState = playingState; + if(musicPlayerScreen->currentPlayState == MUSIC_CONTROL_PLAY) + lv_timer_resume(musicPlayerScreen->timePositionTimer); + else + lv_timer_pause(musicPlayerScreen->timePositionTimer); + if(!musicPlayerScreen->playPauseBtn.label) return; strcpy(musicPlayerScreen->playPauseBtn.icon, musicPlayerScreen->currentPlayState == MUSIC_CONTROL_PLAY ? LV_SYMBOL_PAUSE : LV_SYMBOL_PLAY); @@ -387,11 +414,28 @@ void music_player_screen_create(MusicPlayerScreen_t * const musicPlayerScreen) lv_obj_align(musicPlayerScreen->playbackArc, LV_ALIGN_CENTER, 0,0); lv_obj_set_size(musicPlayerScreen->playbackArc, 240, 240); lv_obj_set_style_arc_color(musicPlayerScreen->playbackArc, lv_palette_main(LV_PALETTE_LIME), LV_PART_INDICATOR); + lv_obj_set_style_arc_color(musicPlayerScreen->playbackArc, lv_color_make(100,100,100), LV_PART_MAIN); music_player_screen_set_music_duration(musicPlayerScreen, musicPlayerScreen->currentMusicDuration); - music_player_screen_set_music_position(musicPlayerScreen, musicPlayerScreen->currentMusicPosition); _set_UI_no_ble_connection(musicPlayerScreen, musicPlayerScreen->ble_connection_state); + if(musicPlayerScreen->timePositionTimer) + { + LV_LOG_ERROR("timePositionTimer should be NULL here !"); + lv_timer_del(musicPlayerScreen->timePositionTimer); + musicPlayerScreen->timePositionTimer = NULL; + } + musicPlayerScreen->timePositionTimer = lv_timer_create(&(track_position_update_cb), 1000, musicPlayerScreen); + //If the music was not currently playing, no need to start the music position update timer + if(musicPlayerScreen->currentPlayState != MUSIC_CONTROL_PLAY) + { + lv_timer_pause(musicPlayerScreen->timePositionTimer); + } + else if(musicPlayerScreen->musicPlayerTimeRefCb) //When we left the app, the music was running so we need to recompute the current position + { + musicPlayerScreen->currentMusicPosition += (musicPlayerScreen->musicPlayerTimeRefCb() - musicPlayerScreen->osTimeRef) / 1000; //We want seconds + } + music_player_screen_set_music_position(musicPlayerScreen, musicPlayerScreen->currentMusicPosition); //We register the event callback to handle gestures lv_obj_add_event_cb(musicPlayerScreen->display, &(gesture_event_cb), LV_EVENT_GESTURE, musicPlayerScreen); @@ -406,7 +450,8 @@ void music_player_screen_destroy(MusicPlayerScreen_t * const musicPlayerScreen) LV_LOG_ERROR("NULL pointer given !"); return; } - + + lv_timer_del(musicPlayerScreen->timePositionTimer); memset(musicPlayerScreen, 0, offsetof(MusicPlayerScreen_t, musicPlaybackCtrlCb)); } diff --git a/src/W800_SDK_v1.00.10/app/gfx/music_player_screen.h b/src/W800_SDK_v1.00.10/app/gfx/music_player_screen.h index 60154f2..75f1b92 100644 --- a/src/W800_SDK_v1.00.10/app/gfx/music_player_screen.h +++ b/src/W800_SDK_v1.00.10/app/gfx/music_player_screen.h @@ -17,6 +17,7 @@ typedef enum MusicPlaybackCtrlAction } MusicPlaybackCtrlAction_e; typedef void (*MusicPlaybackCtrlCb_t)(MusicPlaybackCtrlAction_e musicPlaybackCtrlAction); +typedef uint32_t (*MusicPlayerTimeRefCb_t)(void); typedef struct PlayerButton { @@ -40,18 +41,20 @@ typedef struct MusicPlayerScreen lv_obj_t *nextBtn; lv_obj_t *volumeDownBtn; lv_obj_t *volumeUpBtn; - lv_obj_t *playbackArc; lv_obj_t *titleLabel; lv_obj_t *artistLabel; TimeLabel_t positionTimeLabel, durationTimeLabel; + lv_timer_t *timePositionTimer; //Should not be erased attributes MusicPlaybackCtrlCb_t musicPlaybackCtrlCb; + MusicPlayerTimeRefCb_t musicPlayerTimeRefCb; MusicPlaybackCtrlAction_e currentPlayState; - char titleText[60]; - char artistText[30]; uint16_t currentMusicDuration; //The currently playing music's total duration in seconds. uint16_t currentMusicPosition; //The currently playing music's cursor position in seconds. + uint32_t osTimeRef; //Time reference used to compute the time elaspsed when the player is not running, but the song is playing. + char titleText[60]; + char artistText[30]; bool ble_connection_state; } MusicPlayerScreen_t; @@ -59,6 +62,8 @@ void music_player_screen_init(MusicPlayerScreen_t * const musicPlayerScreen); void music_player_screen_register_music_playback_control_cb(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlaybackCtrlCb_t musicPlaybackCtrlCb); +void music_player_screen_register_os_time_ms_ref_cb(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlayerTimeRefCb_t musicPlayerTimeRefCb); + void music_player_screen_notify_BLE_connection_state(MusicPlayerScreen_t * const musicPlayerScreen, bool connected); void music_player_screen_set_playing_music_title_and_artist(MusicPlayerScreen_t * const musicPlayerScreen, const char *title, const char *artist); diff --git a/src/lvgl_win_sim/lv_port_win_codeblocks/music_player_screen.c b/src/lvgl_win_sim/lv_port_win_codeblocks/music_player_screen.c index 396ae0f..eb91bf7 100644 --- a/src/lvgl_win_sim/lv_port_win_codeblocks/music_player_screen.c +++ b/src/lvgl_win_sim/lv_port_win_codeblocks/music_player_screen.c @@ -175,8 +175,6 @@ void music_player_screen_set_music_position(MusicPlayerScreen_t * const musicPla return; } - LV_LOG_USER("%d %d", musicPlayerScreen->currentMusicPosition , musicPlayerScreen->currentMusicDuration); - positionInSeconds = positionInSeconds > musicPlayerScreen->currentMusicDuration ? musicPlayerScreen->currentMusicDuration : positionInSeconds; musicPlayerScreen->currentMusicPosition = positionInSeconds;