mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-19 20:24:49 +00:00
Merge pull request #2220 from irei1as/development
Changes for SFXSound::setPosition(time)
This commit is contained in:
commit
1ec048f41d
|
|
@ -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 )
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue