2018-10-07 03:42:33 +00:00
|
|
|
#pragma once
|
2016-12-14 01:10:17 +00:00
|
|
|
|
2019-09-28 02:53:03 +00:00
|
|
|
#include <cstring>
|
|
|
|
#include <memory>
|
|
|
|
#include <optional>
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
#include "Runtime/RetroTypes.hpp"
|
|
|
|
#include "Runtime/Audio/CAudioSys.hpp"
|
|
|
|
|
2016-12-14 01:10:17 +00:00
|
|
|
#include "g721.h"
|
2019-09-28 02:53:03 +00:00
|
|
|
|
2023-10-22 16:21:20 +00:00
|
|
|
//#include <boo/audiodev/IAudioVoice.hpp>
|
|
|
|
//#include <boo/audiodev/IAudioVoiceEngine.hpp>
|
2016-12-14 01:10:17 +00:00
|
|
|
|
2021-04-10 08:42:06 +00:00
|
|
|
namespace metaforce {
|
2016-12-14 01:10:17 +00:00
|
|
|
class IDvdRequest;
|
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
class CStaticAudioPlayer {
|
|
|
|
std::string x0_path;
|
|
|
|
u32 x10_rsfRem = -1;
|
|
|
|
u32 x14_rsfLength;
|
|
|
|
u32 x18_curSamp = 0;
|
|
|
|
u32 x1c_loopStartSamp;
|
|
|
|
u32 x20_loopEndSamp;
|
|
|
|
// u32 x24_ = 0;
|
|
|
|
// std::unique_ptr<u8[]> x28_dmaLeft;
|
|
|
|
// std::unique_ptr<u8[]> x30_dmaRight;
|
|
|
|
std::vector<std::shared_ptr<IDvdRequest>> x38_dvdRequests;
|
|
|
|
std::vector<std::unique_ptr<u8[]>> x48_buffers;
|
|
|
|
g72x_state x58_leftState;
|
|
|
|
g72x_state x8c_rightState;
|
2019-06-12 02:05:17 +00:00
|
|
|
std::optional<g72x_state> m_leftStateLoop;
|
|
|
|
std::optional<g72x_state> m_rightStateLoop;
|
2018-12-08 05:30:43 +00:00
|
|
|
u32 xc0_volume = 32768; // Out of 32768
|
2016-12-14 01:10:17 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
static int16_t SampClamp(int32_t val) {
|
|
|
|
if (val < -32768)
|
|
|
|
val = -32768;
|
|
|
|
else if (val > 32767)
|
|
|
|
val = 32767;
|
|
|
|
return val;
|
|
|
|
}
|
2023-10-22 16:21:20 +00:00
|
|
|
/*
|
|
|
|
struct AudioVoiceCallback {
|
2018-12-08 05:30:43 +00:00
|
|
|
CStaticAudioPlayer& m_parent;
|
2019-08-09 12:45:18 +00:00
|
|
|
void preSupplyAudio(boo::IAudioVoice&, double) override {}
|
|
|
|
size_t supplyAudio(boo::IAudioVoice& voice, size_t frames, int16_t* data) override {
|
2018-12-08 05:30:43 +00:00
|
|
|
if (m_parent.IsReady()) {
|
|
|
|
m_parent.x38_dvdRequests.clear();
|
|
|
|
m_parent.Decode(data, frames);
|
|
|
|
} else
|
|
|
|
memset(data, 0, 4 * frames);
|
|
|
|
return frames;
|
|
|
|
}
|
2020-03-31 03:52:22 +00:00
|
|
|
explicit AudioVoiceCallback(CStaticAudioPlayer& p) : m_parent(p) {}
|
2018-12-08 05:30:43 +00:00
|
|
|
} m_voiceCallback;
|
|
|
|
boo::ObjToken<boo::IAudioVoice> m_voice;
|
2023-10-22 16:21:20 +00:00
|
|
|
*/
|
2016-12-14 01:10:17 +00:00
|
|
|
public:
|
2023-10-22 16:21:20 +00:00
|
|
|
// CStaticAudioPlayer(boo::IAudioVoiceEngine& engine, std::string_view path, int loopStart, int loopEnd);
|
|
|
|
// CStaticAudioPlayer(std::string_view path, int loopStart, int loopEnd)
|
|
|
|
// : CStaticAudioPlayer(*CAudioSys::GetVoiceEngine(), path, loopStart, loopEnd) {}
|
2016-12-14 22:56:59 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
bool IsReady();
|
|
|
|
void DecodeMonoAndMix(s16* bufOut, u32 numSamples, u32 cur, u32 loopEndCur, u32 loopStartCur, int vol,
|
2019-06-12 02:05:17 +00:00
|
|
|
g72x_state& state, std::optional<g72x_state>& loopState) const;
|
2018-12-08 05:30:43 +00:00
|
|
|
void Decode(s16* bufOut, u32 numSamples);
|
|
|
|
void SetVolume(float vol) { xc0_volume = zeus::clamp(0.f, vol, 1.f) * 32768.f; }
|
2023-10-22 16:21:20 +00:00
|
|
|
//
|
|
|
|
// void StartMixing() { m_voice->start(); }
|
|
|
|
// void StopMixing() { m_voice->stop(); }
|
2016-12-14 01:10:17 +00:00
|
|
|
};
|
|
|
|
|
2021-04-10 08:42:06 +00:00
|
|
|
} // namespace metaforce
|