From db46bf39b33f4271bebab20e0a34f917c668fef6 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Mon, 19 Mar 2012 08:48:25 -0700 Subject: [PATCH] Add a rewind method to the sound decoder --- apps/openmw/mwsound/ffmpeg_decoder.cpp | 4 ++++ apps/openmw/mwsound/ffmpeg_decoder.hpp | 2 ++ apps/openmw/mwsound/mpgsnd_decoder.cpp | 17 +++++++++++++++++ apps/openmw/mwsound/mpgsnd_decoder.hpp | 2 ++ apps/openmw/mwsound/openal_output.cpp | 3 ++- apps/openmw/mwsound/sound_decoder.hpp | 2 ++ 6 files changed, 29 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwsound/ffmpeg_decoder.cpp b/apps/openmw/mwsound/ffmpeg_decoder.cpp index 2b84439c0..cb14df946 100644 --- a/apps/openmw/mwsound/ffmpeg_decoder.cpp +++ b/apps/openmw/mwsound/ffmpeg_decoder.cpp @@ -29,6 +29,10 @@ size_t FFmpeg_Decoder::read(char *buffer, size_t bytes) return 0; } +void FFmpeg_Decoder::rewind() +{ + fail("Not currently working"); +} FFmpeg_Decoder::FFmpeg_Decoder() { diff --git a/apps/openmw/mwsound/ffmpeg_decoder.hpp b/apps/openmw/mwsound/ffmpeg_decoder.hpp index 676a576da..f622b115e 100644 --- a/apps/openmw/mwsound/ffmpeg_decoder.hpp +++ b/apps/openmw/mwsound/ffmpeg_decoder.hpp @@ -20,7 +20,9 @@ namespace MWSound virtual void close(); virtual void getInfo(int *samplerate, ChannelConfig *chans, SampleType *type); + virtual size_t read(char *buffer, size_t bytes); + virtual void rewind(); FFmpeg_Decoder(); virtual ~FFmpeg_Decoder(); diff --git a/apps/openmw/mwsound/mpgsnd_decoder.cpp b/apps/openmw/mwsound/mpgsnd_decoder.cpp index e112d30b1..1c13b5b1a 100644 --- a/apps/openmw/mwsound/mpgsnd_decoder.cpp +++ b/apps/openmw/mwsound/mpgsnd_decoder.cpp @@ -109,6 +109,23 @@ size_t MpgSnd_Decoder::read(char *buffer, size_t bytes) return got; } +void MpgSnd_Decoder::rewind() +{ + if(!mSndFile && !mMpgFile) + fail("No open file"); + + if(mSndFile) + { + if(sf_seek(mSndFile, 0, SEEK_SET) == -1) + fail("seek failed"); + } + else if(mMpgFile) + { + if(mpg123_seek(mMpgFile, 0, SEEK_SET) < 0) + fail("seek failed"); + } +} + MpgSnd_Decoder::MpgSnd_Decoder() : mSndFile(NULL), mMpgFile(NULL) { static bool initdone = false; diff --git a/apps/openmw/mwsound/mpgsnd_decoder.hpp b/apps/openmw/mwsound/mpgsnd_decoder.hpp index 4d3c7f4ab..19a6079b8 100644 --- a/apps/openmw/mwsound/mpgsnd_decoder.hpp +++ b/apps/openmw/mwsound/mpgsnd_decoder.hpp @@ -23,7 +23,9 @@ namespace MWSound virtual void close(); virtual void getInfo(int *samplerate, ChannelConfig *chans, SampleType *type); + virtual size_t read(char *buffer, size_t bytes); + virtual void rewind(); MpgSnd_Decoder(); public: diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index f3cc261a4..084c269dd 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -225,7 +225,8 @@ void OpenAL_SoundStream::stop() alSourceStop(mSource); alSourcei(mSource, AL_BUFFER, 0); throwALerror(); - // FIXME: Rewind decoder + + mDecoder->rewind(); } bool OpenAL_SoundStream::isPlaying() diff --git a/apps/openmw/mwsound/sound_decoder.hpp b/apps/openmw/mwsound/sound_decoder.hpp index 2b16eaeee..5abd4371d 100644 --- a/apps/openmw/mwsound/sound_decoder.hpp +++ b/apps/openmw/mwsound/sound_decoder.hpp @@ -27,7 +27,9 @@ namespace MWSound virtual void close() = 0; virtual void getInfo(int *samplerate, ChannelConfig *chans, SampleType *type) = 0; + virtual size_t read(char *buffer, size_t bytes) = 0; + virtual void rewind() = 0; virtual ~Sound_Decoder() { }