From c24e0ef8fac2d036b18fd02fadca7dbe7c11cd8f Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 7 Dec 2014 02:58:52 +0100 Subject: [PATCH] Improved Music.cpp (Added comments) Former-commit-id: 0a4aabbafd3d76d280ac98332fa2059b1ad73b39 --- src/Nazara/Audio/Music.cpp | 41 +++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/src/Nazara/Audio/Music.cpp b/src/Nazara/Audio/Music.cpp index f6704bf4d..aad189270 100644 --- a/src/Nazara/Audio/Music.cpp +++ b/src/Nazara/Audio/Music.cpp @@ -116,6 +116,7 @@ nzUInt32 NzMusic::GetPlayingOffset() const } #endif + ///TODO return 0; } @@ -131,6 +132,7 @@ nzSoundStatus NzMusic::GetStatus() const nzSoundStatus status = GetInternalStatus(); + // Pour compenser les éventuels retards (ou le laps de temps entre Play() et la mise en route du thread) if (m_impl->streaming && status == nzSoundStatus_Stopped) status = nzSoundStatus_Playing; @@ -180,14 +182,17 @@ void NzMusic::Play() } #endif + // Nous sommes déjà en train de jouer if (m_impl->streaming) { + // Peut-être sommes-nous en pause if (GetStatus() != nzSoundStatus_Playing) alSourcePlay(m_source); return; } + // Lancement du thread de streaming m_impl->stream->Seek(0); m_impl->streaming = true; m_impl->thread = NzThread(&NzMusic::MusicThread, this); @@ -195,6 +200,19 @@ void NzMusic::Play() return; } +void NzMusic::SetPlayingOffset(nzUInt32 offset) +{ + #if NAZARA_AUDIO_SAFE + if (!m_impl) + { + NazaraError("Music not created"); + return; + } + #endif + + ///TODO +} + void NzMusic::Stop() { #if NAZARA_AUDIO_SAFE @@ -217,39 +235,44 @@ bool NzMusic::FillAndQueueBuffer(unsigned int buffer) unsigned int sampleCount = m_impl->chunkSamples.size(); unsigned int sampleRead = 0; + // Lecture depuis le stream pour remplir le buffer for (;;) { sampleRead += m_impl->stream->Read(&m_impl->chunkSamples[sampleRead], sampleCount - sampleRead); - if (sampleRead < sampleCount && m_impl->loop) - m_impl->stream->Seek(0); - else - break; + if (sampleRead < sampleCount && !m_impl->loop) + break; // Fin du stream (On ne boucle pas) + + m_impl->stream->Seek(0); // On boucle au début du stream et on remplit à nouveau } + // Mise à jour du buffer (envoi à OpenAL) et placement dans la file d'attente if (sampleRead > 0) { 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 stream (N'arrive pas en cas de loop) } void NzMusic::MusicThread() { + // Allocation des buffers de streaming ALuint buffers[NAZARA_AUDIO_STREAMED_BUFFER_COUNT]; alGenBuffers(NAZARA_AUDIO_STREAMED_BUFFER_COUNT, buffers); for (unsigned int i = 0; i < NAZARA_AUDIO_STREAMED_BUFFER_COUNT; ++i) { - if (FillAndQueueBuffer(buffers[i])) // Fin du fichier ? - break; // Nous avons atteint la fin du fichier, inutile de rajouter des buffers + if (FillAndQueueBuffer(buffers[i])) + break; // Nous avons atteint la fin du stream, inutile de rajouter des buffers } alSourcePlay(m_source); + // Boucle de lecture (remplissage de nouveaux buffers au fur et à mesure) while (m_impl->streaming) { + // La lecture s'est arrêtée, nous avons atteint la fin du stream nzSoundStatus status = GetInternalStatus(); if (status == nzSoundStatus_Stopped) { @@ -257,6 +280,7 @@ void NzMusic::MusicThread() break; } + // On traite les buffers lus ALint processedCount = 0; alGetSourcei(m_source, AL_BUFFERS_PROCESSED, &processedCount); @@ -268,11 +292,14 @@ void NzMusic::MusicThread() break; } + // On retourne dormir un peu NzThread::Sleep(50); } + // Arrêt de la lecture du son (dans le cas où ça ne serait pas déjà fait) alSourceStop(m_source); + // On supprime les buffers du stream ALint queuedBufferCount; alGetSourcei(m_source, AL_BUFFERS_QUEUED, &queuedBufferCount);