aboutsummaryrefslogtreecommitdiff
path: root/src/aosfxplayer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/aosfxplayer.cpp')
-rw-r--r--src/aosfxplayer.cpp140
1 files changed, 87 insertions, 53 deletions
diff --git a/src/aosfxplayer.cpp b/src/aosfxplayer.cpp
index 1b9be002..96b5d454 100644
--- a/src/aosfxplayer.cpp
+++ b/src/aosfxplayer.cpp
@@ -2,111 +2,135 @@
#include "file_functions.h"
-AOSfxPlayer::AOSfxPlayer(AOApplication *p_ao_app)
- : ao_app(p_ao_app)
+AOSfxPlayer::AOSfxPlayer(AOApplication *ao_app)
+ : ao_app(ao_app)
{}
-void AOSfxPlayer::clear()
+int AOSfxPlayer::volume()
{
- for (int n_stream = 0; n_stream < CHANNEL_COUNT; ++n_stream)
- {
- BASS_ChannelStop(m_stream_list[n_stream]);
- }
- set_volume_internal(m_volume);
+ return m_volume * 100;
}
-void AOSfxPlayer::loop_clear()
+void AOSfxPlayer::setVolume(int value)
{
- for (int n_stream = 0; n_stream < CHANNEL_COUNT; ++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);
+ m_volume = value;
+ updateInternalVolume();
}
-void AOSfxPlayer::play(QString p_sfx, QString p_character, QString p_misc)
+void AOSfxPlayer::play(QString path)
{
- for (int i = 0; i < CHANNEL_COUNT; ++i)
+ for (int i = 0; i < STREAM_COUNT; ++i)
{
- if (BASS_ChannelIsActive(m_stream_list[i]) == BASS_ACTIVE_PLAYING)
+ if (BASS_ChannelIsActive(m_stream[i]) == BASS_ACTIVE_PLAYING)
{
- m_channel = (i + 1) % CHANNEL_COUNT;
+ m_current_stream_id = (i + 1) % STREAM_COUNT;
}
else
{
- m_channel = i;
+ m_current_stream_id = i;
break;
}
}
- QString path = ao_app->get_sfx(p_sfx, p_misc, p_character);
+
if (path.endsWith(".opus"))
{
- m_stream_list[m_channel] = BASS_OPUS_StreamCreateFile(FALSE, path.utf16(), 0, 0, BASS_STREAM_AUTOFREE | BASS_UNICODE | BASS_ASYNCFILE);
+ m_stream[m_current_stream_id] = BASS_OPUS_StreamCreateFile(FALSE, path.utf16(), 0, 0, BASS_STREAM_AUTOFREE | BASS_UNICODE | BASS_ASYNCFILE);
}
else
{
- m_stream_list[m_channel] = BASS_StreamCreateFile(FALSE, path.utf16(), 0, 0, BASS_STREAM_AUTOFREE | BASS_UNICODE | BASS_ASYNCFILE);
+ m_stream[m_current_stream_id] = BASS_StreamCreateFile(FALSE, path.utf16(), 0, 0, BASS_STREAM_AUTOFREE | BASS_UNICODE | BASS_ASYNCFILE);
}
- set_volume_internal(m_volume);
+ updateInternalVolume();
- BASS_ChannelSetDevice(m_stream_list[m_channel], BASS_GetDevice());
- BASS_ChannelPlay(m_stream_list[m_channel], false);
- BASS_ChannelSetSync(m_stream_list[m_channel], BASS_SYNC_DEV_FAIL, 0, ao_app->BASSreset, 0);
+ BASS_ChannelSetDevice(m_stream[m_current_stream_id], BASS_GetDevice());
+ BASS_ChannelPlay(m_stream[m_current_stream_id], false);
+ BASS_ChannelSetSync(m_stream[m_current_stream_id], BASS_SYNC_DEV_FAIL, 0, ao_app->BASSreset, 0);
}
-void AOSfxPlayer::stop(int channel)
+void AOSfxPlayer::findAndPlaySfx(QString sfx)
{
- if (channel == -1)
+ // TODO replace this with proper pathing tools
+ findAndPlayCharacterShout(sfx, QString(), QString());
+}
+
+void AOSfxPlayer::findAndPlayCharacterSfx(QString sfx, QString character)
+{
+ // TODO replace this with proper pathing tools
+ findAndPlayCharacterShout(sfx, character, QString());
+}
+
+void AOSfxPlayer::findAndPlayCharacterShout(QString shout, QString character, QString group)
+{
+ QString file_path = ao_app->get_sfx(shout, group, character);
+ if (file_exists(file_path))
{
- channel = m_channel;
+ play(file_path);
}
- BASS_ChannelStop(m_stream_list[channel]);
}
-void AOSfxPlayer::set_muted(bool toggle)
+void AOSfxPlayer::stopAll()
{
- m_muted = toggle;
- // Update the audio volume
- set_volume_internal(m_volume);
+ for (int i = 0; i < STREAM_COUNT; ++i)
+ {
+ stop(i);
+ }
}
-int AOSfxPlayer::get_volume()
+void AOSfxPlayer::stopAllLoopingStream()
{
- return m_volume * 100;
+ for (int i = 0; i < STREAM_COUNT; ++i)
+ {
+ if (BASS_ChannelFlags(m_stream[i], 0, 0) & BASS_SAMPLE_LOOP)
+ {
+ stop(i);
+ }
+ }
}
-void AOSfxPlayer::set_volume(qreal p_value)
+void AOSfxPlayer::stop(int streamId)
{
- m_volume = p_value * 0.01;
- set_volume_internal(m_volume);
+ streamId = maybeFetchCurrentStreamId(streamId);
+ if (!ensureValidStreamId(streamId))
+ {
+ qWarning().noquote() << QObject::tr("Failed to stop stream; invalid stream ID '%1'").arg(streamId);
+ return;
+ }
+
+ BASS_ChannelStop(m_stream[streamId]);
}
-void AOSfxPlayer::set_volume_internal(qreal p_value)
+void AOSfxPlayer::setMuted(bool toggle)
{
- // If muted, volume will always be 0
- float volume = static_cast<float>(p_value) * !m_muted;
- for (int n_stream = 0; n_stream < CHANNEL_COUNT; ++n_stream)
+ m_muted = toggle;
+ // Update the audio volume
+ updateInternalVolume();
+}
+
+void AOSfxPlayer::updateInternalVolume()
+{
+ float volume = m_muted ? 0.0f : m_volume;
+ for (int i = 0; i < STREAM_COUNT; ++i)
{
- BASS_ChannelSetAttribute(m_stream_list[n_stream], BASS_ATTRIB_VOL, volume);
+ BASS_ChannelSetAttribute(m_stream[i], BASS_ATTRIB_VOL, volume);
}
}
-void AOSfxPlayer::set_looping(bool toggle, int channel)
+void AOSfxPlayer::setLooping(bool toggle, int streamId)
{
- if (channel == -1)
+ streamId = maybeFetchCurrentStreamId(streamId);
+ if (!ensureValidStreamId(streamId))
{
- channel = m_channel;
+ qWarning().noquote() << QObject::tr("Failed to setup stream loop; invalid stream ID '%1'").arg(streamId);
+ return;
}
+
m_looping = toggle;
- if (BASS_ChannelFlags(m_stream_list[channel], 0, 0) & BASS_SAMPLE_LOOP)
+ if (BASS_ChannelFlags(m_stream[streamId], 0, 0) & BASS_SAMPLE_LOOP)
{
if (m_looping == false)
{
- BASS_ChannelFlags(m_stream_list[channel], 0,
+ BASS_ChannelFlags(m_stream[streamId], 0,
BASS_SAMPLE_LOOP); // remove the LOOP flag
}
}
@@ -114,8 +138,18 @@ void AOSfxPlayer::set_looping(bool toggle, int channel)
{
if (m_looping == true)
{
- BASS_ChannelFlags(m_stream_list[channel], BASS_SAMPLE_LOOP,
+ BASS_ChannelFlags(m_stream[streamId], BASS_SAMPLE_LOOP,
BASS_SAMPLE_LOOP); // set the LOOP flag
}
}
}
+
+int AOSfxPlayer::maybeFetchCurrentStreamId(int streamId)
+{
+ return streamId == -1 ? m_current_stream_id : streamId;
+}
+
+bool AOSfxPlayer::ensureValidStreamId(int streamId)
+{
+ return streamId >= 0 && streamId < STREAM_COUNT;
+}