diff --git a/test/Makefile.am b/test/Makefile.am index eb384f90f3..b896b4878f 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -95,7 +95,8 @@ EXTRA_DIST = \ samples/slaves \ $(check_SCRIPTS) -check_HEADERS = libvlc/test.h libvlc/libvlc_additions.h libvlc/media_utils.h +check_HEADERS = libvlc/test.h libvlc/libvlc_additions.h libvlc/media_utils.h \ + libvlc/media_player.h TESTS = $(check_PROGRAMS) check_POTFILES.sh diff --git a/test/libvlc/media_player.c b/test/libvlc/media_player.c index 16b86f0e21..9779010c45 100644 --- a/test/libvlc/media_player.c +++ b/test/libvlc/media_player.c @@ -21,36 +21,37 @@ **********************************************************************/ #include "test.h" +#include "media_player.h" #include static void play_and_wait(libvlc_media_player_t *mp) { libvlc_event_manager_t *em = libvlc_media_player_event_manager(mp); - struct event_ctx ctx; - event_ctx_init(&ctx); + struct mp_event_ctx ctx; + mp_event_ctx_init(&ctx); int res; - res = libvlc_event_attach(em, libvlc_MediaPlayerPlaying, event_ctx_on_event, &ctx); + res = libvlc_event_attach(em, libvlc_MediaPlayerPlaying, mp_event_ctx_on_event, &ctx); assert(!res); libvlc_media_player_play(mp); test_log("Waiting for playing\n"); - event_ctx_wait(&ctx); + mp_event_ctx_wait(&ctx); - libvlc_event_detach(em, libvlc_MediaPlayerPlaying, event_ctx_on_event, &ctx); + libvlc_event_detach(em, libvlc_MediaPlayerPlaying, mp_event_ctx_on_event, &ctx); } static void pause_and_wait(libvlc_media_player_t *mp) { libvlc_event_manager_t *em = libvlc_media_player_event_manager(mp); - struct event_ctx ctx; - event_ctx_init(&ctx); + struct mp_event_ctx ctx; + mp_event_ctx_init(&ctx); int res; - res = libvlc_event_attach(em, libvlc_MediaPlayerPaused, event_ctx_on_event, &ctx); + res = libvlc_event_attach(em, libvlc_MediaPlayerPaused, mp_event_ctx_on_event, &ctx); assert(!res); assert(libvlc_media_player_get_state(mp) == libvlc_Playing); @@ -58,11 +59,11 @@ static void pause_and_wait(libvlc_media_player_t *mp) libvlc_media_player_set_pause(mp, true); test_log("Waiting for pause\n"); - event_ctx_wait(&ctx); + mp_event_ctx_wait(&ctx); assert(libvlc_media_player_get_state(mp) == libvlc_Paused); - libvlc_event_detach(em, libvlc_MediaPlayerPaused, event_ctx_on_event, &ctx); + libvlc_event_detach(em, libvlc_MediaPlayerPaused, mp_event_ctx_on_event, &ctx); } /* Test a bunch of A/V properties. This most does nothing since the current @@ -312,15 +313,15 @@ static void test_media_player_tracks(const char** argv, int argc) libvlc_media_track_t *libtrack; libvlc_event_manager_t *em = libvlc_media_player_event_manager(mp); - struct event_ctx ctx; - event_ctx_init(&ctx); + struct mp_event_ctx ctx; + mp_event_ctx_init(&ctx); int res; - res = libvlc_event_attach(em, libvlc_MediaPlayerESAdded, event_ctx_on_event, &ctx); + res = libvlc_event_attach(em, libvlc_MediaPlayerESAdded, mp_event_ctx_on_event, &ctx); assert(!res); - res = libvlc_event_attach(em, libvlc_MediaPlayerESDeleted, event_ctx_on_event, &ctx); + res = libvlc_event_attach(em, libvlc_MediaPlayerESDeleted, mp_event_ctx_on_event, &ctx); assert(!res); - res = libvlc_event_attach(em, libvlc_MediaPlayerESSelected, event_ctx_on_event, &ctx); + res = libvlc_event_attach(em, libvlc_MediaPlayerESSelected, mp_event_ctx_on_event, &ctx); assert(!res); libvlc_media_player_play (mp); @@ -329,7 +330,7 @@ static void test_media_player_tracks(const char** argv, int argc) * libvlc_media_player_select_tracks_by_ids */ while (!tracks_check_all_events(alltracks, false)) { - const struct libvlc_event_t *ev = event_ctx_wait_event(&ctx); + const struct libvlc_event_t *ev = mp_event_ctx_wait_event(&ctx); switch (ev->type) { case libvlc_MediaPlayerESAdded: @@ -364,7 +365,7 @@ static void test_media_player_tracks(const char** argv, int argc) assert(!"Event not expected"); } - event_ctx_release(&ctx); + mp_event_ctx_release(&ctx); } /* Compare with the tracklists */ @@ -441,7 +442,7 @@ static void test_media_player_tracks(const char** argv, int argc) * changes. */ while (!tracks_check_all_events(alltracks, false)) { - const struct libvlc_event_t *ev = event_ctx_wait_event(&ctx); + const struct libvlc_event_t *ev = mp_event_ctx_wait_event(&ctx); assert(ev->type == libvlc_MediaPlayerESSelected); libvlc_track_type_t type = ev->u.media_player_es_selection_changed.i_type; @@ -468,7 +469,7 @@ static void test_media_player_tracks(const char** argv, int argc) track->selected = true; } - event_ctx_release(&ctx); + mp_event_ctx_release(&ctx); } libvlc_media_player_stop_async (mp); @@ -476,7 +477,7 @@ static void test_media_player_tracks(const char** argv, int argc) /* Check that all tracks are removed */ while (!tracks_check_all_events(alltracks, true)) { - const struct libvlc_event_t *ev = event_ctx_wait_event(&ctx); + const struct libvlc_event_t *ev = mp_event_ctx_wait_event(&ctx); if (ev->type == libvlc_MediaPlayerESDeleted) { @@ -487,12 +488,12 @@ static void test_media_player_tracks(const char** argv, int argc) assert(track); track->removed = true; } - event_ctx_release(&ctx); + mp_event_ctx_release(&ctx); } - libvlc_event_detach(em, libvlc_MediaPlayerESAdded, event_ctx_on_event, &ctx); - libvlc_event_detach(em, libvlc_MediaPlayerESDeleted, event_ctx_on_event, &ctx); - libvlc_event_detach(em, libvlc_MediaPlayerESSelected, event_ctx_on_event, &ctx); + libvlc_event_detach(em, libvlc_MediaPlayerESAdded, mp_event_ctx_on_event, &ctx); + libvlc_event_detach(em, libvlc_MediaPlayerESDeleted, mp_event_ctx_on_event, &ctx); + libvlc_event_detach(em, libvlc_MediaPlayerESSelected, mp_event_ctx_on_event, &ctx); libvlc_media_player_release (mp); libvlc_release (vlc); @@ -523,15 +524,15 @@ static void test_media_player_programs(const char** argv, int argc) libvlc_media_release (md); libvlc_event_manager_t *em = libvlc_media_player_event_manager(mp); - struct event_ctx ctx; - event_ctx_init(&ctx); + struct mp_event_ctx ctx; + mp_event_ctx_init(&ctx); int res; - res = libvlc_event_attach(em, libvlc_MediaPlayerProgramAdded, event_ctx_on_event, &ctx); + res = libvlc_event_attach(em, libvlc_MediaPlayerProgramAdded, mp_event_ctx_on_event, &ctx); assert(!res); - res = libvlc_event_attach(em, libvlc_MediaPlayerProgramDeleted, event_ctx_on_event, &ctx); + res = libvlc_event_attach(em, libvlc_MediaPlayerProgramDeleted, mp_event_ctx_on_event, &ctx); assert(!res); - res = libvlc_event_attach(em, libvlc_MediaPlayerProgramSelected, event_ctx_on_event, &ctx); + res = libvlc_event_attach(em, libvlc_MediaPlayerProgramSelected, mp_event_ctx_on_event, &ctx); assert(!res); libvlc_media_player_select_program_id(mp, 2); @@ -542,7 +543,7 @@ static void test_media_player_programs(const char** argv, int argc) for (int nb_added = 0, nb_selected = 0; nb_added != PROGRAM_COUNT || nb_selected != 1;) { - const struct libvlc_event_t *ev = event_ctx_wait_event(&ctx); + const struct libvlc_event_t *ev = mp_event_ctx_wait_event(&ctx); switch (ev->type) { case libvlc_MediaPlayerProgramAdded: @@ -558,7 +559,7 @@ static void test_media_player_programs(const char** argv, int argc) default: assert(!"Event not expected"); } - event_ctx_release(&ctx); + mp_event_ctx_release(&ctx); } libvlc_player_program_t *program; @@ -573,11 +574,11 @@ static void test_media_player_programs(const char** argv, int argc) /* Wait for the program selection event */ { - const struct libvlc_event_t *ev = event_ctx_wait_event(&ctx); + const struct libvlc_event_t *ev = mp_event_ctx_wait_event(&ctx); assert(ev->type == libvlc_MediaPlayerProgramSelected); assert(ev->u.media_player_program_selection_changed.i_unselected_id == 2); assert(ev->u.media_player_program_selection_changed.i_selected_id == 8); - event_ctx_release(&ctx); + mp_event_ctx_release(&ctx); } /* Ensure that the new program was selected */ @@ -609,7 +610,7 @@ static void test_media_player_programs(const char** argv, int argc) /* Check that all programs are removed and unselected */ for (int nb_deleted = 0; nb_deleted != PROGRAM_COUNT;) { - const struct libvlc_event_t *ev = event_ctx_wait_event(&ctx); + const struct libvlc_event_t *ev = mp_event_ctx_wait_event(&ctx); switch (ev->type) { case libvlc_MediaPlayerProgramDeleted: @@ -619,12 +620,12 @@ static void test_media_player_programs(const char** argv, int argc) default: assert(!"Event not expected"); } - event_ctx_release(&ctx); + mp_event_ctx_release(&ctx); } - libvlc_event_detach(em, libvlc_MediaPlayerProgramAdded, event_ctx_on_event, &ctx); - libvlc_event_detach(em, libvlc_MediaPlayerProgramDeleted, event_ctx_on_event, &ctx); - libvlc_event_detach(em, libvlc_MediaPlayerProgramSelected, event_ctx_on_event, &ctx); + libvlc_event_detach(em, libvlc_MediaPlayerProgramAdded, mp_event_ctx_on_event, &ctx); + libvlc_event_detach(em, libvlc_MediaPlayerProgramDeleted, mp_event_ctx_on_event, &ctx); + libvlc_event_detach(em, libvlc_MediaPlayerProgramSelected, mp_event_ctx_on_event, &ctx); libvlc_media_player_release (mp); libvlc_release (vlc); diff --git a/test/libvlc/media_player.h b/test/libvlc/media_player.h new file mode 100644 index 0000000000..1bd752f3a6 --- /dev/null +++ b/test/libvlc/media_player.h @@ -0,0 +1,73 @@ +/* + * media_player.h - media player test common definitions + * + */ + +/********************************************************************** + * Copyright (C) 2023 VideoLAN and its authors * + * * + * This program is free software; you can redistribute and/or modify * + * it under the terms of the GNU General Public License as published * + * by the Free Software Foundation; version 2 of the license, or (at * + * your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, you can get it from: * + * http://www.gnu.org/copyleft/gpl.html * + **********************************************************************/ + +#ifndef TEST_MEDIA_PLAYER_H +#define TEST_MEDIA_PLAYER_H + +struct mp_event_ctx +{ + vlc_sem_t sem_ev; + vlc_sem_t sem_done; + const struct libvlc_event_t *ev; +}; + +static inline void mp_event_ctx_init(struct mp_event_ctx *ctx) +{ + vlc_sem_init(&ctx->sem_ev, 0); + vlc_sem_init(&ctx->sem_done, 0); + ctx->ev = NULL; +} + +static inline const struct libvlc_event_t *mp_event_ctx_wait_event(struct mp_event_ctx *ctx) +{ + vlc_sem_wait(&ctx->sem_ev); + assert(ctx->ev != NULL); + return ctx->ev; +} + +static inline void mp_event_ctx_release(struct mp_event_ctx *ctx) +{ + assert(ctx->ev != NULL); + ctx->ev = NULL; + vlc_sem_post(&ctx->sem_done); +} + +static inline void mp_event_ctx_wait(struct mp_event_ctx *ctx) +{ + mp_event_ctx_wait_event(ctx); + mp_event_ctx_release(ctx); +} + +static inline void mp_event_ctx_on_event(const struct libvlc_event_t *event, void *data) +{ + struct mp_event_ctx *ctx = data; + + assert(ctx->ev == NULL); + ctx->ev = event; + + vlc_sem_post(&ctx->sem_ev); + vlc_sem_wait(&ctx->sem_done); + assert(ctx->ev == NULL); +} + +#endif /* TEST_MEDIA_PLAYER_H */ diff --git a/test/libvlc/media_player_record.c b/test/libvlc/media_player_record.c index 5b854e0f64..27b4c955fc 100644 --- a/test/libvlc/media_player_record.c +++ b/test/libvlc/media_player_record.c @@ -21,6 +21,7 @@ *****************************************************************************/ #include "test.h" +#include "media_player.h" #include static void test_media_player_record(const char** argv, int argc) @@ -46,11 +47,11 @@ static void test_media_player_record(const char** argv, int argc) libvlc_media_release (md); libvlc_event_manager_t *em = libvlc_media_player_event_manager(mp); - struct event_ctx ctx; - event_ctx_init(&ctx); + struct mp_event_ctx ctx; + mp_event_ctx_init(&ctx); int res; - res = libvlc_event_attach(em, libvlc_MediaPlayerRecordChanged, event_ctx_on_event, &ctx); + res = libvlc_event_attach(em, libvlc_MediaPlayerRecordChanged, mp_event_ctx_on_event, &ctx); assert(!res); libvlc_media_player_play (mp); @@ -62,20 +63,20 @@ static void test_media_player_record(const char** argv, int argc) /* Enabling */ { - const struct libvlc_event_t *ev = event_ctx_wait_event(&ctx); + const struct libvlc_event_t *ev = mp_event_ctx_wait_event(&ctx); assert(ev->u.media_player_record_changed.recording); - event_ctx_release(&ctx); + mp_event_ctx_release(&ctx); } /* Disabling */ { libvlc_media_player_record(mp, false, path); - const struct libvlc_event_t *ev = event_ctx_wait_event(&ctx); + const struct libvlc_event_t *ev = mp_event_ctx_wait_event(&ctx); assert(!ev->u.media_player_record_changed.recording); assert(ev->u.media_player_record_changed.recorded_file_path != NULL); filepath = strdup(ev->u.media_player_record_changed.recorded_file_path); assert(filepath != NULL); - event_ctx_release(&ctx); + mp_event_ctx_release(&ctx); } libvlc_media_player_stop_async (mp); diff --git a/test/libvlc/test.h b/test/libvlc/test.h index a3daecaff2..fd5ce5a3b1 100644 --- a/test/libvlc/test.h +++ b/test/libvlc/test.h @@ -99,50 +99,4 @@ static inline void test_init (void) setenv( "VLC_PLUGIN_PATH", "../modules", 1 ); } -struct event_ctx -{ - vlc_sem_t sem_ev; - vlc_sem_t sem_done; - const struct libvlc_event_t *ev; -}; - -static inline void event_ctx_init(struct event_ctx *ctx) -{ - vlc_sem_init(&ctx->sem_ev, 0); - vlc_sem_init(&ctx->sem_done, 0); - ctx->ev = NULL; -} - -static inline const struct libvlc_event_t *event_ctx_wait_event(struct event_ctx *ctx) -{ - vlc_sem_wait(&ctx->sem_ev); - assert(ctx->ev != NULL); - return ctx->ev; -} - -static inline void event_ctx_release(struct event_ctx *ctx) -{ - assert(ctx->ev != NULL); - ctx->ev = NULL; - vlc_sem_post(&ctx->sem_done); -} - -static inline void event_ctx_wait(struct event_ctx *ctx) -{ - event_ctx_wait_event(ctx); - event_ctx_release(ctx); -} - -static inline void event_ctx_on_event(const struct libvlc_event_t *event, void *data) -{ - struct event_ctx *ctx = data; - - assert(ctx->ev == NULL); - ctx->ev = event; - - vlc_sem_post(&ctx->sem_ev); - vlc_sem_wait(&ctx->sem_done); - assert(ctx->ev == NULL); -} - #endif /* TEST_H */