Make the input_stream implementation hold a reference on the
archive_file object. Allow the caller to "close" the archive_file
object immediately, no matter if the open_stream() method has
succeeded or not.
This replaces the rewinding buffer code from the CURL input plugin.
It is more generic, and allows rewinding even when the server sends
Icy-Metadata (which would have been too difficult to implement within
the CURL plugin).
This is a rather complex patch for the stable branch (v0.15.x), but it
fixes a serious problem: the "vorbis" decoder plugin was unable to
play streams with Icy-Metadata, because it couldn't rewind the stream
after detecting the codec (Vorbis vs. FLAC).
When collecting tag values for the result set, add all of a song's tag
values of the searched type. This affects the "list" command.
Previously, "list" only considered the first tag value of a song.
Seek the decoder to the start of the range before beginning with
playback. Stop the decoder when the end of the range has been
reached. Add the start position to the seek position. Expose the
duration of the range, not the full song file.
Prepend the playlist's base URI to relative song URIs. Look up songs
in the database (if the URI refers to a local song file). Merge
existing database metadata with metadata from the playlist plugin.
Added attributes start_ms, end_ms. This allows us to address a
portion of a song file (important for CUE support). There is no
support yet for storing these attributes in the state file.
Remove the data_time parameter from decoder_data(). This patch
eliminates the timestamp counting in most decoder plugins, because the
MPD core will do it automatically by default.
Don't clear the music pipe when seeking has failed - check the
"seeking" flag instead of "command==SEEK". Clear the "seeking" flag
in decoder_seek_error().
Use the plugin instead of the glue code in normalize.c. This is used
wrapped inside a "autoconv" filter, to enable normalization for all
input file formats.
Make the audio_format argument non-const. Allow the open() method to
modify it, to indicate that it wants a different input audio format
than the one specified. Check that condition in chain_filter_open(),
and fail.
This plugin is the groundwork for MPD's future generic CUE sheet
support. That's not complete yet, e.g. there is no way for a playlist
plugin to address an arbitrary position within a music file.