Added a timer to update the playing's music current position, will have to do a minor rework for it to be flawless.

This commit is contained in:
Anatole SCHRAMM 2023-05-16 13:45:41 +02:00
parent 6e8802399b
commit 5276ce1664
4 changed files with 58 additions and 9 deletions

View File

@ -556,6 +556,7 @@ void gfx_task(void *param)
music_player_screen_init(&musicPlayerScreen); music_player_screen_init(&musicPlayerScreen);
music_player_screen_register_music_playback_control_cb(&musicPlayerScreen, &(sendMusicPlaybackBLECommandCb)); 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_init(&settingsScreen);
settings_screen_register_API_interface(&settingsScreen, &settingsScreenAPIInterface); settings_screen_register_API_interface(&settingsScreen, &settingsScreenAPIInterface);

View File

@ -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) void music_player_screen_init(MusicPlayerScreen_t * const musicPlayerScreen)
{ {
if(!musicPlayerScreen) if(!musicPlayerScreen)
@ -93,6 +100,17 @@ void music_player_screen_register_music_playback_control_cb(MusicPlayerScreen_t
musicPlayerScreen->musicPlaybackCtrlCb = musicPlaybackCtrlCb; 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) void music_player_screen_notify_BLE_connection_state(MusicPlayerScreen_t * const musicPlayerScreen, bool connected)
{ {
if(!musicPlayerScreen) if(!musicPlayerScreen)
@ -169,9 +187,13 @@ void music_player_screen_set_music_position(MusicPlayerScreen_t * const musicPla
return; return;
} }
if(positionInSeconds > musicPlayerScreen->currentMusicDuration) positionInSeconds = musicPlayerScreen->currentMusicDuration; positionInSeconds = positionInSeconds > musicPlayerScreen->currentMusicDuration ? musicPlayerScreen->currentMusicDuration : positionInSeconds;
musicPlayerScreen->currentMusicPosition = 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 the widget is currently displayed, we update it as well !
if(!musicPlayerScreen->playbackArc) return; if(!musicPlayerScreen->playbackArc) return;
@ -196,6 +218,11 @@ void music_player_screen_set_music_playing_state(MusicPlayerScreen_t * const mus
musicPlayerScreen->currentPlayState = playingState; 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; if(!musicPlayerScreen->playPauseBtn.label) return;
strcpy(musicPlayerScreen->playPauseBtn.icon, musicPlayerScreen->currentPlayState == MUSIC_CONTROL_PLAY ? LV_SYMBOL_PAUSE : LV_SYMBOL_PLAY); 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_align(musicPlayerScreen->playbackArc, LV_ALIGN_CENTER, 0,0);
lv_obj_set_size(musicPlayerScreen->playbackArc, 240, 240); 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_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_duration(musicPlayerScreen, musicPlayerScreen->currentMusicDuration);
music_player_screen_set_music_position(musicPlayerScreen, musicPlayerScreen->currentMusicPosition);
_set_UI_no_ble_connection(musicPlayerScreen, musicPlayerScreen->ble_connection_state); _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 //We register the event callback to handle gestures
lv_obj_add_event_cb(musicPlayerScreen->display, &(gesture_event_cb), LV_EVENT_GESTURE, musicPlayerScreen); 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 !"); LV_LOG_ERROR("NULL pointer given !");
return; return;
} }
lv_timer_del(musicPlayerScreen->timePositionTimer);
memset(musicPlayerScreen, 0, offsetof(MusicPlayerScreen_t, musicPlaybackCtrlCb)); memset(musicPlayerScreen, 0, offsetof(MusicPlayerScreen_t, musicPlaybackCtrlCb));
} }

View File

@ -17,6 +17,7 @@ typedef enum MusicPlaybackCtrlAction
} MusicPlaybackCtrlAction_e; } MusicPlaybackCtrlAction_e;
typedef void (*MusicPlaybackCtrlCb_t)(MusicPlaybackCtrlAction_e musicPlaybackCtrlAction); typedef void (*MusicPlaybackCtrlCb_t)(MusicPlaybackCtrlAction_e musicPlaybackCtrlAction);
typedef uint32_t (*MusicPlayerTimeRefCb_t)(void);
typedef struct PlayerButton typedef struct PlayerButton
{ {
@ -40,18 +41,20 @@ typedef struct MusicPlayerScreen
lv_obj_t *nextBtn; lv_obj_t *nextBtn;
lv_obj_t *volumeDownBtn; lv_obj_t *volumeDownBtn;
lv_obj_t *volumeUpBtn; lv_obj_t *volumeUpBtn;
lv_obj_t *playbackArc; lv_obj_t *playbackArc;
lv_obj_t *titleLabel; lv_obj_t *titleLabel;
lv_obj_t *artistLabel; lv_obj_t *artistLabel;
TimeLabel_t positionTimeLabel, durationTimeLabel; TimeLabel_t positionTimeLabel, durationTimeLabel;
lv_timer_t *timePositionTimer;
//Should not be erased attributes //Should not be erased attributes
MusicPlaybackCtrlCb_t musicPlaybackCtrlCb; MusicPlaybackCtrlCb_t musicPlaybackCtrlCb;
MusicPlayerTimeRefCb_t musicPlayerTimeRefCb;
MusicPlaybackCtrlAction_e currentPlayState; MusicPlaybackCtrlAction_e currentPlayState;
char titleText[60];
char artistText[30];
uint16_t currentMusicDuration; //The currently playing music's total duration in seconds. uint16_t currentMusicDuration; //The currently playing music's total duration in seconds.
uint16_t currentMusicPosition; //The currently playing music's cursor position 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; bool ble_connection_state;
} MusicPlayerScreen_t; } 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_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_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); void music_player_screen_set_playing_music_title_and_artist(MusicPlayerScreen_t * const musicPlayerScreen, const char *title, const char *artist);

View File

@ -175,8 +175,6 @@ void music_player_screen_set_music_position(MusicPlayerScreen_t * const musicPla
return; return;
} }
LV_LOG_USER("%d %d", musicPlayerScreen->currentMusicPosition , musicPlayerScreen->currentMusicDuration);
positionInSeconds = positionInSeconds > musicPlayerScreen->currentMusicDuration ? musicPlayerScreen->currentMusicDuration : positionInSeconds; positionInSeconds = positionInSeconds > musicPlayerScreen->currentMusicDuration ? musicPlayerScreen->currentMusicDuration : positionInSeconds;
musicPlayerScreen->currentMusicPosition = positionInSeconds; musicPlayerScreen->currentMusicPosition = positionInSeconds;