option -ad n to add delay n millisec to ALAC streams (undocumented)

This commit is contained in:
F. Duncanh
2023-01-14 03:06:27 -05:00
parent c85bb84aed
commit 9d97860f13
3 changed files with 32 additions and 8 deletions

View File

@@ -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,

View File

@@ -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);
}

View File

@@ -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");
}