From 07b93dcf8084bcae92fa1f33652723ca9c990db2 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 22 May 2014 10:10:16 +0200 Subject: InputStream: make Seek() always absolute Remove the "whence" parameter that is not actually necessary, and only complicates the InputStream implementations. --- src/archive/plugins/ZzipArchivePlugin.cxx | 6 ++--- src/decoder/plugins/AudiofileDecoderPlugin.cxx | 10 +++++--- src/decoder/plugins/DsdLib.cxx | 6 ++--- src/decoder/plugins/FaadDecoderPlugin.cxx | 2 +- src/decoder/plugins/FfmpegDecoderPlugin.cxx | 23 +++++++++++++++-- src/decoder/plugins/FlacIOHandle.cxx | 25 ++++++++++++++++--- src/decoder/plugins/FlacInput.cxx | 2 +- src/decoder/plugins/MadDecoderPlugin.cxx | 2 +- src/decoder/plugins/MpcdecDecoderPlugin.cxx | 2 +- src/decoder/plugins/OggFind.cxx | 13 +++++----- src/decoder/plugins/OggFind.hxx | 2 +- src/decoder/plugins/OpusDecoderPlugin.cxx | 4 +-- src/decoder/plugins/PcmDecoderPlugin.cxx | 3 +-- src/decoder/plugins/SndfileDecoderPlugin.cxx | 24 ++++++++++++++++-- src/decoder/plugins/VorbisDecoderPlugin.cxx | 34 +++++++++++++++++++++----- src/decoder/plugins/WavpackDecoderPlugin.cxx | 26 ++++++++++++++++++-- src/input/InputStream.cxx | 19 +++----------- src/input/InputStream.hxx | 16 +++++++----- src/input/ProxyInputStream.cxx | 4 +-- src/input/ProxyInputStream.hxx | 2 +- src/input/plugins/CdioParanoiaInputPlugin.cxx | 17 ++----------- src/input/plugins/CurlInputPlugin.cxx | 27 +++----------------- src/input/plugins/FfmpegInputPlugin.cxx | 6 ++--- src/input/plugins/FileInputPlugin.cxx | 8 +++--- src/input/plugins/NfsInputPlugin.cxx | 6 ++--- src/input/plugins/RewindInputPlugin.cxx | 9 +++---- src/input/plugins/SmbclientInputPlugin.cxx | 7 +++--- test/test_rewind.cxx | 6 ++--- 28 files changed, 184 insertions(+), 127 deletions(-) diff --git a/src/archive/plugins/ZzipArchivePlugin.cxx b/src/archive/plugins/ZzipArchivePlugin.cxx index 436ebc793..396055c71 100644 --- a/src/archive/plugins/ZzipArchivePlugin.cxx +++ b/src/archive/plugins/ZzipArchivePlugin.cxx @@ -125,7 +125,7 @@ struct ZzipInputStream final : public InputStream { /* virtual methods from InputStream */ bool IsEOF() override; size_t Read(void *ptr, size_t size, Error &error) override; - bool Seek(offset_type offset, int whence, Error &error) override; + bool Seek(offset_type offset, Error &error) override; }; InputStream * @@ -165,9 +165,9 @@ ZzipInputStream::IsEOF() } bool -ZzipInputStream::Seek(offset_type new_offset, int whence, Error &error) +ZzipInputStream::Seek(offset_type new_offset, Error &error) { - zzip_off_t ofs = zzip_seek(file, new_offset, whence); + zzip_off_t ofs = zzip_seek(file, new_offset, SEEK_SET); if (ofs != -1) { error.Set(zzip_domain, "zzip_seek() has failed"); offset = ofs; diff --git a/src/decoder/plugins/AudiofileDecoderPlugin.cxx b/src/decoder/plugins/AudiofileDecoderPlugin.cxx index 262c4a5bf..a3f0ee380 100644 --- a/src/decoder/plugins/AudiofileDecoderPlugin.cxx +++ b/src/decoder/plugins/AudiofileDecoderPlugin.cxx @@ -92,13 +92,17 @@ audiofile_file_destroy(AFvirtualfile *vfile) } static AFfileoffset -audiofile_file_seek(AFvirtualfile *vfile, AFfileoffset offset, int is_relative) +audiofile_file_seek(AFvirtualfile *vfile, AFfileoffset _offset, + int is_relative) { InputStream &is = *(InputStream *)vfile->closure; - int whence = (is_relative ? SEEK_CUR : SEEK_SET); + + InputStream::offset_type offset = _offset; + if (is_relative) + offset += is.GetOffset(); Error error; - if (is.LockSeek(offset, whence, error)) { + if (is.LockSeek(offset, IgnoreError())) { return is.GetOffset(); } else { return -1; diff --git a/src/decoder/plugins/DsdLib.cxx b/src/decoder/plugins/DsdLib.cxx index f77d8f59a..2bd532a05 100644 --- a/src/decoder/plugins/DsdLib.cxx +++ b/src/decoder/plugins/DsdLib.cxx @@ -30,9 +30,7 @@ #include "tag/TagId3.hxx" #include "util/Error.hxx" -#include #include -#include /* for SEEK_SET, SEEK_CUR */ #ifdef HAVE_ID3TAG #include @@ -63,7 +61,7 @@ dsdlib_skip_to(Decoder *decoder, InputStream &is, int64_t offset) { if (is.IsSeekable()) - return is.Seek(offset, SEEK_SET, IgnoreError()); + return is.Seek(offset, IgnoreError()); if (is.GetOffset() > offset) return false; @@ -96,7 +94,7 @@ dsdlib_skip(Decoder *decoder, InputStream &is, return true; if (is.IsSeekable()) - return is.Seek(delta, SEEK_CUR, IgnoreError()); + return is.Seek(is.GetOffset() + delta, IgnoreError()); char buffer[8192]; while (delta > 0) { diff --git a/src/decoder/plugins/FaadDecoderPlugin.cxx b/src/decoder/plugins/FaadDecoderPlugin.cxx index e80665d24..c7f72da15 100644 --- a/src/decoder/plugins/FaadDecoderPlugin.cxx +++ b/src/decoder/plugins/FaadDecoderPlugin.cxx @@ -186,7 +186,7 @@ faad_song_duration(DecoderBuffer *buffer, InputStream &is) /* obtain the duration from the ADTS header */ float song_length = adts_song_duration(buffer); - is.LockSeek(tagsize, SEEK_SET, IgnoreError()); + is.LockSeek(tagsize, IgnoreError()); decoder_buffer_clear(buffer); decoder_buffer_fill(buffer); diff --git a/src/decoder/plugins/FfmpegDecoderPlugin.cxx b/src/decoder/plugins/FfmpegDecoderPlugin.cxx index 22a42477d..9139a622b 100644 --- a/src/decoder/plugins/FfmpegDecoderPlugin.cxx +++ b/src/decoder/plugins/FfmpegDecoderPlugin.cxx @@ -120,10 +120,29 @@ mpd_ffmpeg_stream_seek(void *opaque, int64_t pos, int whence) { AvioStream *stream = (AvioStream *)opaque; - if (whence == AVSEEK_SIZE) + switch (whence) { + case SEEK_SET: + break; + + case SEEK_CUR: + pos += stream->input.GetOffset(); + break; + + case SEEK_END: + if (!stream->input.KnownSize()) + return -1; + + pos += stream->input.GetSize(); + break; + + case AVSEEK_SIZE: return stream->input.GetSize(); - if (!stream->input.LockSeek(pos, whence, IgnoreError())) + default: + return -1; + } + + if (!stream->input.LockSeek(pos, IgnoreError())) return -1; return stream->input.GetOffset(); diff --git a/src/decoder/plugins/FlacIOHandle.cxx b/src/decoder/plugins/FlacIOHandle.cxx index 6444e02cf..b5f9f5ec0 100644 --- a/src/decoder/plugins/FlacIOHandle.cxx +++ b/src/decoder/plugins/FlacIOHandle.cxx @@ -62,12 +62,31 @@ FlacIORead(void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle) } static int -FlacIOSeek(FLAC__IOHandle handle, FLAC__int64 offset, int whence) +FlacIOSeek(FLAC__IOHandle handle, FLAC__int64 _offset, int whence) { InputStream *is = (InputStream *)handle; - Error error; - return is->LockSeek(offset, whence, error) ? 0 : -1; + InputStream::offset_type offset = _offset; + switch (whence) { + case SEEK_SET: + break; + + case SEEK_CUR: + offset += is->GetOffset(); + break; + + case SEEK_END: + if (!is->KnownSize()) + return -1; + + offset += is->GetSize(); + break; + + default: + return -1; + } + + return is->LockSeek(offset, IgnoreError()) ? 0 : -1; } static FLAC__int64 diff --git a/src/decoder/plugins/FlacInput.cxx b/src/decoder/plugins/FlacInput.cxx index d7fc72025..5b4c3104d 100644 --- a/src/decoder/plugins/FlacInput.cxx +++ b/src/decoder/plugins/FlacInput.cxx @@ -51,7 +51,7 @@ FlacInput::Seek(FLAC__uint64 absolute_byte_offset) return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED; ::Error error; - if (!input_stream.LockSeek(absolute_byte_offset, SEEK_SET, error)) { + if (!input_stream.LockSeek(absolute_byte_offset, error)) { LogError(error); return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; } diff --git a/src/decoder/plugins/MadDecoderPlugin.cxx b/src/decoder/plugins/MadDecoderPlugin.cxx index ffd63a2ac..886aa1795 100644 --- a/src/decoder/plugins/MadDecoderPlugin.cxx +++ b/src/decoder/plugins/MadDecoderPlugin.cxx @@ -208,7 +208,7 @@ inline bool MadDecoder::Seek(long offset) { Error error; - if (!input_stream.LockSeek(offset, SEEK_SET, error)) + if (!input_stream.LockSeek(offset, error)) return false; mad_stream_buffer(&stream, input_buffer, 0); diff --git a/src/decoder/plugins/MpcdecDecoderPlugin.cxx b/src/decoder/plugins/MpcdecDecoderPlugin.cxx index 18f6e7673..f86cb3c81 100644 --- a/src/decoder/plugins/MpcdecDecoderPlugin.cxx +++ b/src/decoder/plugins/MpcdecDecoderPlugin.cxx @@ -57,7 +57,7 @@ mpc_seek_cb(mpc_reader *reader, mpc_int32_t offset) struct mpc_decoder_data *data = (struct mpc_decoder_data *)reader->data; - return data->is.LockSeek(offset, SEEK_SET, IgnoreError()); + return data->is.LockSeek(offset, IgnoreError()); } static mpc_int32_t diff --git a/src/decoder/plugins/OggFind.cxx b/src/decoder/plugins/OggFind.cxx index d7a3dc04a..15e9c5c92 100644 --- a/src/decoder/plugins/OggFind.cxx +++ b/src/decoder/plugins/OggFind.cxx @@ -22,8 +22,6 @@ #include "OggSyncState.hxx" #include "util/Error.hxx" -#include - bool OggFindEOS(OggSyncState &oy, ogg_stream_state &os, ogg_packet &packet) { @@ -41,7 +39,7 @@ OggFindEOS(OggSyncState &oy, ogg_stream_state &os, ogg_packet &packet) bool OggSeekPageAtOffset(OggSyncState &oy, ogg_stream_state &os, InputStream &is, - InputStream::offset_type offset, int whence) + InputStream::offset_type offset) { oy.Reset(); @@ -49,7 +47,7 @@ OggSeekPageAtOffset(OggSyncState &oy, ogg_stream_state &os, InputStream &is, data */ ogg_stream_reset(&os); - return is.LockSeek(offset, whence, IgnoreError()) && + return is.LockSeek(offset, IgnoreError()) && oy.ExpectPageSeekIn(os); } @@ -57,12 +55,15 @@ bool OggSeekFindEOS(OggSyncState &oy, ogg_stream_state &os, ogg_packet &packet, InputStream &is) { - if (is.KnownSize() && is.GetRest() < 65536) + if (!is.KnownSize()) + return false; + + if (is.GetRest() < 65536) return OggFindEOS(oy, os, packet); if (!is.CheapSeeking()) return false; - return OggSeekPageAtOffset(oy, os, is, -65536, SEEK_END) && + return OggSeekPageAtOffset(oy, os, is, is.GetSize() - 65536) && OggFindEOS(oy, os, packet); } diff --git a/src/decoder/plugins/OggFind.hxx b/src/decoder/plugins/OggFind.hxx index d93b87505..8ced7fd86 100644 --- a/src/decoder/plugins/OggFind.hxx +++ b/src/decoder/plugins/OggFind.hxx @@ -41,7 +41,7 @@ OggFindEOS(OggSyncState &oy, ogg_stream_state &os, ogg_packet &packet); */ bool OggSeekPageAtOffset(OggSyncState &oy, ogg_stream_state &os, InputStream &is, - InputStream::offset_type offset, int whence); + InputStream::offset_type offset); /** * Try to find the end-of-stream (EOS) packet. Seek to the end of the diff --git a/src/decoder/plugins/OpusDecoderPlugin.cxx b/src/decoder/plugins/OpusDecoderPlugin.cxx index 983d17278..27c559272 100644 --- a/src/decoder/plugins/OpusDecoderPlugin.cxx +++ b/src/decoder/plugins/OpusDecoderPlugin.cxx @@ -199,7 +199,7 @@ LoadEOSPacket(InputStream &is, Decoder *decoder, int serialno, ogg_stream_clear(&os); /* restore the previous file position */ - is.Seek(old_offset, SEEK_SET, IgnoreError()); + is.Seek(old_offset, IgnoreError()); return result; } @@ -344,7 +344,7 @@ MPDOpusDecoder::Seek(OggSyncState &oy, double where_s) InputStream::offset_type offset(where_granulepos * input_stream.GetSize() / eos_granulepos); - if (!OggSeekPageAtOffset(oy, os, input_stream, offset, SEEK_SET)) + if (!OggSeekPageAtOffset(oy, os, input_stream, offset)) return false; decoder_timestamp(decoder, where_s); diff --git a/src/decoder/plugins/PcmDecoderPlugin.cxx b/src/decoder/plugins/PcmDecoderPlugin.cxx index e7e593550..3b9c60691 100644 --- a/src/decoder/plugins/PcmDecoderPlugin.cxx +++ b/src/decoder/plugins/PcmDecoderPlugin.cxx @@ -26,7 +26,6 @@ #include "Log.hxx" #include -#include /* for SEEK_SET */ static void pcm_stream_decode(Decoder &decoder, InputStream &is) @@ -76,7 +75,7 @@ pcm_stream_decode(Decoder &decoder, InputStream &is) decoder_seek_where(decoder)); Error error; - if (is.LockSeek(offset, SEEK_SET, error)) { + if (is.LockSeek(offset, error)) { decoder_command_finished(decoder); } else { LogError(error); diff --git a/src/decoder/plugins/SndfileDecoderPlugin.cxx b/src/decoder/plugins/SndfileDecoderPlugin.cxx index 6d9e0d31e..cf3aa61d5 100644 --- a/src/decoder/plugins/SndfileDecoderPlugin.cxx +++ b/src/decoder/plugins/SndfileDecoderPlugin.cxx @@ -41,11 +41,31 @@ sndfile_vio_get_filelen(void *user_data) } static sf_count_t -sndfile_vio_seek(sf_count_t offset, int whence, void *user_data) +sndfile_vio_seek(sf_count_t _offset, int whence, void *user_data) { InputStream &is = *(InputStream *)user_data; - if (!is.LockSeek(offset, whence, IgnoreError())) + InputStream::offset_type offset = _offset; + switch (whence) { + case SEEK_SET: + break; + + case SEEK_CUR: + offset += is.GetOffset(); + break; + + case SEEK_END: + if (!is.KnownSize()) + return -1; + + offset += is.GetSize(); + break; + + default: + return -1; + } + + if (!is.LockSeek(offset, IgnoreError())) return -1; return is.GetOffset(); diff --git a/src/decoder/plugins/VorbisDecoderPlugin.cxx b/src/decoder/plugins/VorbisDecoderPlugin.cxx index 4fe44e9e8..72542e3a2 100644 --- a/src/decoder/plugins/VorbisDecoderPlugin.cxx +++ b/src/decoder/plugins/VorbisDecoderPlugin.cxx @@ -70,15 +70,37 @@ static size_t ogg_read_cb(void *ptr, size_t size, size_t nmemb, void *data) return ret / size; } -static int ogg_seek_cb(void *data, ogg_int64_t offset, int whence) +static int ogg_seek_cb(void *data, ogg_int64_t _offset, int whence) { VorbisInputStream *vis = (VorbisInputStream *)data; + InputStream &is = vis->input_stream; - Error error; - return vis->seekable && - (vis->decoder == nullptr || - decoder_get_command(*vis->decoder) != DecoderCommand::STOP) && - vis->input_stream.LockSeek(offset, whence, error) + if (!vis->seekable || + (vis->decoder != nullptr && + decoder_get_command(*vis->decoder) == DecoderCommand::STOP)) + return -1; + + InputStream::offset_type offset = _offset; + switch (whence) { + case SEEK_SET: + break; + + case SEEK_CUR: + offset += is.GetOffset(); + break; + + case SEEK_END: + if (!is.KnownSize()) + return -1; + + offset += is.GetSize(); + break; + + default: + return -1; + } + + return is.LockSeek(offset, IgnoreError()) ? 0 : -1; } diff --git a/src/decoder/plugins/WavpackDecoderPlugin.cxx b/src/decoder/plugins/WavpackDecoderPlugin.cxx index 9d65775c1..2f60090c1 100644 --- a/src/decoder/plugins/WavpackDecoderPlugin.cxx +++ b/src/decoder/plugins/WavpackDecoderPlugin.cxx @@ -392,13 +392,35 @@ wavpack_input_get_pos(void *id) static int wavpack_input_set_pos_abs(void *id, uint32_t pos) { - return wpin(id)->is.LockSeek(pos, SEEK_SET, IgnoreError()) ? 0 : -1; + return wpin(id)->is.LockSeek(pos, IgnoreError()) ? 0 : -1; } static int wavpack_input_set_pos_rel(void *id, int32_t delta, int mode) { - return wpin(id)->is.LockSeek(delta, mode, IgnoreError()) ? 0 : -1; + InputStream &is = wpin(id)->is; + + InputStream::offset_type offset = delta; + switch (mode) { + case SEEK_SET: + break; + + case SEEK_CUR: + offset += is.GetOffset(); + break; + + case SEEK_END: + if (!is.KnownSize()) + return -1; + + offset += is.GetSize(); + break; + + default: + return -1; + } + + return is.LockSeek(offset, IgnoreError()) ? 0 : -1; } static int diff --git a/src/input/InputStream.cxx b/src/input/InputStream.cxx index e7307540d..657b9df09 100644 --- a/src/input/InputStream.cxx +++ b/src/input/InputStream.cxx @@ -23,7 +23,6 @@ #include "util/UriUtil.hxx" #include -#include /* for SEEK_SET */ InputStream::~InputStream() { @@ -75,29 +74,17 @@ InputStream::CheapSeeking() const } bool -InputStream::Seek(gcc_unused offset_type new_offset, gcc_unused int whence, +InputStream::Seek(gcc_unused offset_type new_offset, gcc_unused Error &error) { return false; } bool -InputStream::LockSeek(offset_type _offset, int whence, Error &error) +InputStream::LockSeek(offset_type _offset, Error &error) { const ScopeLock protect(mutex); - return Seek(_offset, whence, error); -} - -bool -InputStream::Rewind(Error &error) -{ - return Seek(0, SEEK_SET, error); -} - -bool -InputStream::LockRewind(Error &error) -{ - return LockSeek(0, SEEK_SET, error); + return Seek(_offset, error); } Tag * diff --git a/src/input/InputStream.hxx b/src/input/InputStream.hxx index 5f754940b..25e99de3d 100644 --- a/src/input/InputStream.hxx +++ b/src/input/InputStream.hxx @@ -275,22 +275,26 @@ public: * The caller must lock the mutex. * * @param offset the relative offset - * @param whence the base of the seek, one of SEEK_SET, SEEK_CUR, SEEK_END */ - virtual bool Seek(offset_type offset, int whence, Error &error); + virtual bool Seek(offset_type offset, Error &error); /** * Wrapper for Seek() which locks and unlocks the mutex; the * caller must not be holding it already. */ - bool LockSeek(offset_type offset, int whence, Error &error); + bool LockSeek(offset_type offset, Error &error); /** * Rewind to the beginning of the stream. This is a wrapper - * for Seek(0, SEEK_SET, error). + * for Seek(0, error). */ - bool Rewind(Error &error); - bool LockRewind(Error &error); + bool Rewind(Error &error) { + return Seek(0, error); + } + + bool LockRewind(Error &error) { + return LockSeek(0, error); + } /** * Returns true if the stream has reached end-of-file. diff --git a/src/input/ProxyInputStream.cxx b/src/input/ProxyInputStream.cxx index 7b6e9f937..d65fb5df1 100644 --- a/src/input/ProxyInputStream.cxx +++ b/src/input/ProxyInputStream.cxx @@ -63,9 +63,9 @@ ProxyInputStream::Update() } bool -ProxyInputStream::Seek(offset_type new_offset, int whence, Error &error) +ProxyInputStream::Seek(offset_type new_offset, Error &error) { - bool success = input.Seek(new_offset, whence, error); + bool success = input.Seek(new_offset, error); CopyAttributes(); return success; } diff --git a/src/input/ProxyInputStream.hxx b/src/input/ProxyInputStream.hxx index b2049fbc0..727ae5917 100644 --- a/src/input/ProxyInputStream.hxx +++ b/src/input/ProxyInputStream.hxx @@ -45,7 +45,7 @@ public: /* virtual methods from InputStream */ bool Check(Error &error) override; void Update() override; - bool Seek(offset_type new_offset, int whence, Error &error) override; + bool Seek(offset_type new_offset, Error &error) override; bool IsEOF() override; Tag *ReadTag() override; bool IsAvailable() override; diff --git a/src/input/plugins/CdioParanoiaInputPlugin.cxx b/src/input/plugins/CdioParanoiaInputPlugin.cxx index 534084e0d..6f1ea976a 100644 --- a/src/input/plugins/CdioParanoiaInputPlugin.cxx +++ b/src/input/plugins/CdioParanoiaInputPlugin.cxx @@ -99,7 +99,7 @@ class CdioParanoiaInputStream final : public InputStream { /* virtual methods from InputStream */ bool IsEOF() override; size_t Read(void *ptr, size_t size, Error &error) override; - bool Seek(offset_type offset, int whence, Error &error) override; + bool Seek(offset_type offset, Error &error) override; }; static constexpr Domain cdio_domain("cdio"); @@ -272,21 +272,8 @@ input_cdio_open(const char *uri, } bool -CdioParanoiaInputStream::Seek(InputPlugin::offset_type new_offset, - int whence, Error &error) +CdioParanoiaInputStream::Seek(offset_type new_offset, Error &error) { - /* calculate absolute offset */ - switch (whence) { - case SEEK_SET: - break; - case SEEK_CUR: - new_offset += offset; - break; - case SEEK_END: - new_offset += size; - break; - } - if (new_offset < 0 || new_offset > size) { error.Format(cdio_domain, "Invalid offset to seek %ld (%ld)", (long int)new_offset, (long int)size); diff --git a/src/input/plugins/CurlInputPlugin.cxx b/src/input/plugins/CurlInputPlugin.cxx index dc26e0aa2..e464a3ce0 100644 --- a/src/input/plugins/CurlInputPlugin.cxx +++ b/src/input/plugins/CurlInputPlugin.cxx @@ -175,7 +175,7 @@ struct CurlInputStream final : public InputStream { } size_t Read(void *ptr, size_t size, Error &error) override; - bool Seek(offset_type offset, int whence, Error &error) override; + bool Seek(offset_type offset, Error &error) override; }; class CurlMulti; @@ -887,12 +887,11 @@ CurlInputStream::InitEasy(Error &error) } inline bool -CurlInputStream::Seek(InputPlugin::offset_type new_offset, int whence, - Error &error) +CurlInputStream::Seek(offset_type new_offset, Error &error) { assert(IsReady()); - if (whence == SEEK_SET && new_offset == offset) + if (new_offset == offset) /* no-op */ return true; @@ -901,26 +900,6 @@ CurlInputStream::Seek(InputPlugin::offset_type new_offset, int whence, /* calculate the absolute offset */ - switch (whence) { - case SEEK_SET: - break; - - case SEEK_CUR: - new_offset += offset; - break; - - case SEEK_END: - if (size < 0) - /* stream size is not known */ - return false; - - new_offset += size; - break; - - default: - return false; - } - if (new_offset < 0) return false; diff --git a/src/input/plugins/FfmpegInputPlugin.cxx b/src/input/plugins/FfmpegInputPlugin.cxx index 9ae07dbef..6e0260aee 100644 --- a/src/input/plugins/FfmpegInputPlugin.cxx +++ b/src/input/plugins/FfmpegInputPlugin.cxx @@ -60,7 +60,7 @@ struct FfmpegInputStream final : public InputStream { /* virtual methods from InputStream */ bool IsEOF() override; size_t Read(void *ptr, size_t size, Error &error) override; - bool Seek(offset_type offset, int whence, Error &error) override; + bool Seek(offset_type offset, Error &error) override; }; static constexpr Domain ffmpeg_domain("ffmpeg"); @@ -134,9 +134,9 @@ FfmpegInputStream::IsEOF() } bool -FfmpegInputStream::Seek(offset_type new_offset, int whence, Error &error) +FfmpegInputStream::Seek(offset_type new_offset, Error &error) { - int64_t ret = avio_seek(h, new_offset, whence); + int64_t ret = avio_seek(h, new_offset, SEEK_SET); if (ret >= 0) { eof = false; diff --git a/src/input/plugins/FileInputPlugin.cxx b/src/input/plugins/FileInputPlugin.cxx index 1035973b6..60c316567 100644 --- a/src/input/plugins/FileInputPlugin.cxx +++ b/src/input/plugins/FileInputPlugin.cxx @@ -56,7 +56,7 @@ struct FileInputStream final : public InputStream { } size_t Read(void *ptr, size_t size, Error &error) override; - bool Seek(offset_type offset, int whence, Error &error) override; + bool Seek(offset_type offset, Error &error) override; }; static InputStream * @@ -99,11 +99,9 @@ input_file_open(const char *filename, } bool -FileInputStream::Seek(InputPlugin::offset_type new_offset, int whence, - Error &error) +FileInputStream::Seek(offset_type new_offset, Error &error) { - new_offset = (InputPlugin::offset_type)lseek(fd, (off_t)new_offset, - whence); + new_offset = (offset_type)lseek(fd, (off_t)new_offset, SEEK_SET); if (new_offset < 0) { error.SetErrno("Failed to seek"); return false; diff --git a/src/input/plugins/NfsInputPlugin.cxx b/src/input/plugins/NfsInputPlugin.cxx index b73389662..c90f00257 100644 --- a/src/input/plugins/NfsInputPlugin.cxx +++ b/src/input/plugins/NfsInputPlugin.cxx @@ -61,7 +61,7 @@ public: } size_t Read(void *ptr, size_t size, Error &error) override; - bool Seek(offset_type offset, int whence, Error &error) override; + bool Seek(offset_type offset, Error &error) override; }; size_t @@ -77,10 +77,10 @@ NfsInputStream::Read(void *ptr, size_t read_size, Error &error) } bool -NfsInputStream::Seek(offset_type new_offset, int whence, Error &error) +NfsInputStream::Seek(offset_type new_offset, Error &error) { uint64_t current_offset; - int result = nfs_lseek(ctx, fh, new_offset, whence, + int result = nfs_lseek(ctx, fh, new_offset, SEEK_SET, ¤t_offset); if (result < 0) { error.SetErrno(-result, "smbc_lseek() failed"); diff --git a/src/input/plugins/RewindInputPlugin.cxx b/src/input/plugins/RewindInputPlugin.cxx index c18799c64..95f604044 100644 --- a/src/input/plugins/RewindInputPlugin.cxx +++ b/src/input/plugins/RewindInputPlugin.cxx @@ -64,7 +64,7 @@ public: } size_t Read(void *ptr, size_t size, Error &error) override; - bool Seek(offset_type offset, int whence, Error &error) override; + bool Seek(offset_type offset, Error &error) override; private: /** @@ -117,13 +117,12 @@ RewindInputStream::Read(void *ptr, size_t read_size, Error &error) } bool -RewindInputStream::Seek(offset_type new_offset, int whence, +RewindInputStream::Seek(offset_type new_offset, Error &error) { assert(IsReady()); - if (whence == SEEK_SET && tail > 0 && - new_offset <= (offset_type)tail) { + if (tail > 0 && new_offset <= (offset_type)tail) { /* buffered seek */ assert(!ReadingFromBuffer() || @@ -139,7 +138,7 @@ RewindInputStream::Seek(offset_type new_offset, int whence, buffered range now */ tail = 0; - return ProxyInputStream::Seek(new_offset, whence, error); + return ProxyInputStream::Seek(new_offset, error); } } diff --git a/src/input/plugins/SmbclientInputPlugin.cxx b/src/input/plugins/SmbclientInputPlugin.cxx index aa1ba0381..79987180f 100644 --- a/src/input/plugins/SmbclientInputPlugin.cxx +++ b/src/input/plugins/SmbclientInputPlugin.cxx @@ -57,7 +57,7 @@ public: } size_t Read(void *ptr, size_t size, Error &error) override; - bool Seek(offset_type offset, int whence, Error &error) override; + bool Seek(offset_type offset, Error &error) override; }; /* @@ -136,11 +136,10 @@ SmbclientInputStream::Read(void *ptr, size_t read_size, Error &error) } bool -SmbclientInputStream::Seek(InputStream::offset_type new_offset, - int whence, Error &error) +SmbclientInputStream::Seek(offset_type new_offset, Error &error) { smbclient_mutex.lock(); - off_t result = smbc_lseek(fd, new_offset, whence); + off_t result = smbc_lseek(fd, new_offset, SEEK_SET); smbclient_mutex.unlock(); if (result < 0) { error.SetErrno("smbc_lseek() failed"); diff --git a/test/test_rewind.cxx b/test/test_rewind.cxx index c429ee474..fa59b60d7 100644 --- a/test/test_rewind.cxx +++ b/test/test_rewind.cxx @@ -92,7 +92,7 @@ public: ris->GetOffset()); CPPUNIT_ASSERT(!ris->IsEOF()); - CPPUNIT_ASSERT(ris->Seek(1, SEEK_SET, error)); + CPPUNIT_ASSERT(ris->Seek(1, error)); CPPUNIT_ASSERT_EQUAL(InputStream::offset_type(1), ris->GetOffset()); CPPUNIT_ASSERT(!ris->IsEOF()); @@ -105,7 +105,7 @@ public: ris->GetOffset()); CPPUNIT_ASSERT(!ris->IsEOF()); - CPPUNIT_ASSERT(ris->Seek(0, SEEK_SET, error)); + CPPUNIT_ASSERT(ris->Seek(0, error)); CPPUNIT_ASSERT_EQUAL(InputStream::offset_type(0), ris->GetOffset()); CPPUNIT_ASSERT(!ris->IsEOF()); @@ -135,7 +135,7 @@ public: ris->GetOffset()); CPPUNIT_ASSERT(ris->IsEOF()); - CPPUNIT_ASSERT(ris->Seek(3, SEEK_SET, error)); + CPPUNIT_ASSERT(ris->Seek(3, error)); CPPUNIT_ASSERT_EQUAL(InputStream::offset_type(3), ris->GetOffset()); CPPUNIT_ASSERT(!ris->IsEOF()); -- cgit v1.2.3