aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ponymix.14
-rw-r--r--ponymix.cc25
2 files changed, 28 insertions, 1 deletions
diff --git a/ponymix.1 b/ponymix.1
index 59365db..703cb81 100644
--- a/ponymix.1
+++ b/ponymix.1
@@ -14,6 +14,10 @@ is used. Cards can be specified by name or numeric index.
.IP "\fB\-d\fR, \fB\-\-device\fR \fIDEVICE\fR"
Specify a device other than the default. Devices can be specified by name
or numeric index.
+.IP "\fB\-\-max\-volume\fR \fIVALUE\fR"
+Override the maximum volume ponymix will allow. This is baked in to be 100
+using the \fBincrease\fR and \fBdecrease\fR methods, and 150 via
+\fBset-volume\fR.
.IP "\fB\-N\fR, \fB\-\-notify\fR"
Create a libnotify notification for volume change events instead of printing
the new volume to standard output. Requires compile time support for libnotify.
diff --git a/ponymix.cc b/ponymix.cc
index d20aeb5..1e5afae 100644
--- a/ponymix.cc
+++ b/ponymix.cc
@@ -56,8 +56,21 @@ static const char* opt_action;
static const char* opt_device;
static const char* opt_card;
static bool opt_notify;
+static long opt_maxvolume;
static Color color;
+static int xstrtol(const char *str, long *out) {
+ char *end = nullptr;
+
+ if (str == nullptr || *str == '\0') return -1;
+ errno = 0;
+
+ *out = strtol(str, &end, 10);
+ if (errno || str == end || (end && *end)) return -1;
+
+ return 0;
+}
+
static const char* type_to_string(enum DeviceType t) {
switch (t) {
case DEVTYPE_SINK:
@@ -319,7 +332,7 @@ static int adj_volume(PulseClient& ponymix,
// Allow setting the volume over 100, but don't "clip" the level back down to
// 100 on adjustment.
- ponymix.SetVolumeRange(0, std::max(device->Volume(), 100));
+ ponymix.SetVolumeRange(0, std::max(device->Volume(), (int)opt_maxvolume));
return !(ponymix.*adjust)(*device, delta);
}
@@ -488,6 +501,7 @@ static void usage() {
" -d, --device DEVICE target device (index or name)\n"
" -t, --devtype TYPE device type\n"
" -N, --notify use libnotify to announce volume changes\n"
+ " --max-volume VALUE use VALUE as max volume\n"
" --source alias to -t source\n"
" --input alais to -t source\n"
" --sink alias to -t sink\n"
@@ -572,6 +586,7 @@ bool parse_options(int argc, char** argv) {
{ "input", no_argument, 0, 0x103 },
{ "sink-input", no_argument, 0, 0x104 },
{ "source-output", no_argument, 0, 0x105 },
+ { "max-volume", required_argument, 0, 0x106 },
{ 0, 0, 0, 0 },
};
@@ -618,6 +633,13 @@ bool parse_options(int argc, char** argv) {
opt_devtype = DEVTYPE_SOURCE_OUTPUT;
opt_listrestrict = true;
break;
+ case 0x106:
+ if (xstrtol(optarg, &opt_maxvolume) < 0) {
+ fprintf(stderr, "error: invalid max volume: %s: must be a positive integer\n",
+ optarg);
+ return false;
+ }
+ break;
default:
return false;
}
@@ -636,6 +658,7 @@ int main(int argc, char* argv[]) {
opt_action = "defaults";
opt_devtype = DEVTYPE_SINK;
opt_device = defaults.sink.c_str();
+ opt_maxvolume = 100;
if (!parse_options(argc, argv)) return 1;
argc -= optind;