diff options
author | Max Kellermann <max@musicpd.org> | 2018-02-12 23:52:44 +0100 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2018-02-13 00:00:00 +0100 |
commit | 0c300bd4b4dd1fdd54f0674c58ff2e6b646b1fbd (patch) | |
tree | ef1d83d35356d2113988cf22c216216d7f128527 /test | |
parent | 53acb7bfcbed943d7592cb868d427d8b48dd1bcb (diff) |
test/run_decoder: add command-line option to read mpd.conf
Diffstat (limited to 'test')
-rw-r--r-- | test/run_decoder.cxx | 75 |
1 files changed, 62 insertions, 13 deletions
diff --git a/test/run_decoder.cxx b/test/run_decoder.cxx index 90f93420e..c88625a9d 100644 --- a/test/run_decoder.cxx +++ b/test/run_decoder.cxx @@ -18,6 +18,7 @@ */ #include "config.h" +#include "config/ConfigGlobal.hxx" #include "event/Thread.hxx" #include "decoder/DecoderList.hxx" #include "decoder/DecoderPlugin.hxx" @@ -26,7 +27,10 @@ #include "input/InputStream.hxx" #include "fs/Path.hxx" #include "AudioFormat.hxx" +#include "util/OptionDef.hxx" +#include "util/OptionParser.hxx" #include "Log.hxx" +#include "LogBackend.hxx" #include <stdexcept> @@ -35,13 +39,64 @@ #include <stdlib.h> #include <stdio.h> +struct CommandLine { + const char *decoder = nullptr; + const char *uri = nullptr; + + Path config_path = nullptr; + + bool verbose = false; +}; + +enum Option { + OPTION_CONFIG, + OPTION_VERBOSE, +}; + +static constexpr OptionDef option_defs[] = { + {"config", 0, true, "Load a MPD configuration file"}, + {"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_CONFIG: + c.config_path = Path::FromFS(o.value); + break; + + case OPTION_VERBOSE: + c.verbose = true; + break; + } + } + + auto args = option_parser.GetRemaining(); + if (args.size != 2) + throw std::runtime_error("Usage: run_decoder [--verbose] [--config=FILE] DECODER URI"); + + c.decoder = args[0]; + c.uri = args[1]; + return c; +} + class GlobalInit { EventThread io_thread; public: - GlobalInit() { + GlobalInit(Path config_path, bool verbose) { + SetLogThreshold(verbose ? LogLevel::DEBUG : LogLevel::INFO); + io_thread.Start(); + if (!config_path.IsNull()) + ReadConfigFile(config_path); + input_stream_global_init(io_thread.GetEventLoop()); decoder_plugin_init_all(); } @@ -54,27 +109,21 @@ public: int main(int argc, char **argv) try { - if (argc != 3) { - fprintf(stderr, "Usage: run_decoder DECODER URI >OUT\n"); - return EXIT_FAILURE; - } - - const char *const decoder_name = argv[1]; - const char *const uri = argv[2]; + const auto c = ParseCommandLine(argc, argv); - const GlobalInit init; + const GlobalInit init(c.config_path, c.verbose); - const DecoderPlugin *plugin = decoder_plugin_from_name(decoder_name); + const DecoderPlugin *plugin = decoder_plugin_from_name(c.decoder); if (plugin == nullptr) { - fprintf(stderr, "No such decoder: %s\n", decoder_name); + fprintf(stderr, "No such decoder: %s\n", c.decoder); return EXIT_FAILURE; } FakeDecoder decoder; if (plugin->file_decode != nullptr) { - plugin->FileDecode(decoder, Path::FromFS(uri)); + plugin->FileDecode(decoder, Path::FromFS(c.uri)); } else if (plugin->stream_decode != nullptr) { - auto is = InputStream::OpenReady(uri, decoder.mutex, + auto is = InputStream::OpenReady(c.uri, decoder.mutex, decoder.cond); plugin->StreamDecode(decoder, *is); } else { |