Fixed possible bug in NzMusic

Caused by sending a non-updated buffer to OpenAL


Former-commit-id: 4441bcc9cd8cee874ba8bc5f66f1234cfffd3621
This commit is contained in:
Lynix 2014-01-09 21:04:58 +01:00
parent 26fb8abbbd
commit 601346a566
2 changed files with 11 additions and 11 deletions

View File

@ -61,7 +61,7 @@ class NAZARA_API NzMusic : public NzSoundEmitter
private: private:
NzMusicImpl* m_impl = nullptr; NzMusicImpl* m_impl = nullptr;
bool FillBuffer(unsigned int buffer); bool FillAndQueueBuffer(unsigned int buffer);
void MusicThread(); void MusicThread();
static NzMusicLoader::LoaderList s_loaders; static NzMusicLoader::LoaderList s_loaders;

View File

@ -199,22 +199,25 @@ void NzMusic::Stop()
} }
} }
bool NzMusic::FillBuffer(unsigned int buffer) bool NzMusic::FillAndQueueBuffer(unsigned int buffer)
{ {
unsigned int sampleCount = m_impl->chunkSamples.size(); unsigned int sampleCount = m_impl->chunkSamples.size();
unsigned int sampleRead = 0; unsigned int sampleRead = 0;
for (;;) for (;;)
{ {
sampleRead += m_impl->stream->Read(&m_impl->chunkSamples[sampleRead], sampleCount-sampleRead); sampleRead += m_impl->stream->Read(&m_impl->chunkSamples[sampleRead], sampleCount - sampleRead);
if (sampleRead != sampleCount && m_impl->loop) if (sampleRead < sampleCount && m_impl->loop)
m_impl->stream->Seek(0); m_impl->stream->Seek(0);
else else
break; break;
} }
if (sampleRead > 0) if (sampleRead > 0)
{
alBufferData(buffer, m_impl->audioFormat, &m_impl->chunkSamples[0], sampleRead*sizeof(nzInt16), m_impl->sampleRate); alBufferData(buffer, m_impl->audioFormat, &m_impl->chunkSamples[0], sampleRead*sizeof(nzInt16), m_impl->sampleRate);
alSourceQueueBuffers(m_source, 1, &buffer);
}
return sampleRead != sampleCount; // Fin du fichier (N'arrive pas en cas de loop) return sampleRead != sampleCount; // Fin du fichier (N'arrive pas en cas de loop)
} }
@ -226,11 +229,8 @@ void NzMusic::MusicThread()
for (unsigned int i = 0; i < NAZARA_AUDIO_STREAMEDBUFFERCOUNT; ++i) for (unsigned int i = 0; i < NAZARA_AUDIO_STREAMEDBUFFERCOUNT; ++i)
{ {
bool eof = FillBuffer(buffers[i]); if (FillAndQueueBuffer(buffers[i])) // Fin du fichier ?
alSourceQueueBuffers(m_source, 1, &buffers[i]); break; // Nous avons atteint la fin du fichier, inutile de rajouter des buffers
if (eof)
break; // Nous avons fini, nous ne continuons pas
} }
alSourcePlay(m_source); alSourcePlay(m_source);
@ -251,8 +251,8 @@ void NzMusic::MusicThread()
while (processedCount--) while (processedCount--)
{ {
alSourceUnqueueBuffers(m_source, 1, &buffer); alSourceUnqueueBuffers(m_source, 1, &buffer);
if (!FillBuffer(buffer)) // Fin du fichier ? if (FillAndQueueBuffer(buffer))
alSourceQueueBuffers(m_source, 1, &buffer); break;
} }
NzThread::Sleep(50); NzThread::Sleep(50);