diff options
author | cam900 <dbtlrchl@naver.com> | 2019-05-08 23:04:24 +0900 |
---|---|---|
committer | R. Belmont <rb6502@users.noreply.github.com> | 2019-05-08 10:04:24 -0400 |
commit | fd19c2aa3e05a3fa53b60c31dc7f4682ec85d13a (patch) | |
tree | 61b44511e75cf84742f0def85e78c54b384a4382 | |
parent | e2465c53a58ec42da3d3d1cae67f438732bd34be (diff) |
vgmplay.cpp : Updates (#5009)
* vgmplay.cpp : Updates
Fix volume, Make stereo output when chip can be stereo output
* vgmplay.cpp :
More correct behavior (not overall chip count related) - but noisy, comments for now
* vgmplay.cpp : Fix volume behavior
-rw-r--r-- | src/mame/drivers/vgmplay.cpp | 106 |
1 files changed, 66 insertions, 40 deletions
diff --git a/src/mame/drivers/vgmplay.cpp b/src/mame/drivers/vgmplay.cpp index 3bb02e22520..ab255886112 100644 --- a/src/mame/drivers/vgmplay.cpp +++ b/src/mame/drivers/vgmplay.cpp @@ -2713,8 +2713,7 @@ QUICKLOAD_LOAD_MEMBER(vgmplay_state, load_file) else if (volbyte > 0xc1) volbyte -= 0x100; - float volume = powf(2.0f, float(volbyte) / float(0x20)); - uint32_t chip_count = 0; + float volume = version >= 0x160 && data_start >= 0x7d ? powf(2.0f, float(volbyte) / float(0x20)) : 1.0f; uint32_t extra_header_start = version >= 0x170 && data_start >= 0xc0 && r32(0xbc) ? r32(0xbc) + 0xbc : 0; uint32_t header_size = extra_header_start ? extra_header_start : data_start; @@ -2729,10 +2728,13 @@ QUICKLOAD_LOAD_MEMBER(vgmplay_state, load_file) const auto&& setup_device([&](device_t &device, int chip_num, vgm_chip chip_type, uint32_t offset, uint32_t min_version = 0) { uint32_t c = 0; + float chip_volume = volume; + bool has_2chip = false; if (min_version <= version && offset + 4 <= header_size && (chip_num == 0 || (r32(offset) & 0x40000000) != 0)) { c = r32(offset); + has_2chip = (c & 0x40000000) != 0; if (chip_clock_start && chip_num != 0) for (auto i(0); i < r8(chip_clock_start); i++) @@ -2743,11 +2745,15 @@ QUICKLOAD_LOAD_MEMBER(vgmplay_state, load_file) break; } } - - chip_count++; } + if (has_2chip) + { + chip_volume /= 2.0f; + } device.set_unscaled_clock(c & ~0xc0000000); + if (device.unscaled_clock() != 0) + dynamic_cast<device_sound_interface *>(&device)->set_output_gain(ALL_OUTPUTS, chip_volume); return (c & 0x80000000) != 0; }); @@ -2928,16 +2934,6 @@ QUICKLOAD_LOAD_MEMBER(vgmplay_state, load_file) if (child.clock() != 0) logerror("%s %d\n", child.tag(), child.clock()); - if (chip_count == 0) - volume = 0.0f; - else - volume /= (float)chip_count; - - for (int i = 0; i < m_lspeaker->inputs(); i++) - m_lspeaker->set_input_gain(i, volume); // TODO : Volume is related to chip number - for (int i = 0; i < m_rspeaker->inputs(); i++) - m_rspeaker->set_input_gain(i, volume); - //for (auto &stream : machine().sound().streams()) // if (stream->sample_rate() != 0) // logerror("%s %d\n", stream->device().tag(), stream->sample_rate()); @@ -3478,8 +3474,8 @@ MACHINE_CONFIG_START(vgmplay_state::vgmplay) m_ym2413[0]->add_route(ALL_OUTPUTS, "rspeaker", 1); YM2413(config, m_ym2413[1], 0); - m_ym2413[1]->add_route(0, "lspeaker", 1); - m_ym2413[1]->add_route(1, "rspeaker", 1); + m_ym2413[1]->add_route(ALL_OUTPUTS, "lspeaker", 1); + m_ym2413[1]->add_route(ALL_OUTPUTS, "rspeaker", 1); YM2612(config, m_ym2612[0], 0); m_ym2612[0]->add_route(0, "lspeaker", 1); @@ -3524,13 +3520,17 @@ MACHINE_CONFIG_START(vgmplay_state::vgmplay) // TODO: prevent error.log spew YM2608(config, m_ym2608[0], 0); m_ym2608[0]->set_addrmap(0, &vgmplay_state::ym2608_map<0>); - m_ym2608[0]->add_route(ALL_OUTPUTS, "lspeaker", 1); - m_ym2608[0]->add_route(ALL_OUTPUTS, "rspeaker", 1); + m_ym2608[0]->add_route(0, "lspeaker", 0.25); + m_ym2608[0]->add_route(0, "rspeaker", 0.25); + m_ym2608[0]->add_route(1, "lspeaker", 1.00); + m_ym2608[0]->add_route(2, "rspeaker", 1.00); YM2608(config, m_ym2608[1], 0); m_ym2608[1]->set_addrmap(0, &vgmplay_state::ym2608_map<1>); - m_ym2608[1]->add_route(ALL_OUTPUTS, "lspeaker", 1); - m_ym2608[1]->add_route(ALL_OUTPUTS, "rspeaker", 1); + m_ym2608[1]->add_route(0, "lspeaker", 0.25); + m_ym2608[1]->add_route(0, "rspeaker", 0.25); + m_ym2608[1]->add_route(1, "lspeaker", 1.00); + m_ym2608[1]->add_route(2, "rspeaker", 1.00); // TODO: prevent error.log spew YM2610(config, m_ym2610[0], 0); @@ -3576,44 +3576,64 @@ MACHINE_CONFIG_START(vgmplay_state::vgmplay) m_y8950[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.40); YMF262(config, m_ymf262[0], 0); - m_ymf262[0]->add_route(ALL_OUTPUTS, "lspeaker", 1.00); - m_ymf262[0]->add_route(ALL_OUTPUTS, "rspeaker", 1.00); + m_ymf262[0]->add_route(0, "lspeaker", 1.00); + m_ymf262[0]->add_route(1, "rspeaker", 1.00); + m_ymf262[0]->add_route(2, "lspeaker", 1.00); + m_ymf262[0]->add_route(3, "rspeaker", 1.00); YMF262(config, m_ymf262[1], 0); - m_ymf262[1]->add_route(ALL_OUTPUTS, "lspeaker", 1.00); - m_ymf262[1]->add_route(ALL_OUTPUTS, "rspeaker", 1.00); + m_ymf262[1]->add_route(0, "lspeaker", 1.00); + m_ymf262[1]->add_route(1, "rspeaker", 1.00); + m_ymf262[1]->add_route(2, "lspeaker", 1.00); + m_ymf262[1]->add_route(3, "rspeaker", 1.00); // TODO: prevent error.log spew YMF278B(config, m_ymf278b[0], 0); m_ymf278b[0]->set_addrmap(0, &vgmplay_state::ymf278b_map<0>); - m_ymf278b[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.25); - m_ymf278b[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.25); + m_ymf278b[0]->add_route(0, "lspeaker", 0.25); + m_ymf278b[0]->add_route(1, "rspeaker", 0.25); + m_ymf278b[0]->add_route(2, "lspeaker", 0.25); + m_ymf278b[0]->add_route(3, "rspeaker", 0.25); + m_ymf278b[0]->add_route(4, "lspeaker", 1.00); + m_ymf278b[0]->add_route(5, "rspeaker", 1.00); + m_ymf278b[0]->add_route(6, "lspeaker", 1.00); + m_ymf278b[0]->add_route(7, "rspeaker", 1.00); YMF278B(config, m_ymf278b[1], 0); m_ymf278b[1]->set_addrmap(0, &vgmplay_state::ymf278b_map<1>); - m_ymf278b[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.25); - m_ymf278b[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.25); + m_ymf278b[1]->add_route(0, "lspeaker", 0.25); + m_ymf278b[1]->add_route(1, "rspeaker", 0.25); + m_ymf278b[1]->add_route(2, "lspeaker", 0.25); + m_ymf278b[1]->add_route(3, "rspeaker", 0.25); + m_ymf278b[1]->add_route(4, "lspeaker", 1.00); + m_ymf278b[1]->add_route(5, "rspeaker", 1.00); + m_ymf278b[1]->add_route(6, "lspeaker", 1.00); + m_ymf278b[1]->add_route(7, "rspeaker", 1.00); YMF271(config, m_ymf271[0], 0); m_ymf271[0]->set_addrmap(0, &vgmplay_state::ymf271_map<0>); - m_ymf271[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.25); - m_ymf271[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.25); + m_ymf271[0]->add_route(0, "lspeaker", 0.25); + m_ymf271[0]->add_route(1, "rspeaker", 0.25); + m_ymf271[0]->add_route(2, "lspeaker", 0.25); + m_ymf271[0]->add_route(3, "rspeaker", 0.25); YMF271(config, m_ymf271[1], 0); m_ymf271[1]->set_addrmap(0, &vgmplay_state::ymf271_map<0>); - m_ymf271[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.25); - m_ymf271[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.25); + m_ymf271[1]->add_route(0, "lspeaker", 0.25); + m_ymf271[1]->add_route(1, "rspeaker", 0.25); + m_ymf271[1]->add_route(2, "lspeaker", 0.25); + m_ymf271[1]->add_route(3, "rspeaker", 0.25); // TODO: prevent error.log spew YMZ280B(config, m_ymz280b[0], 0); m_ymz280b[0]->set_addrmap(0, &vgmplay_state::ymz280b_map<0>); - m_ymz280b[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.25); - m_ymz280b[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.25); + m_ymz280b[0]->add_route(0, "lspeaker", 0.25); + m_ymz280b[0]->add_route(1, "rspeaker", 0.25); YMZ280B(config, m_ymz280b[1], 0); m_ymz280b[1]->set_addrmap(0, &vgmplay_state::ymz280b_map<1>); - m_ymz280b[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.25); - m_ymz280b[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.25); + m_ymz280b[1]->add_route(0, "lspeaker", 0.25); + m_ymz280b[1]->add_route(1, "rspeaker", 0.25); RF5C164(config, m_rf5c164, 0); m_rf5c164->set_addrmap(0, &vgmplay_state::rf5c164_map<0>); @@ -3815,13 +3835,15 @@ MACHINE_CONFIG_START(vgmplay_state::vgmplay) ES5505(config, m_es5505[0], 0); // TODO m_es5505[0]->set_addrmap(0, &vgmplay_state::es5505_map<0>); - m_es5505[0]->add_route(ALL_OUTPUTS, "lspeaker", 0.5); - m_es5505[0]->add_route(ALL_OUTPUTS, "rspeaker", 0.5); + m_es5505[0]->set_channels(1); + m_es5505[0]->add_route(0, "lspeaker", 0.5); + m_es5505[0]->add_route(1, "rspeaker", 0.5); ES5505(config, m_es5505[1], 0); // TODO m_es5505[1]->set_addrmap(0, &vgmplay_state::es5505_map<1>); - m_es5505[1]->add_route(ALL_OUTPUTS, "lspeaker", 0.5); - m_es5505[1]->add_route(ALL_OUTPUTS, "rspeaker", 0.5); + m_es5505[1]->set_channels(1); + m_es5505[1]->add_route(0, "lspeaker", 0.5); + m_es5505[1]->add_route(1, "rspeaker", 0.5); X1_010(config, m_x1_010[0], 0); m_x1_010[0]->set_addrmap(0, &vgmplay_state::x1_010_map<0>); @@ -3837,11 +3859,15 @@ MACHINE_CONFIG_START(vgmplay_state::vgmplay) m_c352[0]->set_addrmap(0, &vgmplay_state::c352_map<0>); m_c352[0]->add_route(0, "lspeaker", 1); m_c352[0]->add_route(1, "rspeaker", 1); + m_c352[0]->add_route(2, "lspeaker", 1); + m_c352[0]->add_route(3, "rspeaker", 1); C352(config, m_c352[1], 0, 1); m_c352[1]->set_addrmap(0, &vgmplay_state::c352_map<1>); m_c352[1]->add_route(0, "lspeaker", 1); m_c352[1]->add_route(1, "rspeaker", 1); + m_c352[1]->add_route(2, "lspeaker", 1); + m_c352[1]->add_route(3, "rspeaker", 1); IREMGA20(config, m_ga20[0], 0); m_ga20[0]->set_addrmap(0, &vgmplay_state::ga20_map<0>); |