Enabling sound in-game works even for engines / looped sounds now
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@6255 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
parent
7434604183
commit
12cb80f9d0
@ -57,6 +57,7 @@ public:
|
|||||||
virtual void volume(float gain) = 0;
|
virtual void volume(float gain) = 0;
|
||||||
virtual SFXManager::SFXStatus
|
virtual SFXManager::SFXStatus
|
||||||
getStatus() = 0;
|
getStatus() = 0;
|
||||||
|
virtual void onSoundEnabledBack() = 0;
|
||||||
}; // SfxBase
|
}; // SfxBase
|
||||||
|
|
||||||
|
|
||||||
|
@ -94,6 +94,8 @@ public:
|
|||||||
float getRolloff() const { return m_rolloff; }
|
float getRolloff() const { return m_rolloff; }
|
||||||
float getGain() const { return m_gain; }
|
float getGain() const { return m_gain; }
|
||||||
|
|
||||||
|
std::string getFileName() const { return m_file; }
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -113,6 +113,12 @@ void SFXManager::soundToggled(const bool on)
|
|||||||
}
|
}
|
||||||
|
|
||||||
resumeAll();
|
resumeAll();
|
||||||
|
|
||||||
|
const int sfx_amount = m_all_sfx.size();
|
||||||
|
for (int n=0; n<sfx_amount; n++)
|
||||||
|
{
|
||||||
|
m_all_sfx[n]->onSoundEnabledBack();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -41,6 +41,8 @@ SFXOpenAL::SFXOpenAL(SFXBuffer* buffer, bool positional, float gain) : SFXBase()
|
|||||||
m_ok = false;
|
m_ok = false;
|
||||||
m_positional = positional;
|
m_positional = positional;
|
||||||
m_defaultGain = gain;
|
m_defaultGain = gain;
|
||||||
|
m_loop = false;
|
||||||
|
m_gain = -1.0f;
|
||||||
|
|
||||||
// Don't initialise anything else if the sfx manager was not correctly
|
// Don't initialise anything else if the sfx manager was not correctly
|
||||||
// initialised. First of all the initialisation will not work, and it
|
// initialised. First of all the initialisation will not work, and it
|
||||||
@ -55,7 +57,10 @@ SFXOpenAL::SFXOpenAL(SFXBuffer* buffer, bool positional, float gain) : SFXBase()
|
|||||||
|
|
||||||
SFXOpenAL::~SFXOpenAL()
|
SFXOpenAL::~SFXOpenAL()
|
||||||
{
|
{
|
||||||
alDeleteSources(1, &m_soundSource);
|
if (m_ok)
|
||||||
|
{
|
||||||
|
alDeleteSources(1, &m_soundSource);
|
||||||
|
}
|
||||||
} // ~SFXOpenAL
|
} // ~SFXOpenAL
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@ -79,12 +84,21 @@ bool SFXOpenAL::init()
|
|||||||
alSource3f(m_soundSource, AL_VELOCITY, 0.0, 0.0, 0.0);
|
alSource3f(m_soundSource, AL_VELOCITY, 0.0, 0.0, 0.0);
|
||||||
alSource3f(m_soundSource, AL_DIRECTION, 0.0, 0.0, 0.0);
|
alSource3f(m_soundSource, AL_DIRECTION, 0.0, 0.0, 0.0);
|
||||||
alSourcef (m_soundSource, AL_ROLLOFF_FACTOR, m_soundBuffer->getRolloff());
|
alSourcef (m_soundSource, AL_ROLLOFF_FACTOR, m_soundBuffer->getRolloff());
|
||||||
alSourcef (m_soundSource, AL_GAIN, m_defaultGain);
|
|
||||||
|
|
||||||
|
if (m_gain < 0.0f)
|
||||||
|
{
|
||||||
|
alSourcef (m_soundSource, AL_GAIN, m_defaultGain);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
alSourcef (m_soundSource, AL_GAIN, m_gain);
|
||||||
|
}
|
||||||
|
|
||||||
if (m_positional) alSourcei (m_soundSource, AL_SOURCE_RELATIVE, AL_FALSE);
|
if (m_positional) alSourcei (m_soundSource, AL_SOURCE_RELATIVE, AL_FALSE);
|
||||||
else alSourcei (m_soundSource, AL_SOURCE_RELATIVE, AL_TRUE);
|
else alSourcei (m_soundSource, AL_SOURCE_RELATIVE, AL_TRUE);
|
||||||
|
|
||||||
|
alSourcei(m_soundSource, AL_LOOPING, m_loop ? AL_TRUE : AL_FALSE);
|
||||||
|
|
||||||
m_ok = SFXManager::checkError("setting up the source");
|
m_ok = SFXManager::checkError("setting up the source");
|
||||||
|
|
||||||
return m_ok;
|
return m_ok;
|
||||||
@ -117,6 +131,8 @@ void SFXOpenAL::speed(float factor)
|
|||||||
*/
|
*/
|
||||||
void SFXOpenAL::volume(float gain)
|
void SFXOpenAL::volume(float gain)
|
||||||
{
|
{
|
||||||
|
m_gain = m_defaultGain * gain;
|
||||||
|
|
||||||
if(!m_ok) return;
|
if(!m_ok) return;
|
||||||
|
|
||||||
alSourcef(m_soundSource, AL_GAIN, m_defaultGain * gain);
|
alSourcef(m_soundSource, AL_GAIN, m_defaultGain * gain);
|
||||||
@ -128,6 +144,8 @@ void SFXOpenAL::volume(float gain)
|
|||||||
*/
|
*/
|
||||||
void SFXOpenAL::setLoop(bool status)
|
void SFXOpenAL::setLoop(bool status)
|
||||||
{
|
{
|
||||||
|
m_loop = status;
|
||||||
|
|
||||||
if(!m_ok) return;
|
if(!m_ok) return;
|
||||||
|
|
||||||
alSourcei(m_soundSource, AL_LOOPING, status ? AL_TRUE : AL_FALSE);
|
alSourcei(m_soundSource, AL_LOOPING, status ? AL_TRUE : AL_FALSE);
|
||||||
@ -141,6 +159,7 @@ void SFXOpenAL::stop()
|
|||||||
{
|
{
|
||||||
if(!m_ok) return;
|
if(!m_ok) return;
|
||||||
|
|
||||||
|
m_loop = false;
|
||||||
alSourcei(m_soundSource, AL_LOOPING, AL_FALSE);
|
alSourcei(m_soundSource, AL_LOOPING, AL_FALSE);
|
||||||
alSourceStop(m_soundSource);
|
alSourceStop(m_soundSource);
|
||||||
SFXManager::checkError("stoping");
|
SFXManager::checkError("stoping");
|
||||||
@ -162,7 +181,14 @@ void SFXOpenAL::pause()
|
|||||||
*/
|
*/
|
||||||
void SFXOpenAL::resume()
|
void SFXOpenAL::resume()
|
||||||
{
|
{
|
||||||
if(!m_ok) return;
|
if (!m_ok)
|
||||||
|
{
|
||||||
|
// lazily create OpenAL source when needed
|
||||||
|
init();
|
||||||
|
|
||||||
|
// creation of OpenAL source failed, giving up
|
||||||
|
if (!m_ok) return;
|
||||||
|
}
|
||||||
|
|
||||||
alSourcePlay(m_soundSource);
|
alSourcePlay(m_soundSource);
|
||||||
SFXManager::checkError("resuming");
|
SFXManager::checkError("resuming");
|
||||||
|
@ -36,11 +36,24 @@
|
|||||||
class SFXOpenAL : public SFXBase
|
class SFXOpenAL : public SFXBase
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
SFXBuffer* m_soundBuffer; // Buffers hold sound data.
|
SFXBuffer* m_soundBuffer; //!< Buffers hold sound data.
|
||||||
ALuint m_soundSource; // Sources are points emitting sound.
|
ALuint m_soundSource; //!< Sources are points emitting sound.
|
||||||
bool m_ok;
|
bool m_ok;
|
||||||
bool m_positional;
|
bool m_positional;
|
||||||
float m_defaultGain;
|
float m_defaultGain;
|
||||||
|
|
||||||
|
/** The OpenAL source contains this info, but if audio is disabled initially then
|
||||||
|
the sound source won't be created and we'll be left with no clue when enabling
|
||||||
|
sounds later */
|
||||||
|
bool m_loop;
|
||||||
|
|
||||||
|
/** Contains a volume if set through the "volume" method, or a negative number if
|
||||||
|
this method was not called.
|
||||||
|
The OpenAL source contains this info, but if audio is disabled initially then
|
||||||
|
the sound source won't be created and we'll be left with no clue when enabling
|
||||||
|
sounds later. */
|
||||||
|
float m_gain;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SFXOpenAL(SFXBuffer* buffer, bool positional, float gain);
|
SFXOpenAL(SFXBuffer* buffer, bool positional, float gain);
|
||||||
virtual ~SFXOpenAL();
|
virtual ~SFXOpenAL();
|
||||||
@ -57,6 +70,7 @@ public:
|
|||||||
virtual void position(const Vec3 &position);
|
virtual void position(const Vec3 &position);
|
||||||
virtual void volume(float gain);
|
virtual void volume(float gain);
|
||||||
virtual SFXManager::SFXStatus getStatus();
|
virtual SFXManager::SFXStatus getStatus();
|
||||||
|
virtual void onSoundEnabledBack() { if (m_loop) resume(); }
|
||||||
|
|
||||||
}; // SFXOpenAL
|
}; // SFXOpenAL
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user