Looping SFX system - Defined this way:
[SoundL] sfx-roar = 1
This commit is contained in:
parent
a2f9df4042
commit
e94640b349
@ -151,6 +151,9 @@ public:
|
|||||||
//Returns true if blank blips is enabled in config.ini and false otherwise
|
//Returns true if blank blips is enabled in config.ini and false otherwise
|
||||||
bool get_blank_blip();
|
bool get_blank_blip();
|
||||||
|
|
||||||
|
//Returns true if looping sound effects are enabled in the config.ini
|
||||||
|
bool get_looping_sfx();
|
||||||
|
|
||||||
//Returns true if stop music on objection is enabled in the config.ini
|
//Returns true if stop music on objection is enabled in the config.ini
|
||||||
bool objection_stop_music();
|
bool objection_stop_music();
|
||||||
|
|
||||||
|
@ -18,19 +18,24 @@ class AOSfxPlayer
|
|||||||
public:
|
public:
|
||||||
AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app);
|
AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app);
|
||||||
|
|
||||||
void play(QString p_sfx, QString p_char = "", QString shout = "");
|
void clear();
|
||||||
void stop();
|
void loop_clear();
|
||||||
|
void play(QString p_sfx, QString p_char = "", QString shout = "", int channel=-1);
|
||||||
|
void stop(int channel=-1);
|
||||||
void set_volume(qreal p_volume);
|
void set_volume(qreal p_volume);
|
||||||
|
void set_looping(bool toggle, int channel=-1);
|
||||||
|
int m_channel = 0;
|
||||||
private:
|
private:
|
||||||
QWidget *m_parent;
|
QWidget *m_parent;
|
||||||
AOApplication *ao_app;
|
AOApplication *ao_app;
|
||||||
qreal m_volume = 0;
|
qreal m_volume = 0;
|
||||||
|
|
||||||
|
bool m_looping = true;
|
||||||
void set_volume_internal(qreal p_volume);
|
void set_volume_internal(qreal p_volume);
|
||||||
|
|
||||||
#if defined(BASSAUDIO)
|
#if defined(BASSAUDIO)
|
||||||
HSTREAM m_stream;
|
const int m_channelmax = 5;
|
||||||
|
HSTREAM m_stream_list[5];
|
||||||
#elif defined(QTAUDIO)
|
#elif defined(QTAUDIO)
|
||||||
QSoundEffect m_sfx;
|
QSoundEffect m_sfx;
|
||||||
#endif
|
#endif
|
||||||
|
@ -67,26 +67,34 @@ void AOCharMovie::load_image(QString p_char, QString p_emote, QString emote_pref
|
|||||||
movie_effects.resize(max_frames);
|
movie_effects.resize(max_frames);
|
||||||
for (int e_frame = 0; e_frame < max_frames; ++e_frame)
|
for (int e_frame = 0; e_frame < max_frames; ++e_frame)
|
||||||
{
|
{
|
||||||
|
#ifdef DEBUG_CHARMOVIE
|
||||||
qDebug() << p_char << p_emote << e_frame;
|
qDebug() << p_char << p_emote << e_frame;
|
||||||
|
#endif
|
||||||
QString effect = ao_app->get_screenshake_frame(p_char, emote_prefix + p_emote, e_frame);
|
QString effect = ao_app->get_screenshake_frame(p_char, emote_prefix + p_emote, e_frame);
|
||||||
if (effect != "")
|
if (effect != "")
|
||||||
{
|
{
|
||||||
movie_effects[e_frame].append("shake");
|
movie_effects[e_frame].append("shake");
|
||||||
|
#ifdef DEBUG_CHARMOVIE
|
||||||
qDebug() << e_frame << "shake";
|
qDebug() << e_frame << "shake";
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
effect = ao_app->get_flash_frame(p_char, emote_prefix + p_emote, e_frame);
|
effect = ao_app->get_flash_frame(p_char, emote_prefix + p_emote, e_frame);
|
||||||
if (effect != "")
|
if (effect != "")
|
||||||
{
|
{
|
||||||
movie_effects[e_frame].append("flash");
|
movie_effects[e_frame].append("flash");
|
||||||
|
#ifdef DEBUG_CHARMOVIE
|
||||||
qDebug() << e_frame << "flash";
|
qDebug() << e_frame << "flash";
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
effect = ao_app->get_sfx_frame(p_char, emote_prefix + p_emote, e_frame);
|
effect = ao_app->get_sfx_frame(p_char, emote_prefix + p_emote, e_frame);
|
||||||
if (effect != "")
|
if (effect != "")
|
||||||
{
|
{
|
||||||
movie_effects[e_frame].append("sfx^"+effect);
|
movie_effects[e_frame].append("sfx^"+effect);
|
||||||
|
#ifdef DEBUG_CHARMOVIE
|
||||||
qDebug() << e_frame << effect;
|
qDebug() << e_frame << effect;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef DEBUG_CHARMOVIE
|
#ifdef DEBUG_CHARMOVIE
|
||||||
@ -138,20 +146,26 @@ void AOCharMovie::play_frame_effect(int frame)
|
|||||||
if(effect == "shake")
|
if(effect == "shake")
|
||||||
{
|
{
|
||||||
shake();
|
shake();
|
||||||
|
#ifdef DEBUG_CHARMOVIE
|
||||||
qDebug() << "Attempting to play shake on frame" << frame;
|
qDebug() << "Attempting to play shake on frame" << frame;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if(effect == "flash")
|
if(effect == "flash")
|
||||||
{
|
{
|
||||||
flash();
|
flash();
|
||||||
|
#ifdef DEBUG_CHARMOVIE
|
||||||
qDebug() << "Attempting to play flash on frame" << frame;
|
qDebug() << "Attempting to play flash on frame" << frame;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if(effect.startsWith("sfx^"))
|
if(effect.startsWith("sfx^"))
|
||||||
{
|
{
|
||||||
QString sfx = effect.section("^", 1);
|
QString sfx = effect.section("^", 1);
|
||||||
play_sfx(sfx);
|
play_sfx(sfx);
|
||||||
|
#ifdef DEBUG_CHARMOVIE
|
||||||
qDebug() << "Attempting to play sfx" << sfx << "on frame" << frame;
|
qDebug() << "Attempting to play sfx" << sfx << "on frame" << frame;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,9 +8,35 @@ AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app)
|
|||||||
ao_app = p_ao_app;
|
ao_app = p_ao_app;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout)
|
void AOSfxPlayer::clear()
|
||||||
{
|
{
|
||||||
BASS_ChannelStop(m_stream);
|
for (int n_stream = 0 ; n_stream < m_channelmax ; ++n_stream)
|
||||||
|
{
|
||||||
|
BASS_ChannelStop(m_stream_list[n_stream]);
|
||||||
|
}
|
||||||
|
set_volume_internal(m_volume);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AOSfxPlayer::loop_clear()
|
||||||
|
{
|
||||||
|
for (int n_stream = 0 ; n_stream < m_channelmax ; ++n_stream)
|
||||||
|
{
|
||||||
|
if((BASS_ChannelFlags(m_stream_list[n_stream], 0, 0)&BASS_SAMPLE_LOOP))
|
||||||
|
BASS_ChannelStop(m_stream_list[n_stream]);
|
||||||
|
}
|
||||||
|
set_volume_internal(m_volume);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout, int channel)
|
||||||
|
{
|
||||||
|
if (channel == -1)
|
||||||
|
{
|
||||||
|
if (m_stream_list[channel] != NULL)
|
||||||
|
m_channel = (m_channel + 1) % m_channelmax;
|
||||||
|
channel = m_channel;
|
||||||
|
}
|
||||||
|
|
||||||
|
BASS_ChannelStop(m_stream_list[channel]);
|
||||||
|
|
||||||
QString misc_path = "";
|
QString misc_path = "";
|
||||||
QString char_path = "";
|
QString char_path = "";
|
||||||
@ -30,18 +56,22 @@ void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout)
|
|||||||
else
|
else
|
||||||
f_path = sound_path;
|
f_path = sound_path;
|
||||||
|
|
||||||
m_stream = BASS_StreamCreateFile(FALSE, f_path.utf16(), 0, 0, BASS_STREAM_AUTOFREE | BASS_UNICODE | BASS_ASYNCFILE);
|
m_stream_list[channel] = BASS_StreamCreateFile(FALSE, f_path.utf16(), 0, 0, BASS_STREAM_AUTOFREE | BASS_UNICODE | BASS_ASYNCFILE);
|
||||||
|
|
||||||
set_volume_internal(m_volume);
|
set_volume_internal(m_volume);
|
||||||
|
|
||||||
if (ao_app->get_audio_output_device() != "default")
|
if (ao_app->get_audio_output_device() != "default")
|
||||||
BASS_ChannelSetDevice(m_stream, BASS_GetDevice());
|
BASS_ChannelSetDevice(m_stream_list[m_channel], BASS_GetDevice());
|
||||||
BASS_ChannelPlay(m_stream, false);
|
BASS_ChannelPlay(m_stream_list[m_channel], false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AOSfxPlayer::stop()
|
void AOSfxPlayer::stop(int channel)
|
||||||
{
|
{
|
||||||
BASS_ChannelStop(m_stream);
|
if (channel == -1)
|
||||||
|
{
|
||||||
|
channel = m_channel;
|
||||||
|
}
|
||||||
|
BASS_ChannelStop(m_stream_list[channel]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AOSfxPlayer::set_volume(qreal p_value)
|
void AOSfxPlayer::set_volume(qreal p_value)
|
||||||
@ -52,8 +82,30 @@ void AOSfxPlayer::set_volume(qreal p_value)
|
|||||||
|
|
||||||
void AOSfxPlayer::set_volume_internal(qreal p_value)
|
void AOSfxPlayer::set_volume_internal(qreal p_value)
|
||||||
{
|
{
|
||||||
float volume = p_value;
|
float volume = static_cast<float>(p_value);
|
||||||
BASS_ChannelSetAttribute(m_stream, BASS_ATTRIB_VOL, volume);
|
for (int n_stream = 0 ; n_stream < m_channelmax ; ++n_stream)
|
||||||
|
{
|
||||||
|
BASS_ChannelSetAttribute(m_stream_list[n_stream], BASS_ATTRIB_VOL, volume);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AOSfxPlayer::set_looping(bool toggle, int channel)
|
||||||
|
{
|
||||||
|
if (channel == -1)
|
||||||
|
{
|
||||||
|
channel = m_channel;
|
||||||
|
}
|
||||||
|
m_looping = toggle;
|
||||||
|
if (BASS_ChannelFlags(m_stream_list[channel], 0, 0) & BASS_SAMPLE_LOOP)
|
||||||
|
{
|
||||||
|
if (m_looping == false)
|
||||||
|
BASS_ChannelFlags(m_stream_list[channel], 0, BASS_SAMPLE_LOOP); // remove the LOOP flag
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (m_looping == true)
|
||||||
|
BASS_ChannelFlags(m_stream_list[channel], BASS_SAMPLE_LOOP, BASS_SAMPLE_LOOP); // set the LOOP flag
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#elif defined(QTAUDIO) //Using Qt's QSoundEffect class
|
#elif defined(QTAUDIO) //Using Qt's QSoundEffect class
|
||||||
AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app)
|
AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app)
|
||||||
|
@ -1425,7 +1425,7 @@ void Courtroom::handle_chatmessage(QStringList *p_contents)
|
|||||||
default:
|
default:
|
||||||
qDebug() << "W: Logic error in objection switch statement!";
|
qDebug() << "W: Logic error in objection switch statement!";
|
||||||
}
|
}
|
||||||
|
sfx_player->clear(); //Objection played! Cut all sfx.
|
||||||
int emote_mod = m_chatmessage[EMOTE_MOD].toInt();
|
int emote_mod = m_chatmessage[EMOTE_MOD].toInt();
|
||||||
|
|
||||||
if (emote_mod == 0)
|
if (emote_mod == 0)
|
||||||
@ -1444,6 +1444,8 @@ void Courtroom::handle_chatmessage_2()
|
|||||||
{
|
{
|
||||||
ui_vp_speedlines->stop();
|
ui_vp_speedlines->stop();
|
||||||
ui_vp_player_char->stop();
|
ui_vp_player_char->stop();
|
||||||
|
//Clear all looping sfx to prevent obnoxiousness
|
||||||
|
sfx_player->loop_clear();
|
||||||
|
|
||||||
if (m_chatmessage[SHOWNAME].isEmpty() || !ui_showname_enable->isChecked())
|
if (m_chatmessage[SHOWNAME].isEmpty() || !ui_showname_enable->isChecked())
|
||||||
{
|
{
|
||||||
@ -2470,6 +2472,7 @@ void Courtroom::play_sfx()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
sfx_player->play(ao_app->get_sfx_suffix(sfx_name));
|
sfx_player->play(ao_app->get_sfx_suffix(sfx_name));
|
||||||
|
sfx_player->set_looping(ao_app->get_sfx_looping(current_char, sfx_name)!="0");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Courtroom::set_scene()
|
void Courtroom::set_scene()
|
||||||
|
@ -638,6 +638,12 @@ bool AOApplication::get_blank_blip()
|
|||||||
return result.startsWith("true");
|
return result.startsWith("true");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AOApplication::get_looping_sfx()
|
||||||
|
{
|
||||||
|
QString result = configini->value("looping_sfx", "true").value<QString>();
|
||||||
|
return result.startsWith("true");
|
||||||
|
}
|
||||||
|
|
||||||
bool AOApplication::objection_stop_music()
|
bool AOApplication::objection_stop_music()
|
||||||
{
|
{
|
||||||
QString result = configini->value("objection_stop_music", "false").value<QString>();
|
QString result = configini->value("objection_stop_music", "false").value<QString>();
|
||||||
|
Loading…
Reference in New Issue
Block a user