diff --git a/Engine/source/platform/async/asyncPacketStream.h b/Engine/source/platform/async/asyncPacketStream.h index 25f63469e..44b4b661f 100644 --- a/Engine/source/platform/async/asyncPacketStream.h +++ b/Engine/source/platform/async/asyncPacketStream.h @@ -281,9 +281,22 @@ void AsyncPacketBufferedInputStream< Stream, Packet >::_requestNext() IResettable* resettable = dynamic_cast< IResettable* >( s ); if( resettable ) { + IPositionable< U32 >* positionable = dynamic_cast< IPositionable< U32 >* >( &Deref( stream ) ); + U32 pos; + if(positionable) + pos = positionable->getPosition(); + resettable->reset(); isEOS = false; this->mNumRemainingSourceElements = mNumTotalSourceElements; + + if( positionable ) + { + positionable->setPosition(pos); + U32 dur = stream->getDuration(); + if(dur != 0) //avoiding division by zero? not needed, probably + this->mNumRemainingSourceElements -= (U32)(mNumTotalSourceElements*(F32)pos/dur); + } } } else if( isEOS ) diff --git a/Engine/source/sfx/sfxSound.cpp b/Engine/source/sfx/sfxSound.cpp index 683f70cda..6b4895f80 100644 --- a/Engine/source/sfx/sfxSound.cpp +++ b/Engine/source/sfx/sfxSound.cpp @@ -81,6 +81,7 @@ SFXSound::SFXSound( SFXProfile *profile, SFXDescription* desc ) : Parent( profile, desc ), mVoice( NULL ) { + mSetPositionValue = 0; } //----------------------------------------------------------------------------- @@ -411,6 +412,9 @@ void SFXSound::_play() Platform::outputDebugString( "[SFXSound] virtualizing playback of source '%i'", getId() ); #endif } + if(getPosition() != mSetPositionValue) + setPosition(mSetPositionValue); + mSetPositionValue = 0; //Non looping sounds need this to reset. } //----------------------------------------------------------------------------- @@ -421,6 +425,7 @@ void SFXSound::_stop() if( mVoice ) mVoice->stop(); + mSetPositionValue = 0; } //----------------------------------------------------------------------------- @@ -431,6 +436,7 @@ void SFXSound::_pause() if( mVoice ) mVoice->pause(); + mSetPositionValue = getPosition(); } //----------------------------------------------------------------------------- @@ -511,6 +517,8 @@ void SFXSound::_updatePriority() U32 SFXSound::getPosition() const { + if( getLastStatus() == SFXStatusStopped) + return mSetPositionValue; if( mVoice ) return mVoice->getFormat().getDuration( mVoice->getPosition() ); else @@ -522,6 +530,8 @@ U32 SFXSound::getPosition() const void SFXSound::setPosition( U32 ms ) { AssertFatal( ms < getDuration(), "SFXSound::setPosition() - position out of range" ); + mSetPositionValue = ms; + if( mVoice ) mVoice->setPosition( mVoice->getFormat().getSampleCount( ms ) ); else @@ -693,8 +703,9 @@ DefineEngineMethod( SFXSound, setPosition, void, ( F32 position ),, "playback will resume at the given position when play() is called.\n\n" "@param position The new position of the play cursor (in seconds).\n" ) { - if( position >= 0 && position <= object->getDuration() ) - object->setPosition( position * 1000.0f ); + position *= 1000.0f; + if( position >= 0 && position < object->getDuration() ) + object->setPosition( position ); } //----------------------------------------------------------------------------- diff --git a/Engine/source/sfx/sfxSound.h b/Engine/source/sfx/sfxSound.h index 16c8b0b28..364f2ed59 100644 --- a/Engine/source/sfx/sfxSound.h +++ b/Engine/source/sfx/sfxSound.h @@ -81,6 +81,9 @@ class SFXSound : public SFXSource, /// _initBuffer() used for managing virtual sources. U32 mDuration; + ///Used for setPosition (time in miliseconds) + U32 mSetPositionValue; + /// Create a new voice for this source. bool _allocVoice( SFXDevice* device );