From 97356de0e8eaeac67f93f9f540a85d52c2eaa7ce Mon Sep 17 00:00:00 2001 From: Norihiro Kamae Date: Sat, 24 Jun 2023 02:30:32 +0900 Subject: [PATCH] vlc-video: Define media file array type for function parameter lists To avoid passing `struct darray *` type, which cannot hold the type information, this commit defines array types and uses that types on the function parameters. --- plugins/vlc-video/vlc-video-source.c | 61 ++++++++++++---------------- 1 file changed, 26 insertions(+), 35 deletions(-) diff --git a/plugins/vlc-video/vlc-video-source.c b/plugins/vlc-video/vlc-video-source.c index 54b32d52c..0ac51d71d 100644 --- a/plugins/vlc-video/vlc-video-source.c +++ b/plugins/vlc-video/vlc-video-source.c @@ -46,6 +46,8 @@ struct media_file_data { libvlc_media_t *media; }; +typedef DARRAY(struct media_file_data) media_file_array_t; + enum behavior { BEHAVIOR_STOP_RESTART, BEHAVIOR_PAUSE_UNPAUSE, @@ -63,7 +65,7 @@ struct vlc_source { size_t audio_capacity; pthread_mutex_t mutex; - DARRAY(struct media_file_data) files; + media_file_array_t files; enum behavior behavior; bool loop; bool shuffle; @@ -75,18 +77,15 @@ struct vlc_source { obs_hotkey_id playlist_prev_hotkey; }; -static libvlc_media_t *get_media(struct darray *array, const char *path) +static libvlc_media_t *get_media(media_file_array_t *files, const char *path) { - DARRAY(struct media_file_data) files; libvlc_media_t *media = NULL; - files.da = *array; - - for (size_t i = 0; i < files.num; i++) { - const char *cur_path = files.array[i].path; + for (size_t i = 0; i < files->num; i++) { + const char *cur_path = files->array[i].path; if (strcmp(path, cur_path) == 0) { - media = files.array[i].media; + media = files->array[i].media; libvlc_media_retain_(media); break; } @@ -102,17 +101,14 @@ static inline libvlc_media_t *create_media_from_file(const char *file) : libvlc_media_new_path_(libvlc, file); } -static void free_files(struct darray *array) +static void free_files(media_file_array_t *files) { - DARRAY(struct media_file_data) files; - files.da = *array; - - for (size_t i = 0; i < files.num; i++) { - bfree(files.array[i].path); - libvlc_media_release_(files.array[i].media); + for (size_t i = 0; i < files->num; i++) { + bfree(files->array[i].path); + libvlc_media_release_(files->array[i].media); } - da_free(files); + da_free(*files); } #define MAKEFORMAT(ch0, ch1, ch2, ch3) \ @@ -360,7 +356,7 @@ static void vlcs_destroy(void *data) bfree((void *)c->audio.data[0]); obs_source_frame_free(&c->frame); - free_files(&c->files.da); + free_files(&c->files); pthread_mutex_destroy(&c->mutex); bfree(c); } @@ -529,18 +525,15 @@ static int vlcs_audio_setup(void **p_data, char *format, unsigned *rate, return 0; } -static void add_file(struct vlc_source *c, struct darray *array, +static void add_file(struct vlc_source *c, media_file_array_t *new_files, const char *path, int network_caching, int track_index, int subtitle_index, bool subtitle_enable) { - DARRAY(struct media_file_data) new_files; struct media_file_data data; struct dstr new_path = {0}; libvlc_media_t *new_media; bool is_url = path && strstr(path, "://") != NULL; - new_files.da = *array; - dstr_copy(&new_path, path); #ifdef _WIN32 if (!is_url) @@ -548,10 +541,10 @@ static void add_file(struct vlc_source *c, struct darray *array, #endif path = new_path.array; - new_media = get_media(&c->files.da, path); + new_media = get_media(&c->files, path); if (!new_media) - new_media = get_media(&new_files.da, path); + new_media = get_media(new_files, path); if (!new_media) new_media = create_media_from_file(path); @@ -579,12 +572,10 @@ static void add_file(struct vlc_source *c, struct darray *array, data.path = new_path.array; data.media = new_media; - da_push_back(new_files, &data); + da_push_back(*new_files, &data); } else { dstr_free(&new_path); } - - *array = new_files.da; } static bool valid_extension(const char *ext) @@ -624,8 +615,8 @@ static bool valid_extension(const char *ext) static void vlcs_update(void *data, obs_data_t *settings) { - DARRAY(struct media_file_data) new_files; - DARRAY(struct media_file_data) old_files; + media_file_array_t new_files; + media_file_array_t old_files; libvlc_media_list_t *media_list; struct vlc_source *c = data; obs_data_array_t *array; @@ -694,7 +685,7 @@ static void vlcs_update(void *data, obs_data_t *settings) dstr_copy(&dir_path, path); dstr_cat_ch(&dir_path, '/'); dstr_cat(&dir_path, ent->d_name); - add_file(c, &new_files.da, dir_path.array, + add_file(c, &new_files, dir_path.array, network_caching, track_index, subtitle_index, subtitle_enable); } @@ -702,7 +693,7 @@ static void vlcs_update(void *data, obs_data_t *settings) dstr_free(&dir_path); os_closedir(dir); } else { - add_file(c, &new_files.da, path, network_caching, + add_file(c, &new_files, path, network_caching, track_index, subtitle_index, subtitle_enable); } @@ -715,8 +706,8 @@ static void vlcs_update(void *data, obs_data_t *settings) libvlc_media_list_player_stop_(c->media_list_player); pthread_mutex_lock(&c->mutex); - old_files.da = c->files.da; - c->files.da = new_files.da; + old_files = c->files; + c->files = new_files; pthread_mutex_unlock(&c->mutex); /* ------------------------------------- */ @@ -725,7 +716,7 @@ static void vlcs_update(void *data, obs_data_t *settings) c->shuffle = obs_data_get_bool(settings, S_SHUFFLE); if (c->files.num > 1 && c->shuffle) { - DARRAY(struct media_file_data) new_files; + media_file_array_t new_files; DARRAY(size_t) idxs; da_init(new_files); @@ -745,13 +736,13 @@ static void vlcs_update(void *data, obs_data_t *settings) da_free(c->files); da_free(idxs); - c->files.da = new_files.da; + c->files = new_files; } /* ------------------------------------- */ /* clean up and restart playback */ - free_files(&old_files.da); + free_files(&old_files); media_list = libvlc_media_list_new_(libvlc);