Changed: #1031 Music is "stopped" when client is loading with OpenAL driver

This commit is contained in:
kervala 2010-07-28 21:13:39 +02:00
parent 079946f022
commit 1cd25d97de
5 changed files with 116 additions and 74 deletions

View file

@ -33,13 +33,8 @@ CMusicChannelAL::CMusicChannelAL(CSoundDriverAL *soundDriver)
{
// create a default source for music streaming
_Source = static_cast<CSourceAL*>(_SoundDriver->createSource());
_Source->setPos(CVector(0, 0, 0));
_Source->setVelocity(CVector(0, 0, 0));
_Source->setDirection(CVector(0, 0, 0));
_Source->setSourceRelativeMode(true);
_Source->setStreamingBuffersMax(4);
_Source->setType(SourceMusic);
_Source->setStreamingBufferSize(32768);
// _Source->setStreaming(true);
}
CMusicChannelAL::~CMusicChannelAL()
@ -109,9 +104,6 @@ void CMusicChannelAL::setBufferFormat(IBuffer *buffer)
}
void CMusicChannelAL::run()
{
if (_Async)
{
bool first = true;
@ -140,6 +132,8 @@ void CMusicChannelAL::run()
for(uint i = 0; i < buffers.size(); ++i)
fillBuffer(buffers[i], _Source->getStreamingBufferSize());
// _Source->updateManualRolloff();
// play the source
if (first)
{
@ -151,8 +145,22 @@ void CMusicChannelAL::run()
nlSleep(100);
}
while(!_MusicBuffer->isMusicEnded() && _Playing);
// music finished without interruption
if (_Playing)
{
// wait until source is not playing
while(_Source->isPlaying() && _Playing) nlSleep(1000);
_Source->stop();
_Playing = false;
}
else
}
/// Play sync music
bool CMusicChannelAL::playSync()
{
// use an unique buffer managed by CMusicChannelAL
_Buffer = _SoundDriver->createBuffer();
@ -170,23 +178,14 @@ void CMusicChannelAL::run()
_MusicBuffer = NULL;
}
// delete previous queued buffers
_Source->setStreamingBuffersMax(0);
// use this buffer as source
_Source->setStaticBuffer(_Buffer);
// play the source
_Source->play();
}
// music finished without interruption
if (_Playing)
{
// wait until source is not playing
while(_Source->isPlaying() && _Playing) nlSleep(1000);
_Source->stop();
_Playing = false;
}
return _Source->play();
}
/** Play some music (.ogg etc...)
@ -204,6 +203,13 @@ bool CMusicChannelAL::play(const std::string &filepath, bool async, bool loop)
_MusicBuffer = IMusicBuffer::createMusicBuffer(filepath, async, async ? loop:false);
if (_MusicBuffer)
{
_Async = async;
_Playing = true;
_Source->setSourceRelativeMode(true);
if (_Async)
{
// create the thread if it's not yet created
if (!_Thread) _Thread = IThread::create(this);
@ -214,16 +220,24 @@ bool CMusicChannelAL::play(const std::string &filepath, bool async, bool loop)
return false;
}
_Async = async;
_Playing = true;
// use 4 queued buffers
_Source->setStreamingBuffersMax(4);
// we need to loop the source only if not async
_Source->setLooping(async ? false:loop);
_Source->setLooping(false);
// start the thread
_Thread->start();
}
else
{
// we need to loop the source only if not async
_Source->setLooping(loop);
return playSync();
}
}
else
{
nlwarning("AL: Can't stream file %s", filepath.c_str());
return false;
@ -298,6 +312,16 @@ void CMusicChannelAL::setVolume(float gain)
_Source->setGain(gain);
}
/// Update music
void CMusicChannelAL::update()
{
// stop sync music once finished playing
if (_Playing && !_Async && !_Source->isPlaying())
{
stop();
}
}
} /* namespace NLSOUND */
/* end of file */

View file

@ -91,6 +91,12 @@ public:
* NB: in OpenAL driver, the volume of music IS affected by IListener::setGain()
*/
virtual void setVolume(float gain);
/// Play sync music
bool playSync();
/// Update music
void update();
}; /* class CMusicChannelAL */
} /* namespace NLSOUND */

View file

@ -618,11 +618,16 @@ void CSoundDriverAL::commit3DChanges()
// Sync up sources & listener 3d position.
if (getOption(OptionManualRolloff))
{
for (std::set<CSourceAL *>::iterator it(_Sources.begin()), end(_Sources.end()); it != end; ++it)
set<CSourceAL*>::iterator it = _Sources.begin(), iend = _Sources.end();
while(it != iend)
{
(*it)->updateManualRolloff();
++it;
}
}
// update the music (XFade etc...)
updateMusic();
}
/// Write information about the driver to the output stream.
@ -661,6 +666,12 @@ bool CSoundDriverAL::getMusicInfo(const std::string &filepath, std::string &arti
return IMusicBuffer::getInfo(filepath, artist, title);
}
void CSoundDriverAL::updateMusic()
{
set<CMusicChannelAL *>::iterator it(_MusicChannels.begin()), end(_MusicChannels.end());
for (; it != end; ++it) (*it)->update();
}
/// Remove a buffer
void CSoundDriverAL::removeBuffer(CBufferAL *buffer)
{

View file

@ -176,6 +176,7 @@ public:
float getGain();
protected:
void updateMusic();
/// Allocate nb new buffers or sources
void allocateNewItems( TGenFunctionAL algenfunc, TTestFunctionAL altestfunc,

View file

@ -533,7 +533,7 @@ void initMainLoop()
// During load of the game, fade completely out SFX, and leave outgame music
// When the game will begin, it will fade in slowly
if(SoundMngr)
SoundMngr->setupFadeSound(1.f, 1.f);
SoundMngr->setupFadeSound(0.f, 1.f);
initLast = initCurrent;
initCurrent = ryzomGetLocalTime();