From fb55798a3eb73b4c00225232408b766f74533409 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 15 Jan 2010 01:25:21 +0100 Subject: pacat: allow configuration of latency in msec --- src/utils/pacat.c | 46 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) (limited to 'src/utils') diff --git a/src/utils/pacat.c b/src/utils/pacat.c index d348c16a..1036af65 100644 --- a/src/utils/pacat.c +++ b/src/utils/pacat.c @@ -45,6 +45,7 @@ #include #include #include +#include #define TIME_EVENT_USEC 50000 @@ -86,6 +87,7 @@ static sf_count_t (*writef_function)(SNDFILE *_sndfile, const void *ptr, sf_coun static pa_stream_flags_t flags = 0; static size_t latency = 0, process_time = 0; +static int32_t latency_msec = 0, process_time_msec = 0; static pa_bool_t raw = TRUE; static int file_format = -1; @@ -434,19 +436,25 @@ static void context_state_callback(pa_context *c, void *userdata) { buffer_attr.maxlength = (uint32_t) -1; buffer_attr.prebuf = (uint32_t) -1; - if (latency > 0) { + if (latency_msec > 0) { + buffer_attr.fragsize = buffer_attr.tlength = pa_usec_to_bytes(latency_msec * PA_USEC_PER_MSEC, &sample_spec); + flags |= PA_STREAM_ADJUST_LATENCY; + } else if (latency > 0) { buffer_attr.fragsize = buffer_attr.tlength = (uint32_t) latency; - buffer_attr.minreq = (uint32_t) process_time; flags |= PA_STREAM_ADJUST_LATENCY; - } else { - buffer_attr.tlength = (uint32_t) -1; + } else + buffer_attr.fragsize = buffer_attr.tlength = (uint32_t) -1; + + if (process_time_msec > 0) { + buffer_attr.minreq = pa_usec_to_bytes(process_time_msec * PA_USEC_PER_MSEC, &sample_spec); + } else if (process_time > 0) + buffer_attr.minreq = (uint32_t) process_time; + else buffer_attr.minreq = (uint32_t) -1; - buffer_attr.fragsize = (uint32_t) -1; - } if (mode == PLAYBACK) { pa_cvolume cv; - if (pa_stream_connect_playback(stream, device, latency > 0 ? &buffer_attr : NULL, flags, volume_is_set ? pa_cvolume_set(&cv, sample_spec.channels, volume) : NULL, NULL) < 0) { + if (pa_stream_connect_playback(stream, device, &buffer_attr, flags, volume_is_set ? pa_cvolume_set(&cv, sample_spec.channels, volume) : NULL, NULL) < 0) { pa_log(_("pa_stream_connect_playback() failed: %s"), pa_strerror(pa_context_errno(c))); goto fail; } @@ -634,9 +642,11 @@ static void help(const char *argv0) { " --no-remap Map channels by index instead of name.\n" " --latency=BYTES Request the specified latency in bytes.\n" " --process-time=BYTES Request the specified process time per request in bytes.\n" + " --latency-msec=MSEC Request the specified latency in msec.\n" + " --process-time-msec=MSEC Request the specified process time per request in msec.\n" " --property=PROPERTY=VALUE Set the specified property to the specified value.\n" " --raw Record/play raw PCM data.\n" - " --file-format=FFORMAT Record/play formatted PCM data.\n" + " --file-format[=FFORMAT] Record/play formatted PCM data.\n" " --list-file-formats List available file formats.\n") , argv0); } @@ -659,7 +669,9 @@ enum { ARG_RAW, ARG_PROPERTY, ARG_FILE_FORMAT, - ARG_LIST_FILE_FORMATS + ARG_LIST_FILE_FORMATS, + ARG_LATENCY_MSEC, + ARG_PROCESS_TIME_MSEC }; int main(int argc, char *argv[]) { @@ -695,6 +707,8 @@ int main(int argc, char *argv[]) { {"raw", 0, NULL, ARG_RAW}, {"file-format", 2, NULL, ARG_FILE_FORMAT}, {"list-file-formats", 0, NULL, ARG_LIST_FILE_FORMATS}, + {"latency-msec", 1, NULL, ARG_LATENCY_MSEC}, + {"process-time-msec", 1, NULL, ARG_PROCESS_TIME_MSEC}, {NULL, 0, NULL, 0} }; @@ -854,6 +868,20 @@ int main(int argc, char *argv[]) { } break; + case ARG_LATENCY_MSEC: + if (((latency_msec = (int32_t) atoi(optarg))) <= 0) { + pa_log(_("Invalid latency specification '%s'"), optarg); + goto quit; + } + break; + + case ARG_PROCESS_TIME_MSEC: + if (((process_time_msec = (int32_t) atoi(optarg))) <= 0) { + pa_log(_("Invalid process time specification '%s'"), optarg); + goto quit; + } + break; + case ARG_PROPERTY: { char *t; -- cgit