Merge pull request #2220 from irei1as/development

Changes for SFXSound::setPosition(time)
This commit is contained in:
Areloch 2019-03-30 18:42:19 -05:00 committed by GitHub
commit b6185370be
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 2 deletions

View file

@ -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 )

View file

@ -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 );
}
//-----------------------------------------------------------------------------

View file

@ -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 );