From 8f33a44b6cd1707d5dc7926623364ff73a06d62c Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Wed, 5 Aug 2020 23:03:50 +0200 Subject: [PATCH] Userland: Use Core::ArgsParser for 'avol' --- Userland/avol.cpp | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/Userland/avol.cpp b/Userland/avol.cpp index 4c16bbd7ed..cc38a6b0dc 100644 --- a/Userland/avol.cpp +++ b/Userland/avol.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -35,23 +36,35 @@ int main(int argc, char** argv) auto audio_client = Audio::ClientConnection::construct(); audio_client->handshake(); - if (argc > 1) { - if (String(argv[1]) == "-m") { - audio_client->set_muted(true); - printf("Muted.\n"); - return 0; - } - if (String(argv[1]) == "-M") { - audio_client->set_muted(false); - printf("Unmuted.\n"); - return 0; - } + bool mute = false; + bool unmute = false; + // FIXME: What is a good way to have an optional int argument? + const char* volume = nullptr; - int new_volume = atoi(argv[1]); + Core::ArgsParser args_parser; + args_parser.add_option(mute, "Mute volume", "mute", 'm'); + args_parser.add_option(unmute, "Unmute volume", "unmute", 'M'); + args_parser.add_positional_argument(volume, "Volume to set", "volume", Core::ArgsParser::Required::No); + args_parser.parse(argc, argv); + + if (!mute && !unmute && !volume) { + auto volume = audio_client->get_main_mix_volume(); + printf("Volume: %d\n", volume); + return 0; + } + if (!(mute ^ unmute ^ (volume != nullptr))) { + fprintf(stderr, "Only one of mute, unmute or volume must be used\n"); + return 1; + } + if (mute) { + audio_client->set_muted(true); + printf("Muted.\n"); + } else if (unmute) { + audio_client->set_muted(false); + printf("Unmuted.\n"); + } else { + auto new_volume = atoi(volume); audio_client->set_main_mix_volume(new_volume); } - - int volume = audio_client->get_main_mix_volume(); - printf("Volume: %d\n", volume); return 0; }