diff --git a/game/sound/989snd/blocksound_handler.cpp b/game/sound/989snd/blocksound_handler.cpp index 8095d0adf7..56ace08b47 100644 --- a/game/sound/989snd/blocksound_handler.cpp +++ b/game/sound/989snd/blocksound_handler.cpp @@ -20,19 +20,13 @@ void blocksound_handler::init() { // return; // } - int idx = 0; - for (auto& g : m_sfx.grains) { - // lg::info("grain {}: {}", idx, g->inspect()); - idx++; - } - while (m_countdown <= 0 && !m_done) { do_grain(); } } bool blocksound_handler::tick() { - m_voices.remove_if([](std::weak_ptr& p) { return p.expired(); }); + m_voices.remove_if([](std::weak_ptr& p) { return p.expired(); }); for (auto& lfo : m_lfo) { lfo.tick(); @@ -145,8 +139,7 @@ void blocksound_handler::set_vol_pan(s32 vol, s32 pan) { continue; } - auto volume = - m_vm.make_volume(127, 0, m_cur_volume, m_cur_pan, voice->tone.Vol, voice->tone.Pan); + auto volume = m_vm.make_volume(127, 0, m_cur_volume, m_cur_pan, voice->g_vol, voice->g_pan); auto left = m_vm.adjust_vol_to_group(volume.left, m_sfx.d.VolGroup); auto right = m_vm.adjust_vol_to_group(volume.right, m_sfx.d.VolGroup); @@ -174,13 +167,17 @@ void blocksound_handler::update_pitch() { } void blocksound_handler::set_pmod(s32 mod) { - // TODO update children + for (auto& c : m_children) { + c->set_pmod(mod); + } m_app_pm = mod; update_pitch(); } void blocksound_handler::set_pbend(s32 bend) { - // TODO update children + for (auto& c : m_children) { + c->set_pbend(bend); + } m_app_pb = bend; update_pitch(); } diff --git a/game/sound/989snd/blocksound_handler.h b/game/sound/989snd/blocksound_handler.h index 0fa1a8e892..6c7ae6b571 100644 --- a/game/sound/989snd/blocksound_handler.h +++ b/game/sound/989snd/blocksound_handler.h @@ -11,6 +11,13 @@ namespace snd { extern std::array g_block_reg; +class blocksound_voice : public vag_voice { + public: + blocksound_voice(Tone& t) : vag_voice(t) {} + s32 g_vol; + s32 g_pan; +}; + class blocksound_handler : public sound_handler { public: blocksound_handler(SoundBank& bank, @@ -106,7 +113,7 @@ class blocksound_handler : public sound_handler { void set_vol_pan(s32 vol, s32 pan) override; void set_pmod(s32 mod) override; void set_register(u8 reg, u8 value) override { m_registers.at(reg) = value; }; - void set_pbend(s32 bend); // TODO override; + void set_pbend(s32 bend) override; void init(); @@ -126,13 +133,10 @@ class blocksound_handler : public sound_handler { SFX2& m_sfx; voice_manager& m_vm; - std::list> m_voices; + std::list> m_voices; std::list> m_children; - s32 m_current_pb{0}; - s32 m_current_pm{0}; - s32 m_orig_volume{0}; s32 m_orig_pan{0}; s32 m_cur_volume{0}; diff --git a/game/sound/989snd/sfxblock2.cpp b/game/sound/989snd/sfxblock2.cpp index 10c35256a8..73d0691fdd 100644 --- a/game/sound/989snd/sfxblock2.cpp +++ b/game/sound/989snd/sfxblock2.cpp @@ -47,7 +47,9 @@ SFXBlock2::SFXBlock2(locator& loc, u32 id, BankTag* tag) strncpy(buf, (char*)name->Name, 16); std::string str(buf); - m_names[str] = name->Index; + if (m_names.find(str) == m_names.end()) { + m_names[str] = name->Index; + } m_sounds.at(name->Index).name = str; name++; diff --git a/game/sound/989snd/sfxgrain.cpp b/game/sound/989snd/sfxgrain.cpp index 32c2b0ca29..aab0755367 100644 --- a/game/sound/989snd/sfxgrain.cpp +++ b/game/sound/989snd/sfxgrain.cpp @@ -28,9 +28,10 @@ s32 SFXGrain_Tone::execute(blocksound_handler& handler) { return 0; } - auto voice = std::make_shared(m_tone); + auto voice = std::make_shared(m_tone); s32 vol = m_tone.Vol; + if (vol < 0) { if (vol >= -4) { vol = handler.m_registers.at(-vol - 1); @@ -61,7 +62,11 @@ s32 SFXGrain_Tone::execute(blocksound_handler& handler) { voice->start_note = handler.m_note; voice->start_fine = handler.m_fine; + voice->current_pb = handler.m_cur_pb; + voice->current_pm = handler.m_cur_pm; voice->group = handler.m_group; + voice->g_vol = vol; + voice->g_pan = pan; voice->basevol = handler.m_vm.make_volume(127, 0, handler.m_cur_volume, handler.m_cur_pan, vol, pan); diff --git a/game/sound/989snd/sound_handler.h b/game/sound/989snd/sound_handler.h index 218fcc27a4..6b9ad71cdf 100644 --- a/game/sound/989snd/sound_handler.h +++ b/game/sound/989snd/sound_handler.h @@ -22,6 +22,7 @@ class sound_handler { virtual void stop() = 0; virtual void set_vol_pan(s32 vol, s32 pan) = 0; virtual void set_pmod(s32 mod) = 0; + virtual void set_pbend(s32 mod){}; virtual void set_register(u8 /*reg*/, u8 /*value*/) {} }; } // namespace snd