From 2fa304206658f0c46d16794d51002b1defa13286 Mon Sep 17 00:00:00 2001 From: daleclack Date: Sat, 14 Oct 2023 12:12:32 +0800 Subject: [PATCH] Add support for shuffle play media --- Gtk4/gtk154_mediaplayer3/src/LyricsParser.cpp | 9 +++- .../gtk154_mediaplayer3/src/MyMediaPlayer.cpp | 42 ++++++++++++++++++- Gtk4/gtk154_mediaplayer3/src/MyMediaPlayer.h | 2 + 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/Gtk4/gtk154_mediaplayer3/src/LyricsParser.cpp b/Gtk4/gtk154_mediaplayer3/src/LyricsParser.cpp index 0c4636d..28aef8c 100644 --- a/Gtk4/gtk154_mediaplayer3/src/LyricsParser.cpp +++ b/Gtk4/gtk154_mediaplayer3/src/LyricsParser.cpp @@ -420,7 +420,14 @@ static void media_play_ended_handler(MyMediaPlayer *player) break; case PlayMode::List_Shuffle: // Play music with random index - + my_media_player_load_random_audio(player); + + // Get Media stream to control + stream = gtk_video_get_media_stream(GTK_VIDEO( + my_media_player_get_video_widget(player))); + + // Play media stream associated with media file + gtk_media_stream_play(stream); break; case PlayMode::One_Repeat: diff --git a/Gtk4/gtk154_mediaplayer3/src/MyMediaPlayer.cpp b/Gtk4/gtk154_mediaplayer3/src/MyMediaPlayer.cpp index 2ebe3d5..ff11fac 100644 --- a/Gtk4/gtk154_mediaplayer3/src/MyMediaPlayer.cpp +++ b/Gtk4/gtk154_mediaplayer3/src/MyMediaPlayer.cpp @@ -57,6 +57,9 @@ void file_dialog_response(GObject *dialog, GAsyncResult *res, gpointer data) // Update items count of media files player->n_items = g_list_model_get_n_items( G_LIST_MODEL(player->music_store)); + // Update index information + player->current_audio_index = gtk_single_selection_get_selected( + player->music_selection); } } @@ -79,6 +82,12 @@ static void btnremove_clicked(GtkWidget *widget, MyMediaPlayer *player) // Remove the selected item g_list_store_remove(player->music_store, pos); + + // Update index information + player->n_items = g_list_model_get_n_items( + G_LIST_MODEL(player->music_store)); + player->current_audio_index = gtk_single_selection_get_selected( + player->music_selection); } // Load playlist @@ -121,6 +130,9 @@ static void load_playlist(std::string filename, MyMediaPlayer *player) // Update count of media files player->n_items = g_list_model_get_n_items( G_LIST_MODEL(player->music_store)); + // Update index information + player->current_audio_index = gtk_single_selection_get_selected( + player->music_selection); } } @@ -272,7 +284,7 @@ static void column_view_activated(GtkColumnView *self, gint position, MyMediaPla // Get selection and open the music file item = MY_ITEM(gtk_single_selection_get_selected_item(player->music_selection)); load_audio(item, player); - + // Update Column index player->current_audio_index = gtk_single_selection_get_selected(player->music_selection); } @@ -495,6 +507,34 @@ void btnnext_clicked(GtkButton *self, MyMediaPlayer *player) player->current_audio_index); } +// Load music with random index +void my_media_player_load_random_audio(MyMediaPlayer *player) +{ + // Get music index + player->current_audio_index = rand() % (player->n_items); + + // Clear stream for player + GtkMediaStream *stream = gtk_video_get_media_stream(GTK_VIDEO(player->video)); + if (stream != NULL) + { + gtk_media_file_clear(GTK_MEDIA_FILE(stream)); + // g_object_unref(stream); + } + + // Clear video widget + gtk_video_set_file(GTK_VIDEO(player->video), NULL); + + // Load music at index + // Get item + MyItem *item = MY_ITEM(g_list_model_get_item(G_LIST_MODEL(player->music_store), + player->current_audio_index)); + load_audio(item, player); + + // Update selected item + gtk_single_selection_set_selected(player->music_selection, + player->current_audio_index); +} + // Stop current music static void btnstop_clicked(GtkButton *self, MyMediaPlayer *player) { diff --git a/Gtk4/gtk154_mediaplayer3/src/MyMediaPlayer.h b/Gtk4/gtk154_mediaplayer3/src/MyMediaPlayer.h index c9e25db..2546729 100644 --- a/Gtk4/gtk154_mediaplayer3/src/MyMediaPlayer.h +++ b/Gtk4/gtk154_mediaplayer3/src/MyMediaPlayer.h @@ -30,4 +30,6 @@ guint my_media_player_get_n_audios(MyMediaPlayer *self); void btnnext_clicked(GtkButton *self, MyMediaPlayer *player); +void my_media_player_load_random_audio(MyMediaPlayer *player); + MyMediaPlayer *my_media_player_new(GtkApplication *app);