summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
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
commitfd19c2aa3e05a3fa53b60c31dc7f4682ec85d13a (patch)
tree61b44511e75cf84742f0def85e78c54b384a4382
parente2465c53a58ec42da3d3d1cae67f438732bd34be (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.cpp106
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>);