From 9d97860f13b5191fb4849b980ebde194e665ec74 Mon Sep 17 00:00:00 2001 From: "F. Duncanh" Date: Sat, 14 Jan 2023 03:06:27 -0500 Subject: [PATCH] option -ad n to add delay n millisec to ALAC streams (undocumented) --- renderers/audio_renderer.h | 2 +- renderers/audio_renderer_gstreamer.c | 19 +++++++++++++------ uxplay.cpp | 19 ++++++++++++++++++- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/renderers/audio_renderer.h b/renderers/audio_renderer.h index 71e4321..d07d68f 100644 --- a/renderers/audio_renderer.h +++ b/renderers/audio_renderer.h @@ -30,7 +30,7 @@ extern "C" { #include "../lib/raop_ntp.h" bool gstreamer_init(); -void audio_renderer_init(logger_t *logger, const char* audiosink); +void audio_renderer_init(logger_t *logger, const char* audiosink, const char* audiodelay); void audio_renderer_start(unsigned char* compression_type); void audio_renderer_stop(); void audio_renderer_render_buffer(raop_ntp_t *ntp, unsigned char* data, int data_len, diff --git a/renderers/audio_renderer_gstreamer.c b/renderers/audio_renderer_gstreamer.c index 3c1d934..7e0944b 100644 --- a/renderers/audio_renderer_gstreamer.c +++ b/renderers/audio_renderer_gstreamer.c @@ -80,7 +80,7 @@ static audio_renderer_t *renderer = NULL; static logger_t *logger = NULL; const char * format[NFORMATS]; -void audio_renderer_init(logger_t *render_logger, const char* audiosink) { +void audio_renderer_init(logger_t *render_logger, const char* audiosink, const char* audio_delay) { GError *error = NULL; GstCaps *caps = NULL; logger = render_logger; @@ -89,14 +89,19 @@ void audio_renderer_init(logger_t *render_logger, const char* audiosink) { renderer_type[i] = (audio_renderer_t *) calloc(1,sizeof(audio_renderer_t)); g_assert(renderer_type[i]); GString *launch = g_string_new("appsrc name=audio_source ! "); - g_string_append(launch, "queue ! "); + g_string_append(launch, "queue "); switch (i) { case 0: /* AAC-ELD */ case 2: /* AAC-LC */ - g_string_append(launch, "avdec_aac ! "); + g_string_append(launch, "! avdec_aac ! "); break; case 1: /* ALAC */ - g_string_append(launch, "avdec_alac ! "); + if (audio_delay[0]) { + g_string_append(launch, "min-threshold-time="); + g_string_append(launch, audio_delay); + g_string_append(launch, "000000 "); + } + g_string_append(launch, "! avdec_alac ! "); break; case 3: /*PCM*/ break; @@ -113,7 +118,7 @@ void audio_renderer_init(logger_t *render_logger, const char* audiosink) { g_error ("gst_parse_launch error (audio %d):\n %s\n", i+1, error->message); g_clear_error (&error); } - g_string_free(launch, TRUE); + g_assert (renderer_type[i]->pipeline); renderer_type[i]->appsrc = gst_bin_get_by_name (GST_BIN (renderer_type[i]->pipeline), "audio_source"); @@ -142,7 +147,9 @@ void audio_renderer_init(logger_t *render_logger, const char* audiosink) { default: break; } - logger_log(logger, LOGGER_DEBUG, "supported audio format %d: %s",i+1,format[i]); + logger_log(logger, LOGGER_DEBUG, "Audio format %d: %s",i+1,format[i]); + logger_log(logger, LOGGER_DEBUG, "GStreamer audio pipeline %d: \"%s\"", i+1, launch->str); + g_string_free(launch, TRUE); g_object_set(renderer_type[i]->appsrc, "caps", caps, "stream-type", 0, "is-live", TRUE, "format", GST_FORMAT_TIME, NULL); gst_caps_unref(caps); } diff --git a/uxplay.cpp b/uxplay.cpp index c9acc78..43b65e5 100644 --- a/uxplay.cpp +++ b/uxplay.cpp @@ -73,6 +73,7 @@ static videoflip_t videoflip[2] = { NONE , NONE }; static bool use_video = true; static unsigned char compression_type = 0; static std::string audiosink = "autoaudiosink"; +static std::string audiodelay = ""; static bool use_audio = true; static bool new_window_closing_behavior = true; static bool close_window; @@ -735,6 +736,19 @@ static void parse_arguments (int argc, char *argv[]) { bt709_fix = true; } else if (arg == "-nohold") { max_connections = 3; + } else if (arg == "-ad") { + if (i < argc - 1 && *argv[i+1] != '-') { + unsigned int n = 0; + if (get_value (argv[++i], &n)) { + audiodelay.erase(); + if (n > 0) { + audiodelay = argv[i]; + } + } + } else { + LOGE("option -ad must be followed by a positive time delay in millisecs"); + exit(1); + } } else { LOGE("unknown option %s, stopping\n",argv[i]); exit(1); @@ -1259,7 +1273,10 @@ int main (int argc, char *argv[]) { logger_set_level(render_logger, debug_log ? LOGGER_DEBUG : LOGGER_INFO); if (use_audio) { - audio_renderer_init(render_logger, audiosink.c_str()); + if (audiodelay.c_str()[0]) { + LOGI("Audio-only ALAC streams will be delayed by %s millisecs", audiodelay.c_str()); + } + audio_renderer_init(render_logger, audiosink.c_str(), audiodelay.c_str()); } else { LOGI("audio_disabled"); }