Add some extra checks, ref #254

This commit is contained in:
kaetemi 2015-11-15 12:21:14 +01:00
parent 7179e254d0
commit fc8e07c791
2 changed files with 9 additions and 3 deletions

View file

@ -32,7 +32,7 @@ using namespace NLMISC;
namespace NLSOUND { namespace NLSOUND {
CSourceXAudio2::CSourceXAudio2(CSoundDriverXAudio2 *soundDriver) CSourceXAudio2::CSourceXAudio2(CSoundDriverXAudio2 *soundDriver)
: _SoundDriver(soundDriver), _SourceVoice(NULL), _StaticBuffer(NULL), _OperationSet(soundDriver->getUniqueOperationSet()), : _SoundDriver(soundDriver), _SourceVoice(NULL), _StaticBuffer(NULL), _LastPreparedBuffer(NULL), _OperationSet(soundDriver->getUniqueOperationSet()),
_Format(IBuffer::FormatUnknown), _Frequency(0), _PlayStart(0), _Format(IBuffer::FormatUnknown), _Frequency(0), _PlayStart(0),
_Doppler(1.0f), _Pos(0.0f, 0.0f, 0.0f), _Relative(false), _Alpha(1.0), _Doppler(1.0f), _Pos(0.0f, 0.0f, 0.0f), _Relative(false), _Alpha(1.0),
_DirectDryVoice(NULL), _DirectFilterVoice(NULL), _EffectDryVoice(NULL), _EffectFilterVoice(NULL), _DirectDryVoice(NULL), _DirectFilterVoice(NULL), _EffectDryVoice(NULL), _EffectFilterVoice(NULL),
@ -407,6 +407,7 @@ void CSourceXAudio2::submitStreamingBuffer(IBuffer *buffer)
uint32 frequency; uint32 frequency;
buffer->getFormat(bufferFormat, channels, bitsPerSample, frequency); buffer->getFormat(bufferFormat, channels, bitsPerSample, frequency);
preparePlay(bufferFormat, channels, bitsPerSample, frequency); preparePlay(bufferFormat, channels, bitsPerSample, frequency);
_LastPreparedBuffer = NULL;
} }
submitBuffer(static_cast<CBufferXAudio2 *>(buffer)); submitBuffer(static_cast<CBufferXAudio2 *>(buffer));
@ -455,7 +456,8 @@ void CSourceXAudio2::setLooping(bool l)
if (FAILED(_SourceVoice->FlushSourceBuffers())) if (FAILED(_SourceVoice->FlushSourceBuffers()))
nlwarning(NLSOUND_XAUDIO2_PREFIX "FAILED FlushSourceBuffers"); nlwarning(NLSOUND_XAUDIO2_PREFIX "FAILED FlushSourceBuffers");
// resubmit with updated looping settings // resubmit with updated looping settings
submitBuffer(_StaticBuffer); if (_LastPreparedBuffer == _StaticBuffer)
submitBuffer(_StaticBuffer);
} }
else else
{ {
@ -478,7 +480,8 @@ void CSourceXAudio2::setLooping(bool l)
if (FAILED(_SourceVoice->FlushSourceBuffers())) if (FAILED(_SourceVoice->FlushSourceBuffers()))
nlwarning(NLSOUND_XAUDIO2_PREFIX "FAILED FlushSourceBuffers"); nlwarning(NLSOUND_XAUDIO2_PREFIX "FAILED FlushSourceBuffers");
// queue buffer with correct looping parameters // queue buffer with correct looping parameters
submitBuffer(_StaticBuffer); if (_LastPreparedBuffer == _StaticBuffer)
submitBuffer(_StaticBuffer);
} }
} }
} }
@ -635,6 +638,7 @@ bool CSourceXAudio2::play()
_StaticBuffer->getChannels(), _StaticBuffer->getChannels(),
_StaticBuffer->getBitsPerSample(), _StaticBuffer->getBitsPerSample(),
_StaticBuffer->getFrequency()); _StaticBuffer->getFrequency());
_LastPreparedBuffer = _StaticBuffer;
submitBuffer(_StaticBuffer); submitBuffer(_StaticBuffer);
_PlayStart = CTime::getLocalTime(); _PlayStart = CTime::getLocalTime();
if (SUCCEEDED(_SourceVoice->Start(0))) _IsPlaying = true; if (SUCCEEDED(_SourceVoice->Start(0))) _IsPlaying = true;

View file

@ -41,6 +41,8 @@ private:
CSoundDriverXAudio2 *_SoundDriver; CSoundDriverXAudio2 *_SoundDriver;
/// Buffer that should be playing. /// Buffer that should be playing.
CBufferXAudio2 *_StaticBuffer; CBufferXAudio2 *_StaticBuffer;
/// Last buffer that was prepared for playing.
CBufferXAudio2 *_LastPreparedBuffer;
// -- Pointers -- // -- Pointers --
/// Source voice, can be NULL! /// Source voice, can be NULL!