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:
parent
6e8802399b
commit
5276ce1664
@ -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);
|
||||
|
@ -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);
|
||||
@ -407,6 +451,7 @@ void music_player_screen_destroy(MusicPlayerScreen_t * const musicPlayerScreen)
|
||||
return;
|
||||
}
|
||||
|
||||
lv_timer_del(musicPlayerScreen->timePositionTimer);
|
||||
memset(musicPlayerScreen, 0, offsetof(MusicPlayerScreen_t, musicPlaybackCtrlCb));
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user