Support SFX
This commit is contained in:
parent
acef4b8d68
commit
f2800aaf1e
|
@ -59,10 +59,12 @@ namespace Assets {
|
|||
}
|
||||
|
||||
namespace Main {
|
||||
using SPU::operator""_vol;
|
||||
|
||||
static const CDFile Files[] = {
|
||||
CDFileBuilder::simple_tim(LBA::PACO, PacoTIM),
|
||||
CDFileBuilder::simple_tim(LBA::DFISH, DoenerFishInfo.tim),
|
||||
CDFileBuilder::sony_vag(LBA::APPLE_SFX, VAG::create(0)),
|
||||
CDFileBuilder::sony_vag(LBA::APPLE_SFX, VAG::create(0, 1.0_vol)),
|
||||
CustomCDFileBuilder::jingle(32),
|
||||
};
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#include "../Auxiliary/bits.hpp"
|
||||
#include "../GPU/gpu_types.hpp"
|
||||
#include "../jabyengine_defines.hpp"
|
||||
#include "../SPU/spu.hpp"
|
||||
|
||||
namespace JabyEngine {
|
||||
#pragma pack(push, 1)
|
||||
|
@ -68,10 +69,11 @@ namespace JabyEngine {
|
|||
};
|
||||
|
||||
struct VAG {
|
||||
uint8_t voice_number;
|
||||
uint8_t voice_number;
|
||||
SPU::SimpleVolume inital_stereo_vol;
|
||||
|
||||
static constexpr VAG create(uint8_t voice_num) {
|
||||
return VAG{.voice_number = voice_num};
|
||||
static constexpr VAG create(uint8_t voice_num, SPU::SimpleVolume volume) {
|
||||
return VAG{.voice_number = voice_num, .inital_stereo_vol = volume};
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -3,31 +3,41 @@
|
|||
|
||||
namespace JabyEngine {
|
||||
namespace SPU {
|
||||
using SRAMAdr = SPU_IO::SRAMAdr;
|
||||
using SPU_IO::operator""_vol;
|
||||
|
||||
using SRAMAdr = SPU_IO::SRAMAdr;
|
||||
using SimpleVolume = SPU_IO::SimpleVolume;
|
||||
using SweepVolume = SPU_IO::SweepVolume;
|
||||
|
||||
// TODO: Rename to sample...?
|
||||
struct Voice {
|
||||
size_t get_id() const {
|
||||
size_t get_id() {
|
||||
return reinterpret_cast<size_t>(this);
|
||||
}
|
||||
|
||||
SRAMAdr allocate(size_t size) const;
|
||||
SRAMAdr allocate(SPU_IO::SampleRate frequency, size_t size) const;
|
||||
void deallocate() const;
|
||||
SRAMAdr allocate(size_t size);
|
||||
SRAMAdr allocate(SPU_IO::SampleRate frequency, size_t size);
|
||||
void deallocate();
|
||||
|
||||
void set_sample_rate(SPU_IO::SampleRate frequency) const {
|
||||
void set_sample_rate(SPU_IO::SampleRate frequency) {
|
||||
SPU_IO::Voice[Voice::get_id()].sampleRate.write(frequency);
|
||||
}
|
||||
|
||||
void play() const {
|
||||
void set_volume(SimpleVolume left, SimpleVolume right) {
|
||||
// TODO: Verify that assembly code is super simple
|
||||
SPU_IO::Voice[Voice::get_id()].volumeLeft.write(SweepVolume::create(left));
|
||||
SPU_IO::Voice[Voice::get_id()].volumeRight.write(SweepVolume::create(right));
|
||||
}
|
||||
|
||||
void play() {
|
||||
SPU_IO::Key::On.write(SPU_IO::KeyOn::for_specific(Voice::get_id()));
|
||||
}
|
||||
|
||||
void stop() const {
|
||||
void stop() {
|
||||
SPU_IO::Key::Off.write(SPU_IO::KeyOff::for_specific(Voice::get_id()));
|
||||
}
|
||||
};
|
||||
|
||||
extern const Voice voice[SPU_IO::VoiceCount];
|
||||
extern Voice voice[SPU_IO::VoiceCount];
|
||||
}
|
||||
}
|
|
@ -219,6 +219,10 @@ namespace JabyEngine {
|
|||
static constexpr auto Step = BitRange::from_to(0, 1);
|
||||
};
|
||||
|
||||
static constexpr SweepVolume create(SimpleVolume volume) {
|
||||
return from(VolumeMode::Enable, VolumeMode::Volume.with(volume.raw >> 1));
|
||||
}
|
||||
|
||||
static constexpr SweepVolume mute() {
|
||||
return SweepVolume{0};
|
||||
}
|
||||
|
|
|
@ -31,12 +31,12 @@ namespace JabyEngine {
|
|||
};
|
||||
|
||||
struct VAGState {
|
||||
uint32_t voice_id;
|
||||
size_t words_left;
|
||||
SPU::SRAMAdr adr;
|
||||
uint32_t voice_id;
|
||||
size_t words_left;
|
||||
SPU::SimpleVolume inital_vol;
|
||||
|
||||
static constexpr VAGState create(uint32_t voice_id) {
|
||||
return VAGState{.voice_id = voice_id, .words_left = 0, .adr = 0};
|
||||
static constexpr VAGState create(uint32_t voice_id, SPU::SimpleVolume inital_vol) {
|
||||
return VAGState{.voice_id = voice_id, .words_left = 0, .inital_vol = inital_vol};
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -55,11 +55,13 @@ namespace JabyEngine {
|
|||
const auto bytes = header.get_sample_size();
|
||||
|
||||
state.words_left = bytes_to_words(bytes);
|
||||
state.adr = SPU::voice[state.voice_id].allocate(SPU_IO::SampleRate::from_HZ(header.get_sample_frequency()), words_to_bytes(state.words_left));
|
||||
|
||||
auto sram_adr = SPU::voice[state.voice_id].allocate(SPU_IO::SampleRate::from_HZ(header.get_sample_frequency()), words_to_bytes(state.words_left));
|
||||
SPU::voice[state.voice_id].set_volume(state.inital_vol, state.inital_vol);
|
||||
|
||||
config.processed(sizeof(VAGHeader));
|
||||
SPU::internal::DMA::Receive::prepare();
|
||||
SPU::internal::DMA::Receive::set_dst(state.adr);
|
||||
SPU::internal::DMA::Receive::set_dst(sram_adr);
|
||||
SPU::internal::DMA::Receive::set_src(reinterpret_cast<uintptr_t>(config.data_adr));
|
||||
|
||||
return Helper::exchange_and_execute_process_function(parse_sample, config, state);
|
||||
|
@ -69,7 +71,7 @@ namespace JabyEngine {
|
|||
}
|
||||
|
||||
State create(const uint32_t* data_adr, const VAG& file) {
|
||||
return State::from(VAGState::create(file.voice_number), data_adr, parse_header);
|
||||
return State::from(VAGState::create(file.voice_number, file.inital_stereo_vol), data_adr, parse_header);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
namespace JabyEngine {
|
||||
namespace SPU {
|
||||
SRAMAdr Voice :: allocate(size_t size) const {
|
||||
SRAMAdr Voice :: allocate(size_t size) {
|
||||
Voice::stop();
|
||||
const auto voice_id = Voice::get_id();
|
||||
const auto adr = SRAMAdr{static_cast<SRAMAdr::UnderlyingType>(reinterpret_cast<uintptr_t>(SPU_MMU::allocate(voice_id, size)))};
|
||||
|
@ -17,13 +17,13 @@ namespace JabyEngine {
|
|||
return adr;
|
||||
}
|
||||
|
||||
SRAMAdr Voice :: allocate(SPU_IO::SampleRate frequency, size_t size) const {
|
||||
SRAMAdr Voice :: allocate(SPU_IO::SampleRate frequency, size_t size) {
|
||||
const auto result = Voice::allocate(size);
|
||||
Voice::set_sample_rate(frequency);
|
||||
return result;
|
||||
}
|
||||
|
||||
void Voice :: deallocate() const {
|
||||
void Voice :: deallocate() {
|
||||
Voice::stop();
|
||||
SPU_MMU::deallocate(Voice::get_id());
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue