aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCrystalwarrior <varsash@gmail.com>2019-09-15 17:44:47 +0300
committerCrystalwarrior <varsash@gmail.com>2019-09-15 17:44:47 +0300
commite94640b3493700a266619388d75dac5e56b3189a (patch)
treeb24b8f976d40b64a8e0da04ebd5c3bc78017bdc4
parenta2f9df4042585ab0849b54e2bb0b9699f9064aed (diff)
Looping SFX system - Defined this way:
[SoundL] sfx-roar = 1
-rw-r--r--include/aoapplication.h3
-rw-r--r--include/aosfxplayer.h13
-rw-r--r--src/aocharmovie.cpp14
-rw-r--r--src/aosfxplayer.cpp70
-rw-r--r--src/courtroom.cpp5
-rw-r--r--src/text_file_functions.cpp6
6 files changed, 97 insertions, 14 deletions
diff --git a/include/aoapplication.h b/include/aoapplication.h
index 8164e166..88855968 100644
--- a/include/aoapplication.h
+++ b/include/aoapplication.h
@@ -151,6 +151,9 @@ public:
//Returns true if blank blips is enabled in config.ini and false otherwise
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
bool objection_stop_music();
diff --git a/include/aosfxplayer.h b/include/aosfxplayer.h
index 19d4bdf3..112e3ec6 100644
--- a/include/aosfxplayer.h
+++ b/include/aosfxplayer.h
@@ -18,19 +18,24 @@ class AOSfxPlayer
public:
AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app);
- void play(QString p_sfx, QString p_char = "", QString shout = "");
- void stop();
+ void clear();
+ 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_looping(bool toggle, int channel=-1);
+ int m_channel = 0;
private:
QWidget *m_parent;
AOApplication *ao_app;
qreal m_volume = 0;
+ bool m_looping = true;
void set_volume_internal(qreal p_volume);
#if defined(BASSAUDIO)
- HSTREAM m_stream;
+ const int m_channelmax = 5;
+ HSTREAM m_stream_list[5];
#elif defined(QTAUDIO)
QSoundEffect m_sfx;
#endif
diff --git a/src/aocharmovie.cpp b/src/aocharmovie.cpp
index efe24735..d67cf98e 100644
--- a/src/aocharmovie.cpp
+++ b/src/aocharmovie.cpp
@@ -67,26 +67,34 @@ void AOCharMovie::load_image(QString p_char, QString p_emote, QString emote_pref
movie_effects.resize(max_frames);
for (int e_frame = 0; e_frame < max_frames; ++e_frame)
{
+#ifdef DEBUG_CHARMOVIE
qDebug() << p_char << p_emote << e_frame;
+#endif
QString effect = ao_app->get_screenshake_frame(p_char, emote_prefix + p_emote, e_frame);
if (effect != "")
{
movie_effects[e_frame].append("shake");
+#ifdef DEBUG_CHARMOVIE
qDebug() << e_frame << "shake";
+#endif
}
effect = ao_app->get_flash_frame(p_char, emote_prefix + p_emote, e_frame);
if (effect != "")
{
movie_effects[e_frame].append("flash");
+#ifdef DEBUG_CHARMOVIE
qDebug() << e_frame << "flash";
+#endif
}
effect = ao_app->get_sfx_frame(p_char, emote_prefix + p_emote, e_frame);
if (effect != "")
{
movie_effects[e_frame].append("sfx^"+effect);
+#ifdef DEBUG_CHARMOVIE
qDebug() << e_frame << effect;
+#endif
}
}
#ifdef DEBUG_CHARMOVIE
@@ -138,20 +146,26 @@ void AOCharMovie::play_frame_effect(int frame)
if(effect == "shake")
{
shake();
+#ifdef DEBUG_CHARMOVIE
qDebug() << "Attempting to play shake on frame" << frame;
+#endif
}
if(effect == "flash")
{
flash();
+#ifdef DEBUG_CHARMOVIE
qDebug() << "Attempting to play flash on frame" << frame;
+#endif
}
if(effect.startsWith("sfx^"))
{
QString sfx = effect.section("^", 1);
play_sfx(sfx);
+#ifdef DEBUG_CHARMOVIE
qDebug() << "Attempting to play sfx" << sfx << "on frame" << frame;
+#endif
}
}
}
diff --git a/src/aosfxplayer.cpp b/src/aosfxplayer.cpp
index ad8ced60..b9410c8d 100644
--- a/src/aosfxplayer.cpp
+++ b/src/aosfxplayer.cpp
@@ -8,9 +8,35 @@ AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app)
ao_app = p_ao_app;
}
-void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout)
+void AOSfxPlayer::clear()
+{
+ 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()
{
- BASS_ChannelStop(m_stream);
+ 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 char_path = "";
@@ -30,18 +56,22 @@ void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout)
else
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);
if (ao_app->get_audio_output_device() != "default")
- BASS_ChannelSetDevice(m_stream, BASS_GetDevice());
- BASS_ChannelPlay(m_stream, false);
+ BASS_ChannelSetDevice(m_stream_list[m_channel], BASS_GetDevice());
+ 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)
@@ -52,8 +82,30 @@ void AOSfxPlayer::set_volume(qreal p_value)
void AOSfxPlayer::set_volume_internal(qreal p_value)
{
- float volume = p_value;
- BASS_ChannelSetAttribute(m_stream, BASS_ATTRIB_VOL, volume);
+ float volume = static_cast<float>(p_value);
+ 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
AOSfxPlayer::AOSfxPlayer(QWidget *parent, AOApplication *p_ao_app)
diff --git a/src/courtroom.cpp b/src/courtroom.cpp
index 30921d84..2aa82b52 100644
--- a/src/courtroom.cpp
+++ b/src/courtroom.cpp
@@ -1425,7 +1425,7 @@ void Courtroom::handle_chatmessage(QStringList *p_contents)
default:
qDebug() << "W: Logic error in objection switch statement!";
}
-
+ sfx_player->clear(); //Objection played! Cut all sfx.
int emote_mod = m_chatmessage[EMOTE_MOD].toInt();
if (emote_mod == 0)
@@ -1444,6 +1444,8 @@ void Courtroom::handle_chatmessage_2()
{
ui_vp_speedlines->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())
{
@@ -2470,6 +2472,7 @@ void Courtroom::play_sfx()
return;
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()
diff --git a/src/text_file_functions.cpp b/src/text_file_functions.cpp
index 0944040c..3d557c64 100644
--- a/src/text_file_functions.cpp
+++ b/src/text_file_functions.cpp
@@ -638,6 +638,12 @@ bool AOApplication::get_blank_blip()
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()
{
QString result = configini->value("objection_stop_music", "false").value<QString>();