pwcat: Add volume control option.

Signed-off-by: Pantelis Antoniou <pantelis.antoniou@konsulko.com>
This commit is contained in:
Pantelis Antoniou 2020-01-23 16:34:54 +02:00 committed by Wim Taymans
parent 588e9562f9
commit f0d5d7ec09

View file

@ -51,6 +51,7 @@
#define DEFAULT_RATE 48000 #define DEFAULT_RATE 48000
#define DEFAULT_CHANNELS 2 #define DEFAULT_CHANNELS 2
#define DEFAULT_FORMAT "s16" #define DEFAULT_FORMAT "s16"
#define DEFAULT_VOLUME 1.0
enum mode { enum mode {
mode_none, mode_none,
@ -99,6 +100,8 @@ struct data {
enum spa_audio_format spa_format; enum spa_audio_format spa_format;
float volume;
fill_fn fill; fill_fn fill;
uint32_t target_id; 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) enum pw_stream_state state, const char *error)
{ {
struct data *data = userdata; struct data *data = userdata;
int ret;
if (data->verbose) if (data->verbose)
printf("stream state changed %s -> %s\n", printf("stream state changed %s -> %s\n",
pw_stream_state_as_string(old), pw_stream_state_as_string(old),
pw_stream_state_as_string(state)); 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 static void
@ -544,6 +561,7 @@ enum {
OPT_RATE, OPT_RATE,
OPT_CHANNELS, OPT_CHANNELS,
OPT_FORMAT, OPT_FORMAT,
OPT_VOLUME,
}; };
static const struct option long_options[] = { static const struct option long_options[] = {
@ -566,6 +584,8 @@ static const struct option long_options[] = {
{"channels", required_argument, NULL, OPT_CHANNELS }, {"channels", required_argument, NULL, OPT_CHANNELS },
{"format", required_argument, NULL, OPT_FORMAT }, {"format", required_argument, NULL, OPT_FORMAT },
{"volume", required_argument, NULL, OPT_VOLUME },
{NULL, 0, NULL, 0 } {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" " --rate Sample rate (req. for rec) (default %u)\n"
" --channels Number of channels (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" " --format Sample format %s (req. for rec) (default %s)\n"
" --volume Stream volume 0-1.0 (default %.3f)\n"
"\n", "\n",
DEFAULT_RATE, DEFAULT_CHANNELS, STR_FMTS, DEFAULT_FORMAT); DEFAULT_RATE, DEFAULT_CHANNELS, STR_FMTS, DEFAULT_FORMAT, DEFAULT_VOLUME);
if (!strcmp(name, "pwcat")) { if (!strcmp(name, "pwcat")) {
fprintf(fp, fprintf(fp,
@ -646,6 +667,9 @@ int main(int argc, char *argv[])
else else
data.mode = mode_none; data.mode = mode_none;
/* negative means no volume adjustment */
data.volume = -1.0;
while ((c = getopt_long(argc, argv, "hvprR:", long_options, NULL)) != -1) { while ((c = getopt_long(argc, argv, "hvprR:", long_options, NULL)) != -1) {
switch (c) { switch (c) {
@ -733,6 +757,10 @@ int main(int argc, char *argv[])
format = sf_str_to_fmt(optarg); format = sf_str_to_fmt(optarg);
break; break;
case OPT_VOLUME:
data.volume = atof(optarg);
break;
default: default:
fprintf(stderr, "error: unknown option '%c'\n", c); fprintf(stderr, "error: unknown option '%c'\n", c);
goto error_usage; goto error_usage;
@ -762,6 +790,8 @@ int main(int argc, char *argv[])
data.rate = DEFAULT_RATE; data.rate = DEFAULT_RATE;
if (!data.channels) if (!data.channels)
data.rate = DEFAULT_CHANNELS; data.rate = DEFAULT_CHANNELS;
if (data.volume < 0)
data.volume = DEFAULT_VOLUME;
if (data.mode == mode_record && !format) if (data.mode == mode_record && !format)
format = sf_str_to_fmt(DEFAULT_FORMAT); format = sf_str_to_fmt(DEFAULT_FORMAT);