From d1f1481f13b629a36f5069b44bfd116ef565adea Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sun, 1 Oct 2023 19:43:19 +0200 Subject: [PATCH] Commented the functions of the API and corrected a last issue (I hope) with an integer overflow causing some sync issues. Music player should be perfect now ! --- .../app/gfx/music_player_screen.c | 9 ++- .../app/gfx/music_player_screen.h | 72 ++++++++++++++++++- 2 files changed, 76 insertions(+), 5 deletions(-) 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 165996c..1f09fd4 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 @@ -7,7 +7,7 @@ static void _set_UI_no_ble_connection(MusicPlayerScreen_t * const musicPlayerScreen, bool connected); static void _update_playing_track_visuals(MusicPlayerScreen_t * const musicPlayerScreen); static void _update_playing_track_ref_time(MusicPlayerScreen_t * const musicPlayerScreen); -static uint16_t _time_difference_in_ms(uint32_t referenceTimeMs, uint32_t currentTimeMs); +static uint32_t _time_difference_in_ms(uint32_t referenceTimeMs, uint32_t currentTimeMs); static void gesture_event_cb(lv_event_t *e) { @@ -219,6 +219,9 @@ void music_player_screen_set_music_position(MusicPlayerScreen_t * const musicPla positionInSeconds = positionInSeconds > musicPlayerScreen->currentMusicDuration ? musicPlayerScreen->currentMusicDuration : positionInSeconds; musicPlayerScreen->currentMusicPosition = positionInSeconds * 1000; + //Don't forget to reset the time reference + if(musicPlayerScreen->musicPlayerTimeRefmsCb)musicPlayerScreen->playerStartTimeRef = musicPlayerScreen->musicPlayerTimeRefmsCb(); + //Let's update the current music position visually if(music_player_screen_is_in_use(musicPlayerScreen)) { @@ -513,14 +516,14 @@ static void _update_playing_track_ref_time(MusicPlayerScreen_t * const musicPlay { //Let's compute the time that has passed and update the current song position uint32_t currentTimeMs = musicPlayerScreen->musicPlayerTimeRefmsCb ? musicPlayerScreen->musicPlayerTimeRefmsCb() : 0; - uint16_t timeDifferenceMs = _time_difference_in_ms(musicPlayerScreen->playerStartTimeRef, currentTimeMs); + uint32_t timeDifferenceMs = _time_difference_in_ms(musicPlayerScreen->playerStartTimeRef, currentTimeMs); musicPlayerScreen->playerStartTimeRef = currentTimeMs; musicPlayerScreen->currentMusicPosition = musicPlayerScreen->currentMusicPosition + timeDifferenceMs > musicPlayerScreen->currentMusicDuration * 1000 ? musicPlayerScreen->currentMusicDuration * 1000 : musicPlayerScreen->currentMusicPosition + timeDifferenceMs; } -static uint16_t _time_difference_in_ms(uint32_t referenceTimeMs, uint32_t currentTimeMs) +static uint32_t _time_difference_in_ms(uint32_t referenceTimeMs, uint32_t currentTimeMs) { return currentTimeMs - referenceTimeMs; } 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 01dae9d..050285d 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 @@ -68,33 +68,101 @@ typedef struct MusicPlayerScreen */ void music_player_screen_init(MusicPlayerScreen_t * const musicPlayerScreen); +/** + * @brief Registers a callback function which will be called every time an action (button pressed) is performed with the type of action given as the parameter. + * This callback function can be used to forward the action to an other sub system like the BLE layer for example. + * + * @param musicPlayerScreen a pointer to the music player screen's context structure. + * @param musicPlaybackCtrlCb a pointer to a function having the following signature : void(MusicPlaybackCtrlAction_e). + * The action passed to the callback function can be of value : + * - MUSIC_CONTROL_PLAY + * - MUSIC_CONTROL_PAUSE + * - MUSIC_CONTROL_PLAYPAUSE + * - MUSIC_CONTROL_NEXT + * - MUSIC_CONTROL_PREVIOUS + * - MUSIC_CONTROL_VOLUMEUP + * - MUSIC_CONTROL_VOLUMEDOWN + * - MUSIC_CONTROL_FORWARD + * - MUSIC_CONTROL_REWIND + */ void music_player_screen_register_music_playback_control_cb(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlaybackCtrlCb_t musicPlaybackCtrlCb); +/** + * @brief Registers a callback function used by the music player to keep track of the system's time. + * This time is internaly used as a reference to stay in sync with the playing track's playtime. + * The function must return the system time in millisecond. + * + * @param musicPlayerScreen a pointer to the music player screen's context structure. + * @param musicPlayerTimeRefmsCb a pointer to a function having the following signature : uint32_t(void). + */ void music_player_screen_register_music_player_time_ref_ms_cb(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlayerTimeRefmsCb_t musicPlayerTimeRefmsCb); +/** + * @brief Tells the music player whether the watch is connected to a smartphone through a BLE connection or not. + * It, for example, enables the music player to grey the music controls (buttons) out if there is no established BLE connection. + * + * @param musicPlayerScreen a pointer to the music player screen's context structure. + * @param connected true if there is an active BLE connection, false otherwise. + */ void music_player_screen_notify_BLE_connection_state(MusicPlayerScreen_t * const musicPlayerScreen, bool connected); +/** + * @brief Displays the current song's title and artist on the music player UI. + * If the information is not available, NULL can be passed as the value. + * The string is internally copied, so it can be freed after the function was called. + * + * @param musicPlayerScreen a pointer to the music player screen's context structure. + * @param title the title of the song + * @param artist the artists + */ void music_player_screen_set_playing_music_title_and_artist(MusicPlayerScreen_t * const musicPlayerScreen, const char *title, const char *artist); +/** + * @brief Sets the song's duration in seconds to be displayed on the UI. + * + * @param musicPlayerScreen a pointer to the music player screen's context structure. + * @param durationInSeconds the song's duration in seconds. + */ void music_player_screen_set_music_duration(MusicPlayerScreen_t * const musicPlayerScreen, uint16_t durationInSeconds); +/** + * @brief Sets the song's current playtime in seconds to be displayed on the UI. + * + * @param musicPlayerScreen a pointer to the music player screen's context structure. + * @param positionInSeconds the song's playtime in seconds. + */ void music_player_screen_set_music_position(MusicPlayerScreen_t * const musicPlayerScreen, uint16_t positionInSeconds); +/** + * @brief Changes the current playing state of the song. + * This function should be used to keep the music player in sync with external events (ie : paused is pressed on the smartphone). + * + * @param musicPlayerScreen a pointer to the music player screen's context structure. + * @param playingState the new playing state to apply. + * Only two music states are relevant : MUSIC_CONTROL_PAUSE and MUSIC_CONTROL_PLAY. + */ void music_player_screen_set_music_playing_state(MusicPlayerScreen_t * const musicPlayerScreen, MusicPlaybackCtrlAction_e playingState); +/** + * @brief Returns true if the music player screen is currently being displayed. + * + * @param musicPlayerScreen a pointer to the music player screen's context structure. + * @return true if the music player screen is being used + * @return false if the music player screen is not being used/currently displayed + */ bool music_player_screen_is_in_use(MusicPlayerScreen_t * const musicPlayerScreen); /** * @brief Graphically builds the music player screen. * - * @param musicPlayerScreen a pointer to the music player screen's context structure to initialize. + * @param musicPlayerScreen a pointer to the music player screen's context structure. */ void music_player_screen_create(MusicPlayerScreen_t * const musicPlayerScreen); /** * @brief Frees all resources used by the MusicPlayerScreen object. * - * @param musicPlayerScreen a pointer to the music player screen's context structure to initialize. + * @param musicPlayerScreen a pointer to the music player screen's context structure. */ void music_player_screen_destroy(MusicPlayerScreen_t * const musicPlayerScreen);