From 1ea07622d1fe37a1552af6970fc8f5d138352d56 Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 10 Sep 2023 12:23:29 +0200 Subject: [PATCH] speaker: set pan range to -1 to 1, sliders: show channel volume in percentage and increase maximum to 400% --- src/emu/sound.cpp | 1 + src/emu/speaker.cpp | 19 +++--- src/emu/speaker.h | 4 +- src/frontend/mame/ui/ui.cpp | 113 +++++++++++++++++++++--------------- 4 files changed, 78 insertions(+), 59 deletions(-) diff --git a/src/emu/sound.cpp b/src/emu/sound.cpp index 5b4e6d57e4e..c9fa45ac2b5 100644 --- a/src/emu/sound.cpp +++ b/src/emu/sound.cpp @@ -1382,6 +1382,7 @@ void sound_manager::config_load(config_type cfg_type, config_level cfg_level, ut mixer_input info; if (indexed_mixer_input(node->get_attribute_int("index", -1), info)) { + // note that this doesn't disallow out-of-range values float value = node->get_attribute_float("value", std::nanf("")); if (std::isnan(value)) diff --git a/src/emu/speaker.cpp b/src/emu/speaker.cpp index 0755aab5af3..33b1e8d329a 100644 --- a/src/emu/speaker.cpp +++ b/src/emu/speaker.cpp @@ -37,8 +37,8 @@ speaker_device::speaker_device(const machine_config &mconfig, const char *tag, d , m_x(0.0) , m_y(0.0) , m_z(0.0) - , m_pan(1.0) - , m_defpan(1.0) + , m_pan(0.0) + , m_defpan(0.0) , m_current_max(0) , m_samples_this_bucket(0) { @@ -67,18 +67,17 @@ speaker_device &speaker_device::set_position(double x, double y, double z) // hard pan to left if (m_x < 0.0) - set_pan(0.0f); + set_pan(-1.0f); // hard pan to right else if (m_x > 0.0) - set_pan(2.0f); + set_pan(1.0f); // center (mono) else - set_pan(1.0f); + set_pan(0.0f); m_defpan = m_pan; - return *this; } @@ -121,20 +120,20 @@ void speaker_device::mix(stream_buffer::sample_t *leftmix, stream_buffer::sample if (!suppress) { // if the speaker is hard panned to the left, send only to the left - if (m_pan == 0.0f) + if (m_pan == -1.0f) for (int sample = 0; sample < expected_samples; sample++) leftmix[sample] += view.get(sample); // if the speaker is hard panned to the right, send only to the right - else if (m_pan == 2.0f) + else if (m_pan == 1.0f) for (int sample = 0; sample < expected_samples; sample++) rightmix[sample] += view.get(sample); // otherwise, send to both else { - const float leftpan = (m_pan <= 1.0f) ? 1.0f : 2.0f - m_pan; - const float rightpan = (m_pan >= 1.0f) ? 1.0f : m_pan; + const float leftpan = (m_pan <= 0.0f) ? 1.0f : 1.0f - m_pan; + const float rightpan = (m_pan >= 0.0f) ? 1.0f : 1.0f + m_pan; for (int sample = 0; sample < expected_samples; sample++) { diff --git a/src/emu/speaker.h b/src/emu/speaker.h index b55554d6164..3cb0794d998 100644 --- a/src/emu/speaker.h +++ b/src/emu/speaker.h @@ -71,8 +71,8 @@ public: // internally for use by the sound system void mix(stream_buffer::sample_t *leftmix, stream_buffer::sample_t *rightmix, attotime start, attotime end, int expected_samples, bool suppress); - // panning - void set_pan(double pan) { m_pan = std::clamp(pan, 0.0, 2.0); } + // user panning configuration + void set_pan(float pan) { m_pan = std::clamp(pan, -1.0f, 1.0f); } float pan() { return m_pan; } float defpan() { return m_defpan; } diff --git a/src/frontend/mame/ui/ui.cpp b/src/frontend/mame/ui/ui.cpp index e8022d112de..3399c22742a 100644 --- a/src/frontend/mame/ui/ui.cpp +++ b/src/frontend/mame/ui/ui.cpp @@ -741,15 +741,15 @@ float mame_ui_manager::get_line_height(float scale) if (raw_font_pixel_height < 24) { // do we want to scale smaller? only do so if we exceed the threshold - if (scale_factor <= 1.0F) + if (scale_factor <= 1.0f) { if (one_to_one_line_height < UI_MAX_FONT_HEIGHT || raw_font_pixel_height < 12) - scale_factor = 1.0F; + scale_factor = 1.0f; } else { // otherwise, just ensure an integral scale factor - scale_factor = floor(scale_factor); + scale_factor = floorf(scale_factor); } } else @@ -1479,14 +1479,15 @@ std::vector mame_ui_manager::slider_init(running_machine &machine for (int item = 0; machine.sound().indexed_mixer_input(item, info); item++) { std::string str = string_format(_("%1$s Volume"), info.stream->input(info.inputnum).name()); - slider_alloc(std::move(str), 0, 1000, 2000, 20, std::bind(&mame_ui_manager::slider_mixervol, this, item, _1, _2)); + slider_alloc(std::move(str), 0, 1000, 4000, 20, std::bind(&mame_ui_manager::slider_mixervol, this, item, _1, _2)); } // add speaker panning for (speaker_device &speaker : speaker_device_enumerator(machine.root_device())) { + int defpan = floorf(speaker.defpan() * 1000.0f + 0.5f); std::string str = string_format(_("%s '%s' Panning"), speaker.name(), speaker.tag()); - slider_alloc(std::move(str), 0, floor(speaker.defpan() * 1000.0 + 0.5), 2000, 20, std::bind(&mame_ui_manager::slider_panning, this, std::ref(speaker), _1, _2)); + slider_alloc(std::move(str), -1000, defpan, 1000, 20, std::bind(&mame_ui_manager::slider_panning, this, std::ref(speaker), _1, _2)); } // add analog adjusters @@ -1524,10 +1525,10 @@ std::vector mame_ui_manager::slider_init(running_machine &machine screen_device_enumerator scriter(machine.root_device()); for (screen_device &screen : scriter) { - int defxscale = floor(screen.xscale() * 1000.0f + 0.5f); - int defyscale = floor(screen.yscale() * 1000.0f + 0.5f); - int defxoffset = floor(screen.xoffset() * 1000.0f + 0.5f); - int defyoffset = floor(screen.yoffset() * 1000.0f + 0.5f); + int defxscale = floorf(screen.xscale() * 1000.0f + 0.5f); + int defyscale = floorf(screen.yscale() * 1000.0f + 0.5f); + int defxoffset = floorf(screen.xoffset() * 1000.0f + 0.5f); + int defyoffset = floorf(screen.yoffset() * 1000.0f + 0.5f); std::string screen_desc = machine_info().get_screen_desc(screen); // add refresh rate tweaker @@ -1562,10 +1563,10 @@ std::vector mame_ui_manager::slider_init(running_machine &machine { laserdisc_overlay_config config; laserdisc.get_overlay_config(config); - int defxscale = floor(config.m_overscalex * 1000.0f + 0.5f); - int defyscale = floor(config.m_overscaley * 1000.0f + 0.5f); - int defxoffset = floor(config.m_overposx * 1000.0f + 0.5f); - int defyoffset = floor(config.m_overposy * 1000.0f + 0.5f); + int defxscale = floorf(config.m_overscalex * 1000.0f + 0.5f); + int defyscale = floorf(config.m_overscaley * 1000.0f + 0.5f); + int defxoffset = floorf(config.m_overposx * 1000.0f + 0.5f); + int defyoffset = floorf(config.m_overposy * 1000.0f + 0.5f); // add scale and offset controls per-overlay std::string str = string_format(_("Laserdisc '%1$s' Horiz Stretch"), laserdisc.tag()); @@ -1630,9 +1631,12 @@ int32_t mame_ui_manager::slider_volume(std::string *str, int32_t newval) { if (newval != SLIDER_NOCHANGE) machine().sound().set_attenuation(newval); + + int32_t curval = machine().sound().attenuation(); if (str) - *str = string_format(_("%1$3ddB"), machine().sound().attenuation()); - return machine().sound().attenuation(); + *str = string_format(_("%1$3d" UTF8_NBSP "dB"), curval); + + return curval; } @@ -1646,15 +1650,22 @@ int32_t mame_ui_manager::slider_mixervol(int item, std::string *str, int32_t new mixer_input info; if (!machine().sound().indexed_mixer_input(item, info)) return 0; + if (newval != SLIDER_NOCHANGE) - { - int32_t curval = floor(info.stream->input(info.inputnum).user_gain() * 1000.0f + 0.5f); - if (newval > curval && (newval - curval) <= 4) newval += 4; // round up on increment info.stream->input(info.inputnum).set_user_gain(float(newval) * 0.001f); - } + + int32_t curval = floorf(info.stream->input(info.inputnum).user_gain() * 1000.0f + 0.5f); if (str) - *str = string_format("%1.2f", info.stream->input(info.inputnum).user_gain()); - return floorf(info.stream->input(info.inputnum).user_gain() * 1000.0f + 0.5f); + { + if (curval == 0) + *str = _("Mute"); + else if (curval % 10) + *str = string_format(_("%1$.1f%%"), float(curval) * 0.1f); + else + *str = string_format(_("%1$3d%%"), curval / 10); + } + + return curval; } @@ -1668,27 +1679,27 @@ int32_t mame_ui_manager::slider_panning(speaker_device &speaker, std::string *st if (newval != SLIDER_NOCHANGE) speaker.set_pan(float(newval) * 0.001f); - int32_t curval = floor(speaker.pan() * 1000.0f + 0.5f); + int32_t curval = floorf(speaker.pan() * 1000.0f + 0.5f); if (str) { switch (curval) { // preset strings for exact center/left/right - case 1000: + case 0: *str = _("Center"); break; - case 0: + case -1000: *str = _("Left"); break; - case 2000: + case 1000: *str = _("Right"); break; // otherwise show as floating point default: - *str = string_format("%1.2f", float(curval) * 0.001f); + *str = string_format(_("%1$.3f"), float(curval) * 0.001f); break; } } @@ -1713,7 +1724,7 @@ int32_t mame_ui_manager::slider_adjuster(ioport_field &field, std::string *str, field.set_user_settings(settings); } if (str) - *str = string_format(_("%1$d%%"), settings.value); + *str = string_format(_("%1$3d%%"), settings.value); return settings.value; } @@ -1726,10 +1737,18 @@ int32_t mame_ui_manager::slider_adjuster(ioport_field &field, std::string *str, int32_t mame_ui_manager::slider_overclock(device_t &device, std::string *str, int32_t newval) { if (newval != SLIDER_NOCHANGE) - device.set_clock_scale(float(newval) * 0.001f); + device.set_clock_scale(double(newval) * 0.001); + + int32_t curval = floor(device.clock_scale() * 1000.0 + 0.5); if (str) - *str = string_format(_("%1$3.0f%%"), floor(device.clock_scale() * 100.0 + 0.5)); - return floor(device.clock_scale() * 1000.0 + 0.5); + { + if (curval % 10) + *str = string_format(_("%1$.1f%%"), float(curval) * 0.1f); + else + *str = string_format(_("%1$3d%%"), curval / 10); + } + + return curval; } @@ -1772,7 +1791,7 @@ int32_t mame_ui_manager::slider_brightness(screen_device &screen, std::string *s } if (str) *str = string_format(_("%1$.3f"), settings.m_brightness); - return floor(settings.m_brightness * 1000.0f + 0.5f); + return floorf(settings.m_brightness * 1000.0f + 0.5f); } @@ -1791,7 +1810,7 @@ int32_t mame_ui_manager::slider_contrast(screen_device &screen, std::string *str } if (str) *str = string_format(_("%1$.3f"), settings.m_contrast); - return floor(settings.m_contrast * 1000.0f + 0.5f); + return floorf(settings.m_contrast * 1000.0f + 0.5f); } @@ -1809,7 +1828,7 @@ int32_t mame_ui_manager::slider_gamma(screen_device &screen, std::string *str, i } if (str) *str = string_format(_("%1$.3f"), settings.m_gamma); - return floor(settings.m_gamma * 1000.0f + 0.5f); + return floorf(settings.m_gamma * 1000.0f + 0.5f); } @@ -1828,7 +1847,7 @@ int32_t mame_ui_manager::slider_xscale(screen_device &screen, std::string *str, } if (str) *str = string_format(_("%1$.3f"), settings.m_xscale); - return floor(settings.m_xscale * 1000.0f + 0.5f); + return floorf(settings.m_xscale * 1000.0f + 0.5f); } @@ -1847,7 +1866,7 @@ int32_t mame_ui_manager::slider_yscale(screen_device &screen, std::string *str, } if (str) *str = string_format(_("%1$.3f"), settings.m_yscale); - return floor(settings.m_yscale * 1000.0f + 0.5f); + return floorf(settings.m_yscale * 1000.0f + 0.5f); } @@ -1866,7 +1885,7 @@ int32_t mame_ui_manager::slider_xoffset(screen_device &screen, std::string *str, } if (str) *str = string_format(_("%1$.3f"), settings.m_xoffset); - return floor(settings.m_xoffset * 1000.0f + 0.5f); + return floorf(settings.m_xoffset * 1000.0f + 0.5f); } @@ -1885,7 +1904,7 @@ int32_t mame_ui_manager::slider_yoffset(screen_device &screen, std::string *str, } if (str) *str = string_format(_("%1$.3f"), settings.m_yoffset); - return floor(settings.m_yoffset * 1000.0f + 0.5f); + return floorf(settings.m_yoffset * 1000.0f + 0.5f); } @@ -1906,7 +1925,7 @@ int32_t mame_ui_manager::slider_overxscale(laserdisc_device &laserdisc, std::str } if (str) *str = string_format(_("%1$.3f"), settings.m_overscalex); - return floor(settings.m_overscalex * 1000.0f + 0.5f); + return floorf(settings.m_overscalex * 1000.0f + 0.5f); } @@ -1927,7 +1946,7 @@ int32_t mame_ui_manager::slider_overyscale(laserdisc_device &laserdisc, std::str } if (str) *str = string_format(_("%1$.3f"), settings.m_overscaley); - return floor(settings.m_overscaley * 1000.0f + 0.5f); + return floorf(settings.m_overscaley * 1000.0f + 0.5f); } @@ -1948,7 +1967,7 @@ int32_t mame_ui_manager::slider_overxoffset(laserdisc_device &laserdisc, std::st } if (str) *str = string_format(_("%1$.3f"), settings.m_overposx); - return floor(settings.m_overposx * 1000.0f + 0.5f); + return floorf(settings.m_overposx * 1000.0f + 0.5f); } @@ -1969,7 +1988,7 @@ int32_t mame_ui_manager::slider_overyoffset(laserdisc_device &laserdisc, std::st } if (str) *str = string_format(_("%1$.3f"), settings.m_overposy); - return floor(settings.m_overposy * 1000.0f + 0.5f); + return floorf(settings.m_overposy * 1000.0f + 0.5f); } @@ -1984,7 +2003,7 @@ int32_t mame_ui_manager::slider_flicker([[maybe_unused]] screen_device &screen, vector_options::s_flicker = float(newval) * 0.001f; if (str) *str = string_format(_("%1$1.2f"), vector_options::s_flicker); - return floor(vector_options::s_flicker * 1000.0f + 0.5f); + return floorf(vector_options::s_flicker * 1000.0f + 0.5f); } @@ -1999,7 +2018,7 @@ int32_t mame_ui_manager::slider_beam_width_min([[maybe_unused]] screen_device &s vector_options::s_beam_width_min = std::min(float(newval) * 0.01f, vector_options::s_beam_width_max); if (str != nullptr) *str = string_format(_("%1$1.2f"), vector_options::s_beam_width_min); - return floor(vector_options::s_beam_width_min * 100.0f + 0.5f); + return floorf(vector_options::s_beam_width_min * 100.0f + 0.5f); } @@ -2014,7 +2033,7 @@ int32_t mame_ui_manager::slider_beam_width_max([[maybe_unused]] screen_device &s vector_options::s_beam_width_max = std::max(float(newval) * 0.01f, vector_options::s_beam_width_min); if (str != nullptr) *str = string_format(_("%1$1.2f"), vector_options::s_beam_width_max); - return floor(vector_options::s_beam_width_max * 100.0f + 0.5f); + return floorf(vector_options::s_beam_width_max * 100.0f + 0.5f); } @@ -2029,7 +2048,7 @@ int32_t mame_ui_manager::slider_beam_dot_size([[maybe_unused]] screen_device &sc vector_options::s_beam_dot_size = std::max(float(newval) * 0.01f, 0.1f); if (str != nullptr) *str = string_format(_("%1$1.2f"), vector_options::s_beam_dot_size); - return floor(vector_options::s_beam_dot_size * 100.0f + 0.5f); + return floorf(vector_options::s_beam_dot_size * 100.0f + 0.5f); } @@ -2044,7 +2063,7 @@ int32_t mame_ui_manager::slider_beam_intensity_weight([[maybe_unused]] screen_de vector_options::s_beam_intensity_weight = float(newval) * 0.001f; if (str != nullptr) *str = string_format(_("%1$1.2f"), vector_options::s_beam_intensity_weight); - return floor(vector_options::s_beam_intensity_weight * 1000.0f + 0.5f); + return floorf(vector_options::s_beam_intensity_weight * 1000.0f + 0.5f); } @@ -2060,7 +2079,7 @@ int32_t mame_ui_manager::slider_crossscale(ioport_field &field, std::string *str field.set_crosshair_scale(float(newval) * 0.001); if (str) *str = string_format((field.crosshair_axis() == CROSSHAIR_AXIS_X) ? _("Crosshair Scale X %1$1.3f") : _("Crosshair Scale Y %1$1.3f"), float(newval) * 0.001f); - return floor(field.crosshair_scale() * 1000.0f + 0.5f); + return floorf(field.crosshair_scale() * 1000.0f + 0.5f); } #endif