diff --git a/test/run_input.cxx b/test/run_input.cxx index 648efd6e1..0607dd3c6 100644 --- a/test/run_input.cxx +++ b/test/run_input.cxx @@ -56,6 +56,8 @@ struct CommandLine { FromNarrowPath config_path; + std::size_t seek = 0; + std::size_t chunk_size = MAX_CHUNK_SIZE; bool verbose = false; @@ -67,6 +69,7 @@ enum Option { OPTION_CONFIG, OPTION_VERBOSE, OPTION_SCAN, + OPTION_SEEK, OPTION_CHUNK_SIZE, }; @@ -74,6 +77,7 @@ static constexpr OptionDef option_defs[] = { {"config", 0, true, "Load a MPD configuration file"}, {"verbose", 'v', false, "Verbose logging"}, {"scan", 0, false, "Scan tags instead of reading raw data"}, + {"seek", 0, true, "Start reading at this position"}, {"chunk-size", 0, true, "Read this number of bytes at a time"}, }; @@ -108,6 +112,10 @@ ParseCommandLine(int argc, char **argv) c.scan = true; break; + case OPTION_SEEK: + c.seek = ParseSize(o.value); + break; + case OPTION_CHUNK_SIZE: c.chunk_size = ParseSize(o.value); if (c.chunk_size <= 0 || c.chunk_size > MAX_CHUNK_SIZE) @@ -153,10 +161,14 @@ tag_save(FILE *file, const Tag &tag) } static int -dump_input_stream(InputStream &is, FileDescriptor out, size_t chunk_size) +dump_input_stream(InputStream &is, FileDescriptor out, + offset_type seek, size_t chunk_size) { std::unique_lock lock(is.mutex); + if (seek > 0) + is.Seek(lock, seek); + /* print meta data */ if (is.HasMimeType()) @@ -256,7 +268,7 @@ try { Mutex mutex; auto is = InputStream::OpenReady(c.uri, mutex); return dump_input_stream(*is, FileDescriptor(STDOUT_FILENO), - c.chunk_size); + c.seek, c.chunk_size); } catch (...) { PrintException(std::current_exception()); return EXIT_FAILURE;