#include "aosfxplayer.h" #include "file_functions.h" AOSfxPlayer::AOSfxPlayer(AOApplication *ao_app) : ao_app(ao_app) {} AOSfxPlayer::~AOSfxPlayer() { for (int i = 0; i < STREAM_COUNT; ++i) { ma_sound_uninit(&m_stream[i]); } } void AOSfxPlayer::setVolume(int value) { m_volume = value / 100.0f; updateInternalVolume(); } void AOSfxPlayer::setMuted(bool enabled) { m_muted = enabled; updateInternalVolume(); } void AOSfxPlayer::play(QString path) { for (int i = 0; i < STREAM_COUNT; ++i) { if (ma_sound_is_playing(&m_stream[i])) { m_current_stream_id = (i + 1) % STREAM_COUNT; } else { m_current_stream_id = i; break; } } ma_sound_uninit(&m_stream[m_current_stream_id]); if (ma_sound_init_from_file(&ao_app->audio_engine, qPrintable(path), MA_SOUND_FLAG_ASYNC | MA_SOUND_FLAG_DECODE | MA_SOUND_FLAG_NO_SPATIALIZATION | MA_SOUND_FLAG_NO_PITCH, nullptr, nullptr, &m_stream[m_current_stream_id]) != MA_SUCCESS) { return; } updateInternalVolume(); ma_sound_start(&m_stream[m_current_stream_id]); } void AOSfxPlayer::findAndPlaySfx(QString sfx) { // 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)) { play(file_path); } } void AOSfxPlayer::stopAll() { for (int i = 0; i < STREAM_COUNT; ++i) { stop(i); } } void AOSfxPlayer::stopAllLoopingStream() { for (int i = 0; i < STREAM_COUNT; ++i) { if (ma_sound_is_looping(&m_stream[i])) { stop(i); } } } void AOSfxPlayer::stop(int streamId) { streamId = maybeFetchCurrentStreamId(streamId); if (!ensureValidStreamId(streamId)) { qWarning().noquote() << QObject::tr("Failed to stop stream; invalid stream ID '%1'").arg(streamId); return; } ma_sound_stop(&m_stream[streamId]); } void AOSfxPlayer::updateInternalVolume() { for (int i = 0; i < STREAM_COUNT; ++i) { ma_sound_set_volume(&m_stream[i], m_muted ? 0.0f : qBound(0.0f, m_volume, 1.0f)); } } void AOSfxPlayer::setLooping(bool toggle, int streamId) { streamId = maybeFetchCurrentStreamId(streamId); if (!ensureValidStreamId(streamId)) { qWarning().noquote() << QObject::tr("Failed to setup stream loop; invalid stream ID '%1'").arg(streamId); return; } ma_sound_set_looping(&m_stream[streamId], toggle); } int AOSfxPlayer::maybeFetchCurrentStreamId(int streamId) { return streamId == -1 ? m_current_stream_id : streamId; } bool AOSfxPlayer::ensureValidStreamId(int streamId) { return streamId >= 0 && streamId < STREAM_COUNT; }