Improve kart audio refactor, see #2921
This commit is contained in:
parent
663c7aacaf
commit
cb2295c738
@ -47,9 +47,9 @@ public:
|
|||||||
virtual void reallySetSpeedPosition(float f,
|
virtual void reallySetSpeedPosition(float f,
|
||||||
const Vec3 &p) {}
|
const Vec3 &p) {}
|
||||||
virtual void play() {}
|
virtual void play() {}
|
||||||
virtual void reallyPlayNow() {}
|
virtual void reallyPlayNow(SFXBuffer* buffer = NULL) {}
|
||||||
virtual void play(const Vec3 &xyz) {}
|
virtual void play(const Vec3 &xyz, SFXBuffer* buffer = NULL) {}
|
||||||
virtual void reallyPlayNow(const Vec3 &xyz) {}
|
virtual void reallyPlayNow(const Vec3 &xyz, SFXBuffer* buffer = NULL) {}
|
||||||
virtual void stop() {}
|
virtual void stop() {}
|
||||||
virtual void reallyStopNow() {}
|
virtual void reallyStopNow() {}
|
||||||
virtual void pause() {}
|
virtual void pause() {}
|
||||||
|
@ -64,9 +64,9 @@ public:
|
|||||||
virtual void setLoop(bool status) = 0;
|
virtual void setLoop(bool status) = 0;
|
||||||
virtual void reallySetLoop(bool status) = 0;
|
virtual void reallySetLoop(bool status) = 0;
|
||||||
virtual void play() = 0;
|
virtual void play() = 0;
|
||||||
virtual void reallyPlayNow() = 0;
|
virtual void reallyPlayNow(SFXBuffer* buffer = NULL) = 0;
|
||||||
virtual void play(const Vec3 &xyz) = 0;
|
virtual void play(const Vec3 &xyz, SFXBuffer* buffer = NULL) = 0;
|
||||||
virtual void reallyPlayNow(const Vec3 &xyz) = 0;
|
virtual void reallyPlayNow(const Vec3 &xyz, SFXBuffer* buffer = NULL) = 0;
|
||||||
virtual void stop() = 0;
|
virtual void stop() = 0;
|
||||||
virtual void reallyStopNow() = 0;
|
virtual void reallyStopNow() = 0;
|
||||||
virtual void pause() = 0;
|
virtual void pause() = 0;
|
||||||
@ -83,7 +83,6 @@ public:
|
|||||||
virtual void onSoundEnabledBack() = 0;
|
virtual void onSoundEnabledBack() = 0;
|
||||||
virtual void setRolloff(float rolloff) = 0;
|
virtual void setRolloff(float rolloff) = 0;
|
||||||
virtual const SFXBuffer* getBuffer() const = 0;
|
virtual const SFXBuffer* getBuffer() const = 0;
|
||||||
virtual void setBuffer(SFXBuffer* buffer, bool owns_buffer) = 0;
|
|
||||||
virtual SFXStatus getStatus() = 0;
|
virtual SFXStatus getStatus() = 0;
|
||||||
|
|
||||||
}; // SFXBase
|
}; // SFXBase
|
||||||
|
@ -217,6 +217,15 @@ void SFXManager::queue(SFXCommands command, SFXBase *sfx, const Vec3 &p)
|
|||||||
queueCommand(sfx_command);
|
queueCommand(sfx_command);
|
||||||
} // queue (Vec3)
|
} // queue (Vec3)
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void SFXManager::queue(SFXCommands command, SFXBase *sfx, const Vec3 &p, SFXBuffer* buffer)
|
||||||
|
{
|
||||||
|
SFXCommand *sfx_command = new SFXCommand(command, sfx, p);
|
||||||
|
sfx_command->m_buffer = buffer;
|
||||||
|
queueCommand(sfx_command);
|
||||||
|
} // queue (Vec3)
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
/** Adds a sound effect command with a float and a Vec3 parameter to the queue
|
/** Adds a sound effect command with a float and a Vec3 parameter to the queue
|
||||||
* of the sfx manager. Openal commands can sometimes cause a 5ms delay, so it
|
* of the sfx manager. Openal commands can sometimes cause a 5ms delay, so it
|
||||||
@ -340,7 +349,7 @@ void* SFXManager::mainLoop(void *obj)
|
|||||||
{
|
{
|
||||||
case SFX_PLAY: current->m_sfx->reallyPlayNow(); break;
|
case SFX_PLAY: current->m_sfx->reallyPlayNow(); break;
|
||||||
case SFX_PLAY_POSITION:
|
case SFX_PLAY_POSITION:
|
||||||
current->m_sfx->reallyPlayNow(current->m_parameter); break;
|
current->m_sfx->reallyPlayNow(current->m_parameter, current->m_buffer); break;
|
||||||
case SFX_STOP: current->m_sfx->reallyStopNow(); break;
|
case SFX_STOP: current->m_sfx->reallyStopNow(); break;
|
||||||
case SFX_PAUSE: current->m_sfx->reallyPauseNow(); break;
|
case SFX_PAUSE: current->m_sfx->reallyPauseNow(); break;
|
||||||
case SFX_RESUME: current->m_sfx->reallyResumeNow(); break;
|
case SFX_RESUME: current->m_sfx->reallyResumeNow(); break;
|
||||||
|
@ -122,6 +122,9 @@ private:
|
|||||||
/** The sound effect for which the command should be executed. */
|
/** The sound effect for which the command should be executed. */
|
||||||
SFXBase *m_sfx;
|
SFXBase *m_sfx;
|
||||||
|
|
||||||
|
/** The sound buffer to play (null = no change) */
|
||||||
|
SFXBuffer *m_buffer = NULL;
|
||||||
|
|
||||||
/** Stores music information for music commands. */
|
/** Stores music information for music commands. */
|
||||||
MusicInformation *m_music_information;
|
MusicInformation *m_music_information;
|
||||||
|
|
||||||
@ -232,12 +235,14 @@ private:
|
|||||||
public:
|
public:
|
||||||
static void create();
|
static void create();
|
||||||
static void destroy();
|
static void destroy();
|
||||||
void queue(SFXCommands command, SFXBase *sfx=NULL);
|
void queue(SFXCommands command, SFXBase *sfx=NULL);
|
||||||
void queue(SFXCommands command, SFXBase *sfx, float f);
|
void queue(SFXCommands command, SFXBase *sfx, float f);
|
||||||
void queue(SFXCommands command, SFXBase *sfx, const Vec3 &p);
|
void queue(SFXCommands command, SFXBase *sfx, const Vec3 &p);
|
||||||
void queue(SFXCommands command, SFXBase *sfx, float f, const Vec3 &p);
|
void queue(SFXCommands command, SFXBase *sfx, float f, const Vec3 &p);
|
||||||
void queue(SFXCommands command, MusicInformation *mi);
|
void queue(SFXCommands command, MusicInformation *mi);
|
||||||
void queue(SFXCommands command, MusicInformation *mi, float f);
|
void queue(SFXCommands command, MusicInformation *mi, float f);
|
||||||
|
void queue(SFXCommands command, SFXBase *sfx, const Vec3 &p, SFXBuffer* buffer);
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
/** Static function to get the singleton sfx manager. */
|
/** Static function to get the singleton sfx manager. */
|
||||||
static SFXManager *get()
|
static SFXManager *get()
|
||||||
|
@ -52,7 +52,6 @@ SFXOpenAL::SFXOpenAL(SFXBuffer* buffer, bool positional, float volume,
|
|||||||
m_master_gain = 1.0f;
|
m_master_gain = 1.0f;
|
||||||
m_owns_buffer = owns_buffer;
|
m_owns_buffer = owns_buffer;
|
||||||
m_play_time = 0.0f;
|
m_play_time = 0.0f;
|
||||||
m_sound_buffer_changed = false;
|
|
||||||
|
|
||||||
// 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
|
||||||
@ -366,7 +365,7 @@ void SFXOpenAL::play()
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
/** Plays this sound effect.
|
/** Plays this sound effect.
|
||||||
*/
|
*/
|
||||||
void SFXOpenAL::reallyPlayNow()
|
void SFXOpenAL::reallyPlayNow(SFXBuffer* buffer)
|
||||||
{
|
{
|
||||||
if (!SFXManager::get()->sfxAllowed()) return;
|
if (!SFXManager::get()->sfxAllowed()) return;
|
||||||
if (m_status==SFX_NOT_INITIALISED)
|
if (m_status==SFX_NOT_INITIALISED)
|
||||||
@ -378,13 +377,13 @@ void SFXOpenAL::reallyPlayNow()
|
|||||||
if (m_status==SFX_UNKNOWN) return;
|
if (m_status==SFX_UNKNOWN) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_sound_buffer_changed)
|
if (buffer != NULL)
|
||||||
{
|
{
|
||||||
if (m_status == SFX_PLAYING || m_status == SFX_PAUSED)
|
if (m_status == SFX_PLAYING || m_status == SFX_PAUSED)
|
||||||
reallyStopNow();
|
reallyStopNow();
|
||||||
|
|
||||||
|
m_sound_buffer = buffer;
|
||||||
alSourcei(m_sound_source, AL_BUFFER, m_sound_buffer->getBufferID());
|
alSourcei(m_sound_source, AL_BUFFER, m_sound_buffer->getBufferID());
|
||||||
m_sound_buffer_changed = false;
|
|
||||||
|
|
||||||
if (!SFXManager::checkError("attaching the buffer to the source"))
|
if (!SFXManager::checkError("attaching the buffer to the source"))
|
||||||
return;
|
return;
|
||||||
@ -405,8 +404,11 @@ void SFXOpenAL::reallyPlayNow()
|
|||||||
/** This actually queues up the sfx in the sfx manager. It will be started
|
/** This actually queues up the sfx in the sfx manager. It will be started
|
||||||
* from a separate thread later (in this frame).
|
* from a separate thread later (in this frame).
|
||||||
*/
|
*/
|
||||||
void SFXOpenAL::play(const Vec3 &position)
|
void SFXOpenAL::play(const Vec3 &position, SFXBuffer* buffer)
|
||||||
{
|
{
|
||||||
|
if (m_owns_buffer && buffer != NULL)
|
||||||
|
assert(false); // sources that own a buffer cannot play any other buffer
|
||||||
|
|
||||||
if (m_status == SFX_UNKNOWN || !SFXManager::get()->sfxAllowed()) return;
|
if (m_status == SFX_UNKNOWN || !SFXManager::get()->sfxAllowed()) return;
|
||||||
|
|
||||||
if(m_status==SFX_STOPPED || m_status==SFX_NOT_INITIALISED)
|
if(m_status==SFX_STOPPED || m_status==SFX_NOT_INITIALISED)
|
||||||
@ -418,16 +420,15 @@ void SFXOpenAL::play(const Vec3 &position)
|
|||||||
// - which can happen if the sfx thread had no time to actually start
|
// - which can happen if the sfx thread had no time to actually start
|
||||||
// it yet.
|
// it yet.
|
||||||
m_status = SFX_PLAYING;
|
m_status = SFX_PLAYING;
|
||||||
SFXManager::get()->queue(SFXManager::SFX_PLAY_POSITION, this, position);
|
SFXManager::get()->queue(SFXManager::SFX_PLAY_POSITION, this, position, buffer);
|
||||||
} // play(Vec3)
|
} // play(Vec3)
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
/** Plays this sound effect.
|
/** Plays this sound effect.
|
||||||
*/
|
*/
|
||||||
void SFXOpenAL::reallyPlayNow(const Vec3 &position)
|
void SFXOpenAL::reallyPlayNow(const Vec3 &position, SFXBuffer* buffer)
|
||||||
{
|
{
|
||||||
reallySetPosition(position);
|
reallySetPosition(position);
|
||||||
reallyPlayNow();
|
reallyPlayNow(buffer);
|
||||||
} // reallyPlayNow(Vec3)
|
} // reallyPlayNow(Vec3)
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@ -543,18 +544,4 @@ void SFXOpenAL::setRolloff(float rolloff)
|
|||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
// TODO: make this thread-safe
|
|
||||||
void SFXOpenAL::setBuffer(SFXBuffer* buffer, bool owns_buffer)
|
|
||||||
{
|
|
||||||
if (m_owns_buffer && m_sound_buffer)
|
|
||||||
{
|
|
||||||
m_sound_buffer->unload();
|
|
||||||
delete m_sound_buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_sound_buffer = buffer;
|
|
||||||
m_owns_buffer = owns_buffer;
|
|
||||||
m_sound_buffer_changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif //if HAVE_OGGVORBIS
|
#endif //if HAVE_OGGVORBIS
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#endif
|
#endif
|
||||||
#include "audio/sfx_base.hpp"
|
#include "audio/sfx_base.hpp"
|
||||||
#include "utils/leak_check.hpp"
|
#include "utils/leak_check.hpp"
|
||||||
|
#include "utils/cpp2011.hpp"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief OpenAL implementation of the abstract SFXBase interface
|
* \brief OpenAL implementation of the abstract SFXBase interface
|
||||||
@ -75,19 +76,17 @@ private:
|
|||||||
/** How long the sfx has been playing. */
|
/** How long the sfx has been playing. */
|
||||||
float m_play_time;
|
float m_play_time;
|
||||||
|
|
||||||
bool m_sound_buffer_changed;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SFXOpenAL(SFXBuffer* buffer, bool positional, float volume,
|
SFXOpenAL(SFXBuffer* buffer, bool positional, float volume,
|
||||||
bool owns_buffer = false);
|
bool owns_buffer = false);
|
||||||
virtual ~SFXOpenAL();
|
virtual ~SFXOpenAL();
|
||||||
|
|
||||||
virtual void updatePlayingSFX(float dt);
|
virtual void updatePlayingSFX(float dt);
|
||||||
virtual bool init();
|
virtual bool init() OVERRIDE;
|
||||||
virtual void play();
|
virtual void play() OVERRIDE;
|
||||||
virtual void reallyPlayNow();
|
virtual void reallyPlayNow(SFXBuffer* buffer = NULL) OVERRIDE;
|
||||||
virtual void play(const Vec3 &xyz);
|
virtual void play(const Vec3 &xyz, SFXBuffer* buffer = NULL) OVERRIDE;
|
||||||
virtual void reallyPlayNow(const Vec3 &xyz);
|
virtual void reallyPlayNow(const Vec3 &xyz, SFXBuffer* buffer = NULL) OVERRIDE;
|
||||||
virtual void setLoop(bool status);
|
virtual void setLoop(bool status);
|
||||||
virtual void reallySetLoop(bool status);
|
virtual void reallySetLoop(bool status);
|
||||||
virtual void stop();
|
virtual void stop();
|
||||||
@ -119,8 +118,6 @@ public:
|
|||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
/** Returns the buffer associated with this sfx. */
|
/** Returns the buffer associated with this sfx. */
|
||||||
virtual const SFXBuffer* getBuffer() const { return m_sound_buffer; }
|
virtual const SFXBuffer* getBuffer() const { return m_sound_buffer; }
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
virtual void setBuffer(SFXBuffer* buffer, bool owns_buffer);
|
|
||||||
|
|
||||||
}; // SFXOpenAL
|
}; // SFXOpenAL
|
||||||
|
|
||||||
|
@ -170,6 +170,13 @@ Kart::Kart (const std::string& ident, unsigned int world_kart_id,
|
|||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
m_horn_sound = SFXManager::get()->getBuffer("horn");
|
||||||
|
m_crash_sound = SFXManager::get()->getBuffer("crash");
|
||||||
|
m_crash_sound2 = SFXManager::get()->getBuffer("crash2");
|
||||||
|
m_crash_sound3 = SFXManager::get()->getBuffer("crash3");
|
||||||
|
m_goo_sound = SFXManager::get()->getBuffer("goo");
|
||||||
|
m_boing_sound = SFXManager::get()->getBuffer("boing");
|
||||||
|
|
||||||
m_engine_sound = SFXManager::get()->createSoundSource(m_kart_properties->getEngineSfxType());
|
m_engine_sound = SFXManager::get()->createSoundSource(m_kart_properties->getEngineSfxType());
|
||||||
m_emitter_1 = SFXManager::get()->createSoundSource("crash");
|
m_emitter_1 = SFXManager::get()->createSoundSource("crash");
|
||||||
m_emitter_2 = SFXManager::get()->createSoundSource("crash");
|
m_emitter_2 = SFXManager::get()->createSoundSource("crash");
|
||||||
@ -1020,11 +1027,8 @@ void Kart::collectedItem(Item *item, int add_info)
|
|||||||
m_kart_properties->getBubblegumSpeedFraction() ,
|
m_kart_properties->getBubblegumSpeedFraction() ,
|
||||||
m_kart_properties->getBubblegumFadeInTime(),
|
m_kart_properties->getBubblegumFadeInTime(),
|
||||||
m_bubblegum_time);
|
m_bubblegum_time);
|
||||||
{
|
getNextEmitter()->play(getXYZ(), m_goo_sound);
|
||||||
SFXBase* emitter = getNextEmitter();
|
|
||||||
emitter->setBuffer(SFXManager::get()->getBuffer("goo"), false);
|
|
||||||
emitter->play(getXYZ());
|
|
||||||
}
|
|
||||||
// Play appropriate custom character sound
|
// Play appropriate custom character sound
|
||||||
playCustomSFX(SFXManager::CUSTOM_GOO);
|
playCustomSFX(SFXManager::CUSTOM_GOO);
|
||||||
break;
|
break;
|
||||||
@ -2158,22 +2162,20 @@ void Kart::playCrashSFX(const Material* m, AbstractKart *k)
|
|||||||
// it's not already playing.
|
// it's not already playing.
|
||||||
if (isShielded() || (k != NULL && k->isShielded()))
|
if (isShielded() || (k != NULL && k->isShielded()))
|
||||||
{
|
{
|
||||||
SFXBase* emitter = getNextEmitter();
|
getNextEmitter()->play(getXYZ(), m_boing_sound);
|
||||||
emitter->setBuffer(SFXManager::get()->getBuffer("boing"), false);
|
|
||||||
emitter->play(getXYZ());
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int idx = rand() % 3;
|
int idx = rand() % 3;
|
||||||
|
SFXBuffer* buffer;
|
||||||
SFXBase* emitter = getNextEmitter();
|
|
||||||
if (idx == 0)
|
if (idx == 0)
|
||||||
emitter->setBuffer(SFXManager::get()->getBuffer("crash"), false);
|
buffer = m_crash_sound;
|
||||||
else if (idx == 1)
|
else if (idx == 1)
|
||||||
emitter->setBuffer(SFXManager::get()->getBuffer("crash2"), false);
|
buffer = m_crash_sound2;
|
||||||
else
|
else
|
||||||
emitter->setBuffer(SFXManager::get()->getBuffer("crash3"), false);
|
buffer = m_crash_sound3;
|
||||||
emitter->play(getXYZ());
|
|
||||||
|
getNextEmitter()->play(getXYZ(), buffer);
|
||||||
}
|
}
|
||||||
} // if lin_vel > 0.555
|
} // if lin_vel > 0.555
|
||||||
} // if m_bounce_back_time <= 0
|
} // if m_bounce_back_time <= 0
|
||||||
@ -2187,9 +2189,7 @@ void Kart::beep()
|
|||||||
// If the custom horn can't play (isn't defined) then play the default one
|
// If the custom horn can't play (isn't defined) then play the default one
|
||||||
if (!playCustomSFX(SFXManager::CUSTOM_HORN))
|
if (!playCustomSFX(SFXManager::CUSTOM_HORN))
|
||||||
{
|
{
|
||||||
SFXBase* emitter = getNextEmitter();
|
getNextEmitter()->play(getXYZ(), m_horn_sound);
|
||||||
emitter->setBuffer(SFXManager::get()->getBuffer("horn"), false);
|
|
||||||
emitter->play(getXYZ());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // beep
|
} // beep
|
||||||
|
@ -210,19 +210,19 @@ protected:
|
|||||||
SFXBase *m_emitter_1;
|
SFXBase *m_emitter_1;
|
||||||
SFXBase *m_emitter_2;
|
SFXBase *m_emitter_2;
|
||||||
SFXBase *m_emitter_3;
|
SFXBase *m_emitter_3;
|
||||||
//SFXBase *m_beep_sound;
|
|
||||||
SFXBase *m_engine_sound;
|
SFXBase *m_engine_sound;
|
||||||
//SFXBase *m_crash_sound;
|
|
||||||
//SFXBase *m_crash_sound2;
|
|
||||||
//SFXBase *m_crash_sound3;
|
|
||||||
SFXBase *m_terrain_sound;
|
SFXBase *m_terrain_sound;
|
||||||
SFXBase *m_nitro_sound;
|
SFXBase *m_nitro_sound;
|
||||||
/** A pointer to the previous terrain sound needs to be saved so that an
|
/** A pointer to the previous terrain sound needs to be saved so that an
|
||||||
* 'older' sfx can be finished and an abrupt end of the sfx is avoided. */
|
* 'older' sfx can be finished and an abrupt end of the sfx is avoided. */
|
||||||
SFXBase *m_previous_terrain_sound;
|
SFXBase *m_previous_terrain_sound;
|
||||||
SFXBase *m_skid_sound;
|
SFXBase *m_skid_sound;
|
||||||
//SFXBase *m_goo_sound;
|
SFXBuffer *m_horn_sound;
|
||||||
//SFXBase *m_boing_sound;
|
SFXBuffer *m_crash_sound;
|
||||||
|
SFXBuffer *m_crash_sound2;
|
||||||
|
SFXBuffer *m_crash_sound3;
|
||||||
|
SFXBuffer *m_goo_sound;
|
||||||
|
SFXBuffer *m_boing_sound;
|
||||||
float m_time_last_crash;
|
float m_time_last_crash;
|
||||||
RaceManager::KartType m_type;
|
RaceManager::KartType m_type;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user