InputStream: add method Rewind()
This commit is contained in:
parent
fe3c5e4e8e
commit
f1027ed198
@ -40,9 +40,6 @@
|
|||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h> /* for SEEK_SET */
|
|
||||||
|
|
||||||
static constexpr Domain decoder_thread_domain("decoder_thread");
|
static constexpr Domain decoder_thread_domain("decoder_thread");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -128,7 +125,7 @@ decoder_stream_decode(const DecoderPlugin &plugin,
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
/* rewind the stream, so each plugin gets a fresh start */
|
/* rewind the stream, so each plugin gets a fresh start */
|
||||||
input_stream->Seek(0, SEEK_SET, IgnoreError());
|
input_stream->Rewind(IgnoreError());
|
||||||
|
|
||||||
decoder.dc.Unlock();
|
decoder.dc.Unlock();
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include "util/Domain.hxx"
|
#include "util/Domain.hxx"
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <stdio.h> /* for SEEK_SET */
|
||||||
|
|
||||||
static constexpr Domain input_domain("input");
|
static constexpr Domain input_domain("input");
|
||||||
|
|
||||||
@ -113,6 +114,18 @@ input_stream::LockSeek(offset_type _offset, int whence, Error &error)
|
|||||||
return Seek(_offset, whence, error);
|
return Seek(_offset, whence, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
input_stream::Rewind(Error &error)
|
||||||
|
{
|
||||||
|
return Seek(0, SEEK_SET, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
input_stream::LockRewind(Error &error)
|
||||||
|
{
|
||||||
|
return LockSeek(0, SEEK_SET, error);
|
||||||
|
}
|
||||||
|
|
||||||
Tag *
|
Tag *
|
||||||
input_stream::ReadTag()
|
input_stream::ReadTag()
|
||||||
{
|
{
|
||||||
|
@ -217,6 +217,13 @@ struct input_stream {
|
|||||||
*/
|
*/
|
||||||
bool LockSeek(offset_type offset, int whence, Error &error);
|
bool LockSeek(offset_type offset, int whence, Error &error);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rewind to the beginning of the stream. This is a wrapper
|
||||||
|
* for Seek(0, SEEK_SET, error).
|
||||||
|
*/
|
||||||
|
bool Rewind(Error &error);
|
||||||
|
bool LockRewind(Error &error);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the stream has reached end-of-file.
|
* Returns true if the stream has reached end-of-file.
|
||||||
*
|
*
|
||||||
|
@ -44,7 +44,6 @@
|
|||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
const struct playlist_plugin *const playlist_plugins[] = {
|
const struct playlist_plugin *const playlist_plugins[] = {
|
||||||
&extm3u_playlist_plugin,
|
&extm3u_playlist_plugin,
|
||||||
@ -221,7 +220,7 @@ playlist_list_open_stream_mime2(struct input_stream *is, const char *mime)
|
|||||||
string_array_contains(plugin->mime_types, mime)) {
|
string_array_contains(plugin->mime_types, mime)) {
|
||||||
/* rewind the stream, so each plugin gets a
|
/* rewind the stream, so each plugin gets a
|
||||||
fresh start */
|
fresh start */
|
||||||
is->Seek(0, SEEK_SET, IgnoreError());
|
is->Rewind(IgnoreError());
|
||||||
|
|
||||||
auto playlist = playlist_plugin_open_stream(plugin, is);
|
auto playlist = playlist_plugin_open_stream(plugin, is);
|
||||||
if (playlist != nullptr)
|
if (playlist != nullptr)
|
||||||
@ -261,7 +260,7 @@ playlist_list_open_stream_suffix(struct input_stream *is, const char *suffix)
|
|||||||
string_array_contains(plugin->suffixes, suffix)) {
|
string_array_contains(plugin->suffixes, suffix)) {
|
||||||
/* rewind the stream, so each plugin gets a
|
/* rewind the stream, so each plugin gets a
|
||||||
fresh start */
|
fresh start */
|
||||||
is->Seek(0, SEEK_SET, IgnoreError());
|
is->Rewind(IgnoreError());
|
||||||
|
|
||||||
auto playlist = playlist_plugin_open_stream(plugin, is);
|
auto playlist = playlist_plugin_open_stream(plugin, is);
|
||||||
if (playlist != nullptr)
|
if (playlist != nullptr)
|
||||||
|
@ -27,7 +27,6 @@
|
|||||||
#include "thread/Cond.hxx"
|
#include "thread/Cond.hxx"
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <unistd.h> /* for SEEK_SET */
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
tag_file_scan(const char *path_fs,
|
tag_file_scan(const char *path_fs,
|
||||||
@ -71,7 +70,7 @@ tag_file_scan(const char *path_fs,
|
|||||||
*handler, handler_ctx))
|
*handler, handler_ctx))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
is->LockSeek(0, SEEK_SET, IgnoreError());
|
is->LockRewind(IgnoreError());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,15 +31,6 @@
|
|||||||
#include "util/Domain.hxx"
|
#include "util/Domain.hxx"
|
||||||
#include "LogV.hxx"
|
#include "LogV.hxx"
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include <libavcodec/avcodec.h>
|
#include <libavcodec/avcodec.h>
|
||||||
#include <libavformat/avformat.h>
|
#include <libavformat/avformat.h>
|
||||||
@ -50,6 +41,9 @@ extern "C" {
|
|||||||
#include <libavutil/dict.h>
|
#include <libavutil/dict.h>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
static constexpr Domain ffmpeg_domain("ffmpeg");
|
static constexpr Domain ffmpeg_domain("ffmpeg");
|
||||||
|
|
||||||
/* suppress the ffmpeg compatibility macro */
|
/* suppress the ffmpeg compatibility macro */
|
||||||
@ -352,7 +346,7 @@ ffmpeg_probe(Decoder *decoder, struct input_stream *is)
|
|||||||
|
|
||||||
unsigned char buffer[BUFFER_SIZE];
|
unsigned char buffer[BUFFER_SIZE];
|
||||||
size_t nbytes = decoder_read(decoder, is, buffer, BUFFER_SIZE);
|
size_t nbytes = decoder_read(decoder, is, buffer, BUFFER_SIZE);
|
||||||
if (nbytes <= PADDING || !is->LockSeek(0, SEEK_SET, error))
|
if (nbytes <= PADDING || !is->LockRewind(error))
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
/* some ffmpeg parsers (e.g. ac3_parser.c) read a few bytes
|
/* some ffmpeg parsers (e.g. ac3_parser.c) read a few bytes
|
||||||
|
@ -29,10 +29,6 @@
|
|||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7
|
#if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7
|
||||||
#error libFLAC is too old
|
#error libFLAC is too old
|
||||||
@ -340,7 +336,7 @@ oggflac_decode(Decoder &decoder, struct input_stream *input_stream)
|
|||||||
|
|
||||||
/* rewind the stream, because ogg_codec_detect() has
|
/* rewind the stream, because ogg_codec_detect() has
|
||||||
moved it */
|
moved it */
|
||||||
input_stream->LockSeek(0, SEEK_SET, IgnoreError());
|
input_stream->LockRewind(IgnoreError());
|
||||||
|
|
||||||
flac_decode_internal(decoder, input_stream, true);
|
flac_decode_internal(decoder, input_stream, true);
|
||||||
}
|
}
|
||||||
|
@ -39,7 +39,6 @@
|
|||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
static const opus_int32 opus_sample_rate = 48000;
|
static const opus_int32 opus_sample_rate = 48000;
|
||||||
@ -273,7 +272,7 @@ mpd_opus_stream_decode(Decoder &decoder,
|
|||||||
|
|
||||||
/* rewind the stream, because ogg_codec_detect() has
|
/* rewind the stream, because ogg_codec_detect() has
|
||||||
moved it */
|
moved it */
|
||||||
input_stream->LockSeek(0, SEEK_SET, IgnoreError());
|
input_stream->LockRewind(IgnoreError());
|
||||||
|
|
||||||
MPDOpusDecoder d(decoder, input_stream);
|
MPDOpusDecoder d(decoder, input_stream);
|
||||||
OggSyncState oy(*input_stream, &decoder);
|
OggSyncState oy(*input_stream, &decoder);
|
||||||
|
@ -50,7 +50,6 @@
|
|||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
struct vorbis_input_stream {
|
struct vorbis_input_stream {
|
||||||
Decoder *decoder;
|
Decoder *decoder;
|
||||||
@ -184,7 +183,7 @@ vorbis_stream_decode(Decoder &decoder,
|
|||||||
|
|
||||||
/* rewind the stream, because ogg_codec_detect() has
|
/* rewind the stream, because ogg_codec_detect() has
|
||||||
moved it */
|
moved it */
|
||||||
input_stream->LockSeek(0, SEEK_SET, IgnoreError());
|
input_stream->LockRewind(IgnoreError());
|
||||||
|
|
||||||
struct vorbis_input_stream vis;
|
struct vorbis_input_stream vis;
|
||||||
OggVorbis_File vf;
|
OggVorbis_File vf;
|
||||||
|
Loading…
Reference in New Issue
Block a user