From f0d5d7ec09b80ee5320dd998d6bf2b3f855a52fd Mon Sep 17 00:00:00 2001 From: Pantelis Antoniou Date: Thu, 23 Jan 2020 16:34:54 +0200 Subject: [PATCH] pwcat: Add volume control option. Signed-off-by: Pantelis Antoniou --- src/tools/pwcat.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/tools/pwcat.c b/src/tools/pwcat.c index 73d2150b6..0b261198b 100644 --- a/src/tools/pwcat.c +++ b/src/tools/pwcat.c @@ -51,6 +51,7 @@ #define DEFAULT_RATE 48000 #define DEFAULT_CHANNELS 2 #define DEFAULT_FORMAT "s16" +#define DEFAULT_VOLUME 1.0 enum mode { mode_none, @@ -99,6 +100,8 @@ struct data { enum spa_audio_format spa_format; + float volume; + fill_fn fill; uint32_t target_id; @@ -435,11 +438,25 @@ on_state_changed(void *userdata, enum pw_stream_state old, enum pw_stream_state state, const char *error) { struct data *data = userdata; + int ret; if (data->verbose) printf("stream state changed %s -> %s\n", pw_stream_state_as_string(old), pw_stream_state_as_string(state)); + + if (state == PW_STREAM_STATE_STREAMING) { + if (data->verbose) + printf("stream node %"PRIu32"\n", + pw_stream_get_node_id(data->stream)); + ret = pw_stream_set_control(data->stream, + SPA_PROP_volume, 1, &data->volume, + 0); + if (data->verbose) + printf("set stream volume to %.3f - %s\n", data->volume, + ret == 0 ? "success" : "FAILED"); + + } } static void @@ -544,6 +561,7 @@ enum { OPT_RATE, OPT_CHANNELS, OPT_FORMAT, + OPT_VOLUME, }; static const struct option long_options[] = { @@ -566,6 +584,8 @@ static const struct option long_options[] = { {"channels", required_argument, NULL, OPT_CHANNELS }, {"format", required_argument, NULL, OPT_FORMAT }, + {"volume", required_argument, NULL, OPT_VOLUME }, + {NULL, 0, NULL, 0 } }; @@ -602,8 +622,9 @@ static void show_usage(const char *name, bool is_error) " --rate Sample rate (req. for rec) (default %u)\n" " --channels Number of channels (req. for rec) (default %u)\n" " --format Sample format %s (req. for rec) (default %s)\n" + " --volume Stream volume 0-1.0 (default %.3f)\n" "\n", - DEFAULT_RATE, DEFAULT_CHANNELS, STR_FMTS, DEFAULT_FORMAT); + DEFAULT_RATE, DEFAULT_CHANNELS, STR_FMTS, DEFAULT_FORMAT, DEFAULT_VOLUME); if (!strcmp(name, "pwcat")) { fprintf(fp, @@ -646,6 +667,9 @@ int main(int argc, char *argv[]) else data.mode = mode_none; + /* negative means no volume adjustment */ + data.volume = -1.0; + while ((c = getopt_long(argc, argv, "hvprR:", long_options, NULL)) != -1) { switch (c) { @@ -733,6 +757,10 @@ int main(int argc, char *argv[]) format = sf_str_to_fmt(optarg); break; + case OPT_VOLUME: + data.volume = atof(optarg); + break; + default: fprintf(stderr, "error: unknown option '%c'\n", c); goto error_usage; @@ -762,6 +790,8 @@ int main(int argc, char *argv[]) data.rate = DEFAULT_RATE; if (!data.channels) data.rate = DEFAULT_CHANNELS; + if (data.volume < 0) + data.volume = DEFAULT_VOLUME; if (data.mode == mode_record && !format) format = sf_str_to_fmt(DEFAULT_FORMAT);