From: mike Date: Sun, 24 Apr 2016 20:25:24 +0000 (+0100) Subject: Added option for mono output X-Git-Tag: 2.8.3.2~15^2 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F277%2Fhead;p=thirdparty%2Fshairport-sync.git Added option for mono output --- diff --git a/common.h b/common.h index 7520b0c0..25e24bbd 100644 --- a/common.h +++ b/common.h @@ -77,6 +77,7 @@ typedef struct { int32_t ForkedDaapdLatency; // supplied with --ForkedDaapdLatency option int daemonise; int statistics_requested,use_negotiated_latencies; + int mono; char *cmd_start, *cmd_stop; int cmd_blocking; int tolerance; // allow this much drift before attempting to correct it diff --git a/player.c b/player.c index a0903025..041b02d6 100644 --- a/player.c +++ b/player.c @@ -378,6 +378,24 @@ void player_put_packet(seq_t seqno, uint32_t timestamp, uint8_t *data, int len) abuf->ready = 1; abuf->timestamp = timestamp; abuf->sequence_number = seqno; + + if (config.mono) { + signed short *v = abuf->data; + int i; + int both; + for (i=frame_size;i;i--) { + int both = *v + *(v+1); + if (both > INT16_MAX) { + both = INT16_MAX; + } else if (both < INT16_MIN) { + both = INT16_MIN; + } + short sboth = (short)both; + *v++ = sboth; + *v++ = sboth; + } + } + } else { debug(1,"Bad audio packet detected and discarded."); abuf->ready = 0; diff --git a/shairport.c b/shairport.c index 931c270b..2bf7649d 100644 --- a/shairport.c +++ b/shairport.c @@ -207,6 +207,7 @@ void usage(char *progname) { printf(" Executable scripts work, but must have #!/bin/sh (or " "whatever) in the headline.\n"); printf(" -w, --wait-cmd wait until the -B or -E programs finish before continuing.\n"); + printf(" --mono convert all outgoing audio to mono.\n"); printf(" -o, --output=BACKEND select audio output method.\n"); printf(" -m, --mdns=BACKEND force the use of BACKEND to advertize the service.\n"); printf(" if no mdns provider is specified,\n"); @@ -253,6 +254,7 @@ int parse_options(int argc, char **argv) { {"on-start", 'B', POPT_ARG_STRING, &config.cmd_start, 0, NULL}, {"on-stop", 'E', POPT_ARG_STRING, &config.cmd_stop, 0, NULL}, {"wait-cmd", 'w', POPT_ARG_NONE, &config.cmd_blocking, 0, NULL}, + {"mono", 0, POPT_ARG_NONE, &config.mono, 0, NULL}, {"mdns", 'm', POPT_ARG_STRING, &config.mdns_name, 0, NULL}, {"latency", 'L', POPT_ARG_INT, &config.userSuppliedLatency, 0, NULL}, {"AirPlayLatency", 'A', POPT_ARG_INT, &config.AirPlayLatency, 0, NULL}, @@ -411,6 +413,16 @@ int parse_options(int argc, char **argv) { die("Invalid ignore_volume_control option choice \"%s\". It should be \"yes\" or \"no\""); } + /* Get the mono setting */ + if (config_lookup_string(config.cfg, "general.mono", &str)) { + if (strcasecmp(str, "no") == 0) + config.mono = 0; + else if (strcasecmp(str, "yes") == 0) + config.mono = 1; + else + die("Invalid mono option choice \"%s\". It should be \"yes\" or \"no\""); + } + /* Get the regtype -- the service type and protocol, separated by a dot. Default is "_raop._tcp" */ if (config_lookup_string(config.cfg, "general.regtype", &str)) config.regtype = strdup(str); @@ -960,6 +972,7 @@ int main(int argc, char **argv) { debug(1, "drift tolerance is %d frames.", config.tolerance); debug(1, "password is \"%s\".", config.password); debug(1, "ignore_volume_control is %d.", config.ignore_volume_control); + debug(1, "mono is %d.", config.mono); debug(1, "disable_synchronization is %d.", config.no_sync); debug(1, "audio backend desired buffer length is %d.", config.audio_backend_buffer_desired_length);