diff options
Diffstat (limited to 'src/aosfxplayer.cpp')
| -rw-r--r-- | src/aosfxplayer.cpp | 140 |
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; +} |
