aboutsummaryrefslogtreecommitdiff
path: root/src/aosfxplayer.cpp
diff options
context:
space:
mode:
authoroldmud0 <oldmud0@users.noreply.github.com>2020-05-22 19:17:55 -0500
committeroldmud0 <oldmud0@users.noreply.github.com>2020-05-22 19:17:55 -0500
commitfd1855b8d0ecaa56ae3165ad5d8f3bd65ff77a64 (patch)
tree9c27d658dd8f19e649e1742b0fd39104a50a3ca6 /src/aosfxplayer.cpp
parent8928aa2718378bc42d20d5bbe6c17be68d65d6f3 (diff)
parent4617e3135ed14a28c4129154486022947fda9d82 (diff)
Merge KFO source unconditionally into AO2
Diffstat (limited to 'src/aosfxplayer.cpp')
-rw-r--r--src/aosfxplayer.cpp104
1 files changed, 87 insertions, 17 deletions
diff --git a/src/aosfxplayer.cpp b/src/aosfxplayer.cpp
index 543da5ca..6db6f375 100644
--- a/src/aosfxplayer.cpp
+++ b/src/aosfxplayer.cpp
@@ -8,18 +8,44 @@ 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()
{
- 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 (BASS_ChannelIsActive(m_stream_list[channel]) == BASS_ACTIVE_PLAYING)
+ m_channel = (m_channel + 1) % m_channelmax;
+ channel = m_channel;
+ }
+
+ BASS_ChannelStop(m_stream_list[channel]);
QString misc_path = "";
QString char_path = "";
- QString sound_path = ao_app->get_sounds_path(p_sfx);
+ QString sound_path = ao_app->get_sfx_suffix(ao_app->get_sounds_path(p_sfx));
if (shout != "")
- misc_path = ao_app->get_base_path() + "misc/" + shout + "/" + p_sfx;
+ misc_path = ao_app->get_sfx_suffix(ao_app->get_base_path() + "misc/" +
+ shout + "/" + p_sfx);
if (p_char != "")
- char_path = ao_app->get_character_path(p_char, p_sfx);
+ char_path =
+ ao_app->get_sfx_suffix(ao_app->get_character_path(p_char, p_sfx));
QString f_path;
@@ -30,24 +56,60 @@ 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);
+ if (f_path.endsWith(".opus"))
+ m_stream_list[channel] = BASS_OPUS_StreamCreateFile(
+ FALSE, f_path.utf16(), 0, 0,
+ BASS_STREAM_AUTOFREE | BASS_UNICODE | BASS_ASYNCFILE);
+ else
+ m_stream_list[channel] = BASS_StreamCreateFile(
+ FALSE, f_path.utf16(), 0, 0,
+ BASS_STREAM_AUTOFREE | BASS_UNICODE | BASS_ASYNCFILE);
set_volume(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(int channel)
+{
+ if (channel == -1) {
+ channel = m_channel;
+ }
+ BASS_ChannelStop(m_stream_list[channel]);
}
-void AOSfxPlayer::stop() { BASS_ChannelStop(m_stream); }
+void AOSfxPlayer::set_volume(qreal p_value)
+{
+ m_volume = p_value / 100;
+ set_volume_internal(m_volume);
+}
void AOSfxPlayer::set_volume(int p_value)
{
- m_volume = p_value;
- float volume = p_value / 100.0f;
- 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)
@@ -82,7 +144,7 @@ void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout)
{
m_sfx.setSource(QUrl::fromLocalFile(f_path));
- set_volume(m_volume);
+ set_volume_internal(m_volume);
m_sfx.play();
}
@@ -90,7 +152,13 @@ void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout)
void AOSfxPlayer::stop() { m_sfx.stop(); }
-void AOSfxPlayer::set_volume(int p_value)
+void AOSfxPlayer::set_volume(qreal p_value)
+{
+ m_volume = p_value / 100;
+ set_volume_internal(m_volume);
+}
+
+void AOSfxPlayer::set_volume_internal(qreal p_value)
{
m_volume = p_value;
m_sfx.setVolume(m_volume);
@@ -106,5 +174,7 @@ void AOSfxPlayer::play(QString p_sfx, QString p_char, QString shout) {}
void AOSfxPlayer::stop() {}
-void AOSfxPlayer::set_volume(int p_value) {}
+void AOSfxPlayer::set_volume(qreal p_value) {}
+
+void AOSfxPlayer::set_volume_internal(qreal p_value) {}
#endif