From 6ff02e7e2eb6a7dd7fe0b2b3decb73915054261a Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Mon, 3 Oct 2022 16:41:16 +0200 Subject: [PATCH] added audio_cap_jack_should_exit Added audio_cap_jack_should_exit in order to prevent freeze if waiting on semaphore but jack callbacks are not triggered (no data). --- src/audio/audio.cpp | 2 +- src/audio/audio_capture.c | 6 +++--- src/audio/audio_capture.h | 8 +++++--- src/audio/capture/alsa.c | 3 ++- src/audio/capture/coreaudio.m | 3 ++- src/audio/capture/jack.c | 11 ++++++++++- src/audio/capture/none.c | 3 ++- src/audio/capture/portaudio.c | 3 ++- src/audio/capture/sdi.cpp | 3 ++- src/audio/capture/sdl_mixer.c | 3 ++- src/audio/capture/testcard.cpp | 3 ++- src/audio/capture/wasapi.cpp | 3 ++- 12 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/audio/audio.cpp b/src/audio/audio.cpp index 60c5e19a9..7315a52a9 100644 --- a/src/audio/audio.cpp +++ b/src/audio/audio.cpp @@ -323,7 +323,7 @@ struct state_audio * audio_cfg_init(struct module *parent, cfg = delim + 1; } - int ret = audio_capture_init(device, cfg, &s->audio_capture_device); + int ret = audio_capture_init(s->audio_sender_module.get(), device, cfg, &s->audio_capture_device); free(device); if(ret != 0) { diff --git a/src/audio/audio_capture.c b/src/audio/audio_capture.c index 082820b2f..106fc574b 100644 --- a/src/audio/audio_capture.c +++ b/src/audio/audio_capture.c @@ -64,7 +64,7 @@ struct state_audio_capture { void *state; }; -int audio_capture_init(const char *driver, const char *cfg, struct state_audio_capture **state) +int audio_capture_init(struct module *parent, const char *driver, const char *cfg, struct state_audio_capture **state) { assert(cfg != NULL); struct state_audio_capture *s = calloc(1, sizeof(struct state_audio_capture)); @@ -79,7 +79,7 @@ int audio_capture_init(const char *driver, const char *cfg, struct state_audio_c strncpy(s->name, driver, sizeof s->name - 1); - s->state = s->funcs->init(cfg); + s->state = s->funcs->init(parent, cfg); if(!s->state) { log_msg(LOG_LEVEL_ERROR, "Error initializing audio capture.\n"); @@ -102,7 +102,7 @@ error: struct state_audio_capture *audio_capture_init_null_device() { struct state_audio_capture *device = NULL; - int ret = audio_capture_init("none", "", &device); + int ret = audio_capture_init(NULL, "none", "", &device); if (ret != 0) { log_msg(LOG_LEVEL_ERROR, "Unable to initialize null audio capture: %d\n", ret); } diff --git a/src/audio/audio_capture.h b/src/audio/audio_capture.h index c7e373c87..b0795d496 100644 --- a/src/audio/audio_capture.h +++ b/src/audio/audio_capture.h @@ -41,12 +41,14 @@ extern "C" { #endif -#define AUDIO_CAPTURE_ABI_VERSION 3 +struct module; + +#define AUDIO_CAPTURE_ABI_VERSION 4 struct audio_capture_info { void (*probe)(struct device_info **available_devices, int *count); void (*help)(const char *driver_name); - void *(*init)(const char *cfg); ///< @param cfg is not NULL + void *(*init)(struct module *parent, const char *cfg); ///< @param cfg is not NULL struct audio_frame *(*read)(void *state); void (*done)(void *state); }; @@ -62,7 +64,7 @@ void audio_capture_print_help(bool); /** * @see display_init */ -int audio_capture_init(const char *driver, const char *cfg, +int audio_capture_init(struct module *parent, const char *driver, const char *cfg, struct state_audio_capture **); struct state_audio_capture *audio_capture_init_null_device(void); struct audio_frame *audio_capture_read(struct state_audio_capture * state); diff --git a/src/audio/capture/alsa.c b/src/audio/capture/alsa.c index 54a0806fc..6781b6d7f 100644 --- a/src/audio/capture/alsa.c +++ b/src/audio/capture/alsa.c @@ -101,8 +101,9 @@ static const int bps_preference[] = { 2, 4, 3, 1 }; #define DEFAULT_SAMPLE_RATE 48000 -static void * audio_cap_alsa_init(const char *cfg) +static void * audio_cap_alsa_init(struct module *parent, const char *cfg) { + UNUSED(parent); if(cfg && strcmp(cfg, "help") == 0) { printf("Usage\n"); color_printf(TERM_BOLD TERM_FG_RED "\t-s alsa\n" TERM_RESET); diff --git a/src/audio/capture/coreaudio.m b/src/audio/capture/coreaudio.m index 6f5349331..3f05c9fc9 100644 --- a/src/audio/capture/coreaudio.m +++ b/src/audio/capture/coreaudio.m @@ -200,8 +200,9 @@ static void (^cb)(BOOL) = ^void(BOOL granted) { }; #endif // defined __MAC_10_14 -static void * audio_cap_ca_init(const char *cfg) +static void * audio_cap_ca_init(struct module *parent, const char *cfg) { + UNUSED(parent); if(cfg && strcmp(cfg, "help") == 0) { printf("Available Core Audio capture devices:\n"); audio_cap_ca_help(NULL); diff --git a/src/audio/capture/jack.c b/src/audio/capture/jack.c index 926c64cb8..b618b294d 100644 --- a/src/audio/capture/jack.c +++ b/src/audio/capture/jack.c @@ -73,6 +73,7 @@ struct state_jack_capture { sem_t data_sem; struct ring_buffer *data; bool can_process; + bool should_exit; long int first_channel; }; @@ -135,7 +136,14 @@ static void audio_cap_jack_help(const char *client_name) free(available_devices); } -static void * audio_cap_jack_init(const char *cfg) +static void audio_cap_jack_should_exit(void *state) +{ + struct state_jack_capture *s = state; + s->should_exit = true; + platform_sem_post(&s->data_sem); +} + +static void * audio_cap_jack_init(struct module *parent, const char *cfg) { struct state_jack_capture *s; jack_status_t status; @@ -258,6 +266,7 @@ static void * audio_cap_jack_init(const char *cfg) } free(ports); + register_should_exit_callback(parent, audio_cap_jack_should_exit, s); s->can_process = true; diff --git a/src/audio/capture/none.c b/src/audio/capture/none.c index a819105a8..dddb89082 100644 --- a/src/audio/capture/none.c +++ b/src/audio/capture/none.c @@ -76,8 +76,9 @@ static void audio_cap_none_help(const char *driver_name) UNUSED(driver_name); } -static void * audio_cap_none_init(const char *cfg) +static void * audio_cap_none_init(struct module *parent, const char *cfg) { + UNUSED(parent); struct state_audio_capture_none *s; s = (struct state_audio_capture_none *) malloc(sizeof(struct state_audio_capture_none)); diff --git a/src/audio/capture/portaudio.c b/src/audio/capture/portaudio.c index cf7c5a1a0..49b611410 100644 --- a/src/audio/capture/portaudio.c +++ b/src/audio/capture/portaudio.c @@ -132,8 +132,9 @@ static void portaudio_close(PaStream * stream) // closes and frees all audio res /* * capture funcitons */ -static void * audio_cap_portaudio_init(const char *cfg) +static void * audio_cap_portaudio_init(struct module *parent, const char *cfg) { + UNUSED(parent); portaudio_print_version(); if(cfg && strcmp(cfg, "help") == 0) { diff --git a/src/audio/capture/sdi.cpp b/src/audio/capture/sdi.cpp index 14385222b..fd7d2667a 100644 --- a/src/audio/capture/sdi.cpp +++ b/src/audio/capture/sdi.cpp @@ -110,8 +110,9 @@ static void audio_cap_sdi_probe_analog(struct device_info **available_devices, i audio_cap_sdi_probe_common(available_devices, count, "", "Analog audio through capture card"); } -static void * audio_cap_sdi_init(const char *cfg) +static void * audio_cap_sdi_init(struct module *parent, const char *cfg) { + UNUSED(parent); if(cfg && strcmp(cfg, "help") == 0) { printf("Available vidcap audio devices:\n"); audio_cap_sdi_help("embedded"); diff --git a/src/audio/capture/sdl_mixer.c b/src/audio/capture/sdl_mixer.c index 6ebc6f5ae..4599be247 100644 --- a/src/audio/capture/sdl_mixer.c +++ b/src/audio/capture/sdl_mixer.c @@ -145,8 +145,9 @@ static const char *load_song1() { return filename; } -static void * audio_cap_sdl_mixer_init(const char *cfg) +static void * audio_cap_sdl_mixer_init(struct module *parent, const char *cfg) { + UNUSED(parent); SDL_Init(SDL_INIT_AUDIO); struct state_sdl_mixer_capture *s = calloc(1, sizeof *s); diff --git a/src/audio/capture/testcard.cpp b/src/audio/capture/testcard.cpp index 55c5eff9e..2af3a80fc 100644 --- a/src/audio/capture/testcard.cpp +++ b/src/audio/capture/testcard.cpp @@ -173,8 +173,9 @@ static char *get_ebu_signal(int sample_rate, int bps, int channels, int frequenc return ret; } -static void * audio_cap_testcard_init(const char *cfg) +static void * audio_cap_testcard_init(struct module *parent, const char *cfg) { + UNUSED(parent); string wav_file; char *item, *save_ptr; diff --git a/src/audio/capture/wasapi.cpp b/src/audio/capture/wasapi.cpp index da7dacfc2..c34c848d4 100644 --- a/src/audio/capture/wasapi.cpp +++ b/src/audio/capture/wasapi.cpp @@ -220,8 +220,9 @@ static void show_help() { CoUninitialize(); } -static void * audio_cap_wasapi_init(const char *cfg) +static void * audio_cap_wasapi_init(struct module *parent, const char *cfg) { + UNUSED(parent); wchar_t deviceID[1024] = L""; WAVEFORMATEX *pwfx = NULL; int index = -1;