diff options
author | Max Kellermann <max@musicpd.org> | 2021-03-05 19:33:46 +0100 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2021-03-05 19:33:46 +0100 |
commit | e1b62fb90d5e70ff2ba3a858013c61399b4b15ce (patch) | |
tree | f580f06c4935351cca99d9b0212971973b4469c1 /test | |
parent | 422cf5f182fdd285c88b6c676f8ab65146976529 (diff) | |
parent | 93016ac6aba0053f1d740527c6c123a052d5e40d (diff) |
Merge branch 'v0.22.x'
Diffstat (limited to 'test')
-rw-r--r-- | test/run_output.cxx | 72 |
1 files changed, 56 insertions, 16 deletions
diff --git a/test/run_output.cxx b/test/run_output.cxx index db567cab9..bb7ba71b8 100644 --- a/test/run_output.cxx +++ b/test/run_output.cxx @@ -26,10 +26,13 @@ #include "fs/NarrowPath.hxx" #include "pcm/AudioParser.hxx" #include "pcm/AudioFormat.hxx" +#include "util/OptionDef.hxx" +#include "util/OptionParser.hxx" #include "util/StringBuffer.hxx" #include "util/RuntimeError.hxx" #include "util/ScopeExit.hxx" #include "util/PrintException.hxx" +#include "LogBackend.hxx" #include <cassert> #include <memory> @@ -39,6 +42,51 @@ #include <stdlib.h> #include <stdio.h> +struct CommandLine { + FromNarrowPath config_path; + + const char *output_name = nullptr; + + AudioFormat audio_format{44100, SampleFormat::S16, 2}; + + bool verbose = false; +}; + +enum Option { + OPTION_VERBOSE, +}; + +static constexpr OptionDef option_defs[] = { + {"verbose", 'v', false, "Verbose logging"}, +}; + +static CommandLine +ParseCommandLine(int argc, char **argv) +{ + CommandLine c; + + OptionParser option_parser(option_defs, argc, argv); + while (auto o = option_parser.Next()) { + switch (Option(o.index)) { + case OPTION_VERBOSE: + c.verbose = true; + break; + } + } + + auto args = option_parser.GetRemaining(); + if (args.size < 2 || args.size > 3) + throw std::runtime_error("Usage: run_output CONFIG NAME [FORMAT] <IN"); + + c.config_path = args[0]; + c.output_name = args[1]; + + if (args.size > 2) + c.audio_format = ParseAudioFormat(args[2], false); + + return c; +} + static std::unique_ptr<AudioOutput> LoadAudioOutput(const ConfigData &config, EventLoop &event_loop, const char *name) @@ -57,6 +105,8 @@ LoadAudioOutput(const ConfigData &config, EventLoop &event_loop, if (plugin == nullptr) throw FormatRuntimeError("No such audio output plugin: %s", plugin_name); +#include "util/OptionDef.hxx" +#include "util/OptionParser.hxx" return std::unique_ptr<AudioOutput>(ao_plugin_init(event_loop, *plugin, *block)); @@ -107,34 +157,24 @@ run_output(AudioOutput &ao, AudioFormat audio_format) int main(int argc, char **argv) try { - if (argc < 3 || argc > 4) { - fprintf(stderr, "Usage: run_output CONFIG NAME [FORMAT] <IN\n"); - return EXIT_FAILURE; - } - - const FromNarrowPath config_path = argv[1]; - - AudioFormat audio_format(44100, SampleFormat::S16, 2); + const auto c = ParseCommandLine(argc, argv); + SetLogThreshold(c.verbose ? LogLevel::DEBUG : LogLevel::INFO); /* read configuration file (mpd.conf) */ - const auto config = AutoLoadConfigFile(config_path); + const auto config = AutoLoadConfigFile(c.config_path); EventThread io_thread; io_thread.Start(); /* initialize the audio output */ - auto ao = LoadAudioOutput(config, io_thread.GetEventLoop(), argv[2]); - - /* parse the audio format */ - - if (argc > 3) - audio_format = ParseAudioFormat(argv[3], false); + auto ao = LoadAudioOutput(config, io_thread.GetEventLoop(), + c.output_name); /* do it */ - run_output(*ao, audio_format); + run_output(*ao, c.audio_format); /* cleanup and exit */ |