mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-22 21:40:42 +00:00
Use the decoder's sample offset for calculating the stream offset
This commit is contained in:
parent
cab68df257
commit
0a5ab977b7
@ -398,6 +398,11 @@ public:
|
|||||||
|
|
||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t getSampleOffset()
|
||||||
|
{
|
||||||
|
return (size_t)(is->audio_clock*is->audio_st->codec->sample_rate);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -117,6 +117,11 @@ void Audiere_Decoder::rewind()
|
|||||||
mSoundSource->reset();
|
mSoundSource->reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t Audiere_Decoder::getSampleOffset()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
Audiere_Decoder::Audiere_Decoder()
|
Audiere_Decoder::Audiere_Decoder()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ namespace MWSound
|
|||||||
|
|
||||||
virtual size_t read(char *buffer, size_t bytes);
|
virtual size_t read(char *buffer, size_t bytes);
|
||||||
virtual void rewind();
|
virtual void rewind();
|
||||||
|
virtual size_t getSampleOffset();
|
||||||
|
|
||||||
Audiere_Decoder& operator=(const Audiere_Decoder &rhs);
|
Audiere_Decoder& operator=(const Audiere_Decoder &rhs);
|
||||||
Audiere_Decoder(const Audiere_Decoder &rhs);
|
Audiere_Decoder(const Audiere_Decoder &rhs);
|
||||||
|
@ -383,7 +383,11 @@ size_t FFmpeg_Decoder::read(char *buffer, size_t bytes)
|
|||||||
if(mStreams.empty())
|
if(mStreams.empty())
|
||||||
fail("No audio streams");
|
fail("No audio streams");
|
||||||
|
|
||||||
return mStreams.front()->readAVAudioData(buffer, bytes);
|
MyStream *stream = mStreams.front();
|
||||||
|
size_t got = stream->readAVAudioData(buffer, bytes);
|
||||||
|
mSamplesRead += got / av_samples_get_buffer_size(NULL, stream->mCodecCtx->channels, 1,
|
||||||
|
stream->mCodecCtx->sample_fmt, 1);
|
||||||
|
return got;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FFmpeg_Decoder::readAll(std::vector<char> &output)
|
void FFmpeg_Decoder::readAll(std::vector<char> &output)
|
||||||
@ -402,9 +406,15 @@ void FFmpeg_Decoder::rewind()
|
|||||||
{
|
{
|
||||||
av_seek_frame(mFormatCtx, -1, 0, 0);
|
av_seek_frame(mFormatCtx, -1, 0, 0);
|
||||||
std::for_each(mStreams.begin(), mStreams.end(), std::mem_fun(&MyStream::clearPackets));
|
std::for_each(mStreams.begin(), mStreams.end(), std::mem_fun(&MyStream::clearPackets));
|
||||||
|
mSamplesRead = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
FFmpeg_Decoder::FFmpeg_Decoder() : mFormatCtx(NULL)
|
size_t FFmpeg_Decoder::getSampleOffset()
|
||||||
|
{
|
||||||
|
return mSamplesRead;
|
||||||
|
}
|
||||||
|
|
||||||
|
FFmpeg_Decoder::FFmpeg_Decoder() : mFormatCtx(NULL), mSamplesRead(0)
|
||||||
{
|
{
|
||||||
static bool done_init = false;
|
static bool done_init = false;
|
||||||
|
|
||||||
|
@ -25,6 +25,7 @@ namespace MWSound
|
|||||||
|
|
||||||
struct MyStream;
|
struct MyStream;
|
||||||
std::vector<MyStream*> mStreams;
|
std::vector<MyStream*> mStreams;
|
||||||
|
size_t mSamplesRead;
|
||||||
|
|
||||||
bool getNextPacket(int streamidx);
|
bool getNextPacket(int streamidx);
|
||||||
|
|
||||||
@ -42,6 +43,7 @@ namespace MWSound
|
|||||||
virtual size_t read(char *buffer, size_t bytes);
|
virtual size_t read(char *buffer, size_t bytes);
|
||||||
virtual void readAll(std::vector<char> &output);
|
virtual void readAll(std::vector<char> &output);
|
||||||
virtual void rewind();
|
virtual void rewind();
|
||||||
|
virtual size_t getSampleOffset();
|
||||||
|
|
||||||
FFmpeg_Decoder& operator=(const FFmpeg_Decoder &rhs);
|
FFmpeg_Decoder& operator=(const FFmpeg_Decoder &rhs);
|
||||||
FFmpeg_Decoder(const FFmpeg_Decoder &rhs);
|
FFmpeg_Decoder(const FFmpeg_Decoder &rhs);
|
||||||
|
@ -218,6 +218,11 @@ void MpgSnd_Decoder::rewind()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t MpgSnd_Decoder::getSampleOffset()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
MpgSnd_Decoder::MpgSnd_Decoder()
|
MpgSnd_Decoder::MpgSnd_Decoder()
|
||||||
: mSndInfo()
|
: mSndInfo()
|
||||||
, mSndFile(NULL)
|
, mSndFile(NULL)
|
||||||
|
@ -39,6 +39,7 @@ namespace MWSound
|
|||||||
virtual size_t read(char *buffer, size_t bytes);
|
virtual size_t read(char *buffer, size_t bytes);
|
||||||
virtual void readAll(std::vector<char> &output);
|
virtual void readAll(std::vector<char> &output);
|
||||||
virtual void rewind();
|
virtual void rewind();
|
||||||
|
virtual size_t getSampleOffset();
|
||||||
|
|
||||||
MpgSnd_Decoder& operator=(const MpgSnd_Decoder &rhs);
|
MpgSnd_Decoder& operator=(const MpgSnd_Decoder &rhs);
|
||||||
MpgSnd_Decoder(const MpgSnd_Decoder &rhs);
|
MpgSnd_Decoder(const MpgSnd_Decoder &rhs);
|
||||||
|
@ -122,7 +122,6 @@ class OpenAL_SoundStream : public Sound
|
|||||||
ALsizei mSampleRate;
|
ALsizei mSampleRate;
|
||||||
ALuint mBufferSize;
|
ALuint mBufferSize;
|
||||||
|
|
||||||
ALuint mSamplesTotal;
|
|
||||||
ALuint mSamplesQueued;
|
ALuint mSamplesQueued;
|
||||||
|
|
||||||
DecoderPtr mDecoder;
|
DecoderPtr mDecoder;
|
||||||
@ -215,8 +214,7 @@ private:
|
|||||||
|
|
||||||
|
|
||||||
OpenAL_SoundStream::OpenAL_SoundStream(OpenAL_Output &output, ALuint src, DecoderPtr decoder)
|
OpenAL_SoundStream::OpenAL_SoundStream(OpenAL_Output &output, ALuint src, DecoderPtr decoder)
|
||||||
: mOutput(output), mSource(src), mSamplesTotal(0), mSamplesQueued(0),
|
: mOutput(output), mSource(src), mSamplesQueued(0), mDecoder(decoder), mIsFinished(true)
|
||||||
mDecoder(decoder), mIsFinished(true)
|
|
||||||
{
|
{
|
||||||
throwALerror();
|
throwALerror();
|
||||||
|
|
||||||
@ -286,7 +284,6 @@ void OpenAL_SoundStream::stop()
|
|||||||
mSamplesQueued = 0;
|
mSamplesQueued = 0;
|
||||||
|
|
||||||
mDecoder->rewind();
|
mDecoder->rewind();
|
||||||
mSamplesTotal = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OpenAL_SoundStream::isPlaying()
|
bool OpenAL_SoundStream::isPlaying()
|
||||||
@ -311,9 +308,9 @@ double OpenAL_SoundStream::getTimeOffset()
|
|||||||
alGetSourcef(mSource, AL_SEC_OFFSET, &offset);
|
alGetSourcef(mSource, AL_SEC_OFFSET, &offset);
|
||||||
alGetSourcei(mSource, AL_SOURCE_STATE, &state);
|
alGetSourcei(mSource, AL_SOURCE_STATE, &state);
|
||||||
if(state == AL_PLAYING || state == AL_PAUSED)
|
if(state == AL_PLAYING || state == AL_PAUSED)
|
||||||
t = (double)(mSamplesTotal - mSamplesQueued)/(double)mSampleRate + offset;
|
t = (double)(mDecoder->getSampleOffset() - mSamplesQueued)/(double)mSampleRate + offset;
|
||||||
else
|
else
|
||||||
t = (double)mSamplesTotal / (double)mSampleRate;
|
t = (double)mDecoder->getSampleOffset() / (double)mSampleRate;
|
||||||
mOutput.mStreamThread->mMutex.unlock();
|
mOutput.mStreamThread->mMutex.unlock();
|
||||||
|
|
||||||
throwALerror();
|
throwALerror();
|
||||||
@ -388,13 +385,11 @@ bool OpenAL_SoundStream::process()
|
|||||||
|
|
||||||
mSamplesQueued -= samples_unqueued;
|
mSamplesQueued -= samples_unqueued;
|
||||||
mSamplesQueued += samples_queued;
|
mSamplesQueued += samples_queued;
|
||||||
mSamplesTotal += samples_queued;
|
|
||||||
mIsFinished = finished;
|
mIsFinished = finished;
|
||||||
}
|
}
|
||||||
catch(std::exception &e) {
|
catch(std::exception &e) {
|
||||||
std::cout<< "Error updating stream \""<<mDecoder->getName()<<"\"" <<std::endl;
|
std::cout<< "Error updating stream \""<<mDecoder->getName()<<"\"" <<std::endl;
|
||||||
mSamplesQueued = 0;
|
mSamplesQueued = 0;
|
||||||
mSamplesTotal = 0;
|
|
||||||
mIsFinished = true;
|
mIsFinished = true;
|
||||||
}
|
}
|
||||||
return !mIsFinished;
|
return !mIsFinished;
|
||||||
|
@ -38,6 +38,7 @@ namespace MWSound
|
|||||||
virtual size_t read(char *buffer, size_t bytes) = 0;
|
virtual size_t read(char *buffer, size_t bytes) = 0;
|
||||||
virtual void readAll(std::vector<char> &output);
|
virtual void readAll(std::vector<char> &output);
|
||||||
virtual void rewind() = 0;
|
virtual void rewind() = 0;
|
||||||
|
virtual size_t getSampleOffset() = 0;
|
||||||
|
|
||||||
Sound_Decoder() : mResourceMgr(Ogre::ResourceGroupManager::getSingleton())
|
Sound_Decoder() : mResourceMgr(Ogre::ResourceGroupManager::getSingleton())
|
||||||
{ }
|
{ }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user