1
0
mirror of https://foundry.openuru.org/gitblit/r/CWE-ou-minkata.git synced 2025-07-18 19:29:09 +00:00

Decode the whole audio track on startup

This commit is contained in:
Florian Meißner
2014-10-31 14:28:11 +01:00
parent 639819a0e5
commit 5563b803c4
6 changed files with 103 additions and 88 deletions

View File

@ -619,6 +619,16 @@ void plDSoundBuffer::Play( void )
}
//// Pause ///////////////////////////////////////////////////////////////////
void plDSoundBuffer::Pause()
{
if (!source)
return;
alSourcePause(source);
alGetError();
}
//// Stop ////////////////////////////////////////////////////////////////////
void plDSoundBuffer::Stop( void )

View File

@ -73,8 +73,9 @@ public:
void Play( void );
void Stop( void );
void Rewind() ;
void Rewind();
void Pause();
uint32_t GetLengthInBytes( void ) const;
void SetScalarVolume( float volume ); // Sets the volume, but on a range from 0 to 1

View File

@ -47,16 +47,15 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com
#include "plDSoundBuffer.h"
static int uniqueID = 0;
plWin32VideoSound::plWin32VideoSound(plWAVHeader& header) : plWin32Sound()
plWin32VideoSound::plWin32VideoSound(const plWAVHeader& header) : plWin32Sound()
{
fCurrVolume = 1.0f;
fDesiredVol = 1.0f;
fSoftVolume = 1.0f;
fType = kGUISound;
fDSoundBuffer = new plDSoundBuffer(0, header, false, false, false, true);
fDSoundBuffer->SetupVoiceSource();
fDSoundBuffer->SetScalarVolume(1.0f);
fWAVHeader = header;
fDSoundBuffer = new plDSoundBuffer(0, fWAVHeader, false, false);
uniqueID++;
hsgResMgr::ResMgr()->NewKey(plFormat("videosound#{}", uniqueID), this, plLocation::kGlobalFixedLoc);
@ -68,24 +67,26 @@ plWin32VideoSound::~plWin32VideoSound()
delete fDSoundBuffer;
}
void plWin32VideoSound::UpdateSoundBuffer(void* buffer, size_t size)
void plWin32VideoSound::Play()
{
uint32_t bufferId;
uint32_t chunk;
fDSoundBuffer->UnQueueVoiceBuffers();
while (size > 0)
{
chunk = size < STREAM_BUFFER_SIZE ? size : STREAM_BUFFER_SIZE;
if (!fDSoundBuffer->GetAvailableBufferId(&bufferId))
break;
fDSoundBuffer->VoiceFillBuffer(buffer, chunk, bufferId);
size -= chunk;
}
IActuallyPlay();
}
void plWin32VideoSound::Pause(bool on)
{
if (on)
fDSoundBuffer->Pause();
else if (!fReallyPlaying)
fDSoundBuffer->Play();
fReallyPlaying = !on;
}
void plWin32VideoSound::FillSoundBuffer(void* buffer, size_t size)
{
fDSoundBuffer->FillBuffer(buffer, size, &fWAVHeader);
fDSoundBuffer->SetScalarVolume(1.0f);
}
void plWin32VideoSound::IDerivedActuallyPlay()
{
if (!fReallyPlaying)

View File

@ -48,10 +48,12 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com
class plWin32VideoSound : public plWin32Sound
{
public:
plWin32VideoSound(plWAVHeader& header);
plWin32VideoSound(const plWAVHeader& header);
virtual ~plWin32VideoSound();
void UpdateSoundBuffer(void* buffer, size_t size);
virtual void Play();
virtual void Pause(bool on);
void FillSoundBuffer(void* buffer, size_t size);
protected:
void IDerivedActuallyPlay(void);
@ -60,5 +62,6 @@ protected:
float GetActualTimeSec();
void ISetActualTime(double t);
plWAVHeader fWAVHeader;
};
#endif