diff --git a/NEWS b/NEWS index 36ddce6fe..6a566e15e 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,10 @@ ver 0.23 (not yet released) - new command "getvol" ver 0.22.5 (not yet released) +* tags + - id: translate TPE3 to Conductor, not Performer +* archive + - iso9660: another fix for unaligned reads * output - httpd: error handling on Windows improved diff --git a/src/archive/plugins/Iso9660ArchivePlugin.cxx b/src/archive/plugins/Iso9660ArchivePlugin.cxx index f0123e58f..71f2ebb22 100644 --- a/src/archive/plugins/Iso9660ArchivePlugin.cxx +++ b/src/archive/plugins/Iso9660ArchivePlugin.cxx @@ -221,8 +221,8 @@ public: if (new_offset > size) throw std::runtime_error("Invalid seek offset"); + offset = new_offset; skip = new_offset % ISO_BLOCKSIZE; - offset = new_offset - skip; buffer.Clear(); } }; @@ -260,13 +260,13 @@ Iso9660InputStream::Read(std::unique_lock &, if (r.empty()) { /* the buffer is empty - read more data from the ISO file */ - assert(offset % ISO_BLOCKSIZE == 0); + assert((offset - skip) % ISO_BLOCKSIZE == 0); const ScopeUnlock unlock(mutex); const lsn_t read_lsn = lsn + offset / ISO_BLOCKSIZE; - if (read_size >= ISO_BLOCKSIZE) { + if (read_size >= ISO_BLOCKSIZE && skip == 0) { /* big read - read right into the caller's buffer */ auto nbytes = iso->SeekRead(ptr, read_lsn, diff --git a/src/tag/Id3Scan.cxx b/src/tag/Id3Scan.cxx index c2b9b7837..ef787f412 100644 --- a/src/tag/Id3Scan.cxx +++ b/src/tag/Id3Scan.cxx @@ -352,7 +352,7 @@ scan_id3_tag(const struct id3_tag *tag, TagHandler &handler) noexcept handler); tag_id3_import_text(tag, ID3_FRAME_COMPOSER, TAG_COMPOSER, handler); - tag_id3_import_text(tag, "TPE3", TAG_PERFORMER, + tag_id3_import_text(tag, "TPE3", TAG_CONDUCTOR, handler); tag_id3_import_text(tag, "TPE4", TAG_PERFORMER, handler); tag_id3_import_text(tag, "TIT1", TAG_GROUPING, handler); diff --git a/test/run_input.cxx b/test/run_input.cxx index 64eaa72cc..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) @@ -118,7 +126,7 @@ ParseCommandLine(int argc, char **argv) auto args = option_parser.GetRemaining(); if (args.size != 1) - throw std::runtime_error("Usage: run_input [--verbose] [--config=FILE] URI"); + throw std::runtime_error("Usage: run_input [--verbose] [--config=FILE] [--scan] [--chunk-size=BYTES] URI"); c.uri = args.front(); return c; @@ -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;