diff options
author | Max Kellermann <max@duempel.org> | 2013-10-25 00:11:10 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2013-10-25 00:20:36 +0200 |
commit | 961c7d0f7853d28eddffd74d4a874c3e6a85ee9c (patch) | |
tree | 65f2705d3ff037107f05a35f61ea555b4d1f780b /src | |
parent | c1ba47beee9c084e2a592e54dcda3f470e26ec47 (diff) | |
download | mpd-961c7d0f7853d28eddffd74d4a874c3e6a85ee9c.tar.gz mpd-961c7d0f7853d28eddffd74d4a874c3e6a85ee9c.tar.xz mpd-961c7d0f7853d28eddffd74d4a874c3e6a85ee9c.zip |
OtherCommands: re-add the "volume" command
This command was removed by commit 206392ad (MPD 0.16), even though it
was been proven useful for some very simple clients. On request, I
add it to the protocol again.
Diffstat (limited to 'src')
-rw-r--r-- | src/command/AllCommands.cxx | 1 | ||||
-rw-r--r-- | src/command/OtherCommands.cxx | 33 | ||||
-rw-r--r-- | src/command/OtherCommands.hxx | 3 |
3 files changed, 37 insertions, 0 deletions
diff --git a/src/command/AllCommands.cxx b/src/command/AllCommands.cxx index 2271aeff2..b83b42a29 100644 --- a/src/command/AllCommands.cxx +++ b/src/command/AllCommands.cxx @@ -161,6 +161,7 @@ static const struct command commands[] = { { "unsubscribe", PERMISSION_READ, 1, 1, handle_unsubscribe }, { "update", PERMISSION_CONTROL, 0, 1, handle_update }, { "urlhandlers", PERMISSION_READ, 0, 0, handle_urlhandlers }, + { "volume", PERMISSION_CONTROL, 1, 1, handle_volume }, }; static const unsigned num_commands = sizeof(commands) / sizeof(commands[0]); diff --git a/src/command/OtherCommands.cxx b/src/command/OtherCommands.cxx index 55391af16..510ef89e7 100644 --- a/src/command/OtherCommands.cxx +++ b/src/command/OtherCommands.cxx @@ -237,6 +237,39 @@ handle_setvol(Client &client, gcc_unused int argc, char *argv[]) } CommandResult +handle_volume(Client &client, gcc_unused int argc, char *argv[]) +{ + int relative; + if (!check_int(client, &relative, argv[1])) + return CommandResult::ERROR; + + if (relative < -100 || relative > 100) { + command_error(client, ACK_ERROR_ARG, "Invalid volume value"); + return CommandResult::ERROR; + } + + const int old_volume = volume_level_get(); + if (old_volume < 0) { + command_error(client, ACK_ERROR_SYSTEM, "No mixer"); + return CommandResult::ERROR; + } + + int new_volume = old_volume + relative; + if (new_volume < 0) + new_volume = 0; + else if (new_volume > 100) + new_volume = 100; + + if (new_volume != old_volume && !volume_level_change(new_volume)) { + command_error(client, ACK_ERROR_SYSTEM, + "problems setting volume"); + return CommandResult::ERROR; + } + + return CommandResult::OK; +} + +CommandResult handle_stats(Client &client, gcc_unused int argc, gcc_unused char *argv[]) { diff --git a/src/command/OtherCommands.hxx b/src/command/OtherCommands.hxx index fe3e145c4..20201e8b9 100644 --- a/src/command/OtherCommands.hxx +++ b/src/command/OtherCommands.hxx @@ -52,6 +52,9 @@ CommandResult handle_setvol(Client &client, int argc, char *argv[]); CommandResult +handle_volume(Client &client, int argc, char *argv[]); + +CommandResult handle_stats(Client &client, int argc, char *argv[]); CommandResult |