Merge branch 'v0.22.x'
This commit is contained in:
commit
a4b236348f
4
NEWS
4
NEWS
|
@ -3,6 +3,10 @@ ver 0.23 (not yet released)
|
||||||
- new command "getvol"
|
- new command "getvol"
|
||||||
|
|
||||||
ver 0.22.5 (not yet released)
|
ver 0.22.5 (not yet released)
|
||||||
|
* tags
|
||||||
|
- id: translate TPE3 to Conductor, not Performer
|
||||||
|
* archive
|
||||||
|
- iso9660: another fix for unaligned reads
|
||||||
* output
|
* output
|
||||||
- httpd: error handling on Windows improved
|
- httpd: error handling on Windows improved
|
||||||
|
|
||||||
|
|
|
@ -221,8 +221,8 @@ public:
|
||||||
if (new_offset > size)
|
if (new_offset > size)
|
||||||
throw std::runtime_error("Invalid seek offset");
|
throw std::runtime_error("Invalid seek offset");
|
||||||
|
|
||||||
|
offset = new_offset;
|
||||||
skip = new_offset % ISO_BLOCKSIZE;
|
skip = new_offset % ISO_BLOCKSIZE;
|
||||||
offset = new_offset - skip;
|
|
||||||
buffer.Clear();
|
buffer.Clear();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -260,13 +260,13 @@ Iso9660InputStream::Read(std::unique_lock<Mutex> &,
|
||||||
if (r.empty()) {
|
if (r.empty()) {
|
||||||
/* the buffer is empty - read more data from the ISO file */
|
/* 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 ScopeUnlock unlock(mutex);
|
||||||
|
|
||||||
const lsn_t read_lsn = lsn + offset / ISO_BLOCKSIZE;
|
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 */
|
/* big read - read right into the caller's buffer */
|
||||||
|
|
||||||
auto nbytes = iso->SeekRead(ptr, read_lsn,
|
auto nbytes = iso->SeekRead(ptr, read_lsn,
|
||||||
|
|
|
@ -352,7 +352,7 @@ scan_id3_tag(const struct id3_tag *tag, TagHandler &handler) noexcept
|
||||||
handler);
|
handler);
|
||||||
tag_id3_import_text(tag, ID3_FRAME_COMPOSER, TAG_COMPOSER,
|
tag_id3_import_text(tag, ID3_FRAME_COMPOSER, TAG_COMPOSER,
|
||||||
handler);
|
handler);
|
||||||
tag_id3_import_text(tag, "TPE3", TAG_PERFORMER,
|
tag_id3_import_text(tag, "TPE3", TAG_CONDUCTOR,
|
||||||
handler);
|
handler);
|
||||||
tag_id3_import_text(tag, "TPE4", TAG_PERFORMER, handler);
|
tag_id3_import_text(tag, "TPE4", TAG_PERFORMER, handler);
|
||||||
tag_id3_import_text(tag, "TIT1", TAG_GROUPING, handler);
|
tag_id3_import_text(tag, "TIT1", TAG_GROUPING, handler);
|
||||||
|
|
|
@ -56,6 +56,8 @@ struct CommandLine {
|
||||||
|
|
||||||
FromNarrowPath config_path;
|
FromNarrowPath config_path;
|
||||||
|
|
||||||
|
std::size_t seek = 0;
|
||||||
|
|
||||||
std::size_t chunk_size = MAX_CHUNK_SIZE;
|
std::size_t chunk_size = MAX_CHUNK_SIZE;
|
||||||
|
|
||||||
bool verbose = false;
|
bool verbose = false;
|
||||||
|
@ -67,6 +69,7 @@ enum Option {
|
||||||
OPTION_CONFIG,
|
OPTION_CONFIG,
|
||||||
OPTION_VERBOSE,
|
OPTION_VERBOSE,
|
||||||
OPTION_SCAN,
|
OPTION_SCAN,
|
||||||
|
OPTION_SEEK,
|
||||||
OPTION_CHUNK_SIZE,
|
OPTION_CHUNK_SIZE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -74,6 +77,7 @@ static constexpr OptionDef option_defs[] = {
|
||||||
{"config", 0, true, "Load a MPD configuration file"},
|
{"config", 0, true, "Load a MPD configuration file"},
|
||||||
{"verbose", 'v', false, "Verbose logging"},
|
{"verbose", 'v', false, "Verbose logging"},
|
||||||
{"scan", 0, false, "Scan tags instead of reading raw data"},
|
{"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"},
|
{"chunk-size", 0, true, "Read this number of bytes at a time"},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -108,6 +112,10 @@ ParseCommandLine(int argc, char **argv)
|
||||||
c.scan = true;
|
c.scan = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OPTION_SEEK:
|
||||||
|
c.seek = ParseSize(o.value);
|
||||||
|
break;
|
||||||
|
|
||||||
case OPTION_CHUNK_SIZE:
|
case OPTION_CHUNK_SIZE:
|
||||||
c.chunk_size = ParseSize(o.value);
|
c.chunk_size = ParseSize(o.value);
|
||||||
if (c.chunk_size <= 0 || c.chunk_size > MAX_CHUNK_SIZE)
|
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();
|
auto args = option_parser.GetRemaining();
|
||||||
if (args.size != 1)
|
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();
|
c.uri = args.front();
|
||||||
return c;
|
return c;
|
||||||
|
@ -153,10 +161,14 @@ tag_save(FILE *file, const Tag &tag)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
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<Mutex> lock(is.mutex);
|
std::unique_lock<Mutex> lock(is.mutex);
|
||||||
|
|
||||||
|
if (seek > 0)
|
||||||
|
is.Seek(lock, seek);
|
||||||
|
|
||||||
/* print meta data */
|
/* print meta data */
|
||||||
|
|
||||||
if (is.HasMimeType())
|
if (is.HasMimeType())
|
||||||
|
@ -256,7 +268,7 @@ try {
|
||||||
Mutex mutex;
|
Mutex mutex;
|
||||||
auto is = InputStream::OpenReady(c.uri, mutex);
|
auto is = InputStream::OpenReady(c.uri, mutex);
|
||||||
return dump_input_stream(*is, FileDescriptor(STDOUT_FILENO),
|
return dump_input_stream(*is, FileDescriptor(STDOUT_FILENO),
|
||||||
c.chunk_size);
|
c.seek, c.chunk_size);
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
PrintException(std::current_exception());
|
PrintException(std::current_exception());
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
|
Loading…
Reference in New Issue