summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorMax Kellermann <max@musicpd.org>2021-03-05 19:33:46 +0100
committerMax Kellermann <max@musicpd.org>2021-03-05 19:33:46 +0100
commite1b62fb90d5e70ff2ba3a858013c61399b4b15ce (patch)
treef580f06c4935351cca99d9b0212971973b4469c1 /test
parent422cf5f182fdd285c88b6c676f8ab65146976529 (diff)
parent93016ac6aba0053f1d740527c6c123a052d5e40d (diff)
Merge branch 'v0.22.x'
Diffstat (limited to 'test')
-rw-r--r--test/run_output.cxx72
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 */