summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2023-05-09 01:49:41 +1000
committer Vas Crabb <vas@vastheman.com>2023-05-09 01:49:41 +1000
commit82394e8569ac385142aa6bb261819ac35ef22377 (patch)
tree1b08bb1e148fc6e3ef0a212677b1679a5bf3a845
parent743ac098e40f2e9aa8df0a0ef9b0233a8cc68d9d (diff)
Adjustments to option priority interactions:
emu/sound.cpp: Made -volume in source file INI or higher priority context take precedence over volume read from CFG file. This matches behaviour of -bgfx_screen_chains. emu/input.cpp: Made explicit -no{mouse|joystick|lightgun} take precedence over -{mouse|trackball|adstick|paddle}_device etc. from lower priority levels. Alos got rid of a bunch of unnecessary simple_list.
-rw-r--r--docs/source/commandline/commandline-all.rst27
-rw-r--r--src/devices/bus/apricot/expansion/expansion.cpp6
-rw-r--r--src/devices/bus/apricot/expansion/expansion.h20
-rw-r--r--src/devices/bus/econet/econet.cpp67
-rw-r--r--src/devices/bus/econet/econet.h38
-rw-r--r--src/devices/bus/nasbus/nasbus.cpp6
-rw-r--r--src/devices/bus/nasbus/nasbus.h18
-rw-r--r--src/devices/bus/svi3x8/slot/slot.cpp76
-rw-r--r--src/devices/bus/svi3x8/slot/slot.h17
-rw-r--r--src/devices/bus/tiki100/exp.cpp54
-rw-r--r--src/devices/bus/tiki100/exp.h21
-rw-r--r--src/devices/bus/wangpc/wangpc.cpp80
-rw-r--r--src/devices/bus/wangpc/wangpc.h20
-rw-r--r--src/devices/bus/wysekbd/wysekbd.h8
-rw-r--r--src/emu/ioport.cpp84
-rw-r--r--src/emu/ioport.h3
-rw-r--r--src/emu/sound.cpp7
17 files changed, 238 insertions, 314 deletions
diff --git a/docs/source/commandline/commandline-all.rst b/docs/source/commandline/commandline-all.rst
index 809d982b6a4..9096cb13888 100644
--- a/docs/source/commandline/commandline-all.rst
+++ b/docs/source/commandline/commandline-all.rst
@@ -2977,11 +2977,14 @@ Core Sound Options
**-volume** / **-vol** *<value>*
- Sets the startup volume. It can later be changed with the user interface
- (see Keys section). The volume is an attenuation in dB: e.g.,
- "**-volume -12**" will start with -12dB attenuation.
+ Sets the initial sound volume. It can be changed later with the user
+ interface (see Keys section). The volume is an attenuation in decibels:
+ e.g. "**-volume -12**" will start with -12 dB attenuation. Note that if the
+ volume is changed in the user interface it will be saved to the
+ configuration file for the system. The value from the configuration file
+ for the system has priority over ``volume`` settings in general INI files.
- The default is ``0``.
+ The default is ``0`` (no attenuation, or full volume).
Example:
.. code-block:: bash
@@ -3053,11 +3056,11 @@ Core Sound Options
The default is ``1``.
- | For PortAudio, see the section on :ref:`-pa_latency <mame-commandline-palatency>`.
- | XAudio2 calculates audio_latency as 10ms steps.
- | DSound calculates audio_latency as 10ms steps.
- | CoreAudio calculates audio_latency as 25ms steps.
- | SDL calculates audio_latency as Xms steps.
+ * For PortAudio, see the section on :ref:`-pa_latency <mame-commandline-palatency>`.
+ * XAudio2 calculates audio_latency as 10ms steps.
+ * DSound calculates audio_latency as 10ms steps.
+ * CoreAudio calculates audio_latency as 25ms steps.
+ * SDL calculates audio_latency as Xms steps.
Example:
.. code-block:: bash
@@ -3559,11 +3562,13 @@ Core Input Automatic Enable Options
:ref:`-mouse <mame-commandline-nomouse>`, :ref:`-joystick
<mame-commandline-nojoystick>` and/or :ref:`-lightgun
<mame-commandline-nolightgun>` depending on the type of inputs present on
- the emulated system.
+ the emulated system. Note that these options *will not* override explicit
+ **-nomouse**, **-nojoystick** and/or **-nolightgun** settings at a higher
+ priority level (e.g. in a more specific INI file or on the command line).
For example, if you specify the option **-paddle_device mouse**, then mouse
controls will automatically be enabled when you run a game that has paddle
- controls (e.g. Super Breakout), even if you specified **-nomouse**.
+ controls (e.g. Super Breakout), even if you specified **-nomouse** .
The default is to automatically enable mouse controls when running emulated
systems with mouse inputs (**-mouse_device mouse**).
diff --git a/src/devices/bus/apricot/expansion/expansion.cpp b/src/devices/bus/apricot/expansion/expansion.cpp
index 0949e1ae781..ff7887e5d88 100644
--- a/src/devices/bus/apricot/expansion/expansion.cpp
+++ b/src/devices/bus/apricot/expansion/expansion.cpp
@@ -78,7 +78,6 @@ apricot_expansion_bus_device::apricot_expansion_bus_device(const machine_config
apricot_expansion_bus_device::~apricot_expansion_bus_device()
{
- m_dev.detach_all();
}
//-------------------------------------------------
@@ -103,7 +102,7 @@ void apricot_expansion_bus_device::device_start()
void apricot_expansion_bus_device::add_card(device_apricot_expansion_card_interface *card)
{
card->set_bus_device(this);
- m_dev.append(*card);
+ m_dev.emplace_back(*card);
}
// callbacks from slot device to the host
@@ -137,8 +136,7 @@ void apricot_expansion_bus_device::install_ram(offs_t addrstart, offs_t addrend,
device_apricot_expansion_card_interface::device_apricot_expansion_card_interface(const machine_config &mconfig, device_t &device) :
device_interface(device, "apricotexp"),
- m_bus(nullptr),
- m_next(nullptr)
+ m_bus(nullptr)
{
}
diff --git a/src/devices/bus/apricot/expansion/expansion.h b/src/devices/bus/apricot/expansion/expansion.h
index f5a1994861d..2cf025cde0c 100644
--- a/src/devices/bus/apricot/expansion/expansion.h
+++ b/src/devices/bus/apricot/expansion/expansion.h
@@ -46,6 +46,9 @@
#pragma once
+#include <functional>
+#include <vector>
+
//**************************************************************************
// TYPE DEFINITIONS
@@ -75,7 +78,7 @@ public:
protected:
apricot_expansion_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
- // device-level overrides
+ // device_t implementation
virtual void device_start() override;
};
@@ -116,7 +119,8 @@ public:
void install_ram(offs_t addrstart, offs_t addrend, void *baseptr);
- template<typename T> void install_io_device(offs_t addrstart, offs_t addrend, T &device, void (T::*map)(class address_map &map), uint64_t unitmask = ~u64(0))
+ template <typename T>
+ void install_io_device(offs_t addrstart, offs_t addrend, T &device, void (T::*map)(class address_map &map), uint64_t unitmask = ~u64(0))
{
m_io->install_device(addrstart, addrend, device, map, unitmask);
@@ -125,11 +129,13 @@ public:
}
protected:
- // device-level overrides
+ // device_t implementation
virtual void device_start() override;
private:
- simple_list<device_apricot_expansion_card_interface> m_dev;
+ using card_vector = std::vector<std::reference_wrapper<device_apricot_expansion_card_interface> >;
+
+ card_vector m_dev;
// address spaces we have access to
required_address_space m_program;
@@ -153,22 +159,16 @@ DECLARE_DEVICE_TYPE(APRICOT_EXPANSION_BUS, apricot_expansion_bus_device)
class device_apricot_expansion_card_interface : public device_interface
{
- template <class ElementType> friend class simple_list;
-
public:
// construction/destruction
virtual ~device_apricot_expansion_card_interface();
void set_bus_device(apricot_expansion_bus_device *bus);
- device_apricot_expansion_card_interface *next() const { return m_next; }
-
protected:
device_apricot_expansion_card_interface(const machine_config &mconfig, device_t &device);
apricot_expansion_bus_device *m_bus;
-
- device_apricot_expansion_card_interface *m_next;
};
diff --git a/src/devices/bus/econet/econet.cpp b/src/devices/bus/econet/econet.cpp
index e9afc9c0d49..629e6df2fbb 100644
--- a/src/devices/bus/econet/econet.cpp
+++ b/src/devices/bus/econet/econet.cpp
@@ -40,7 +40,7 @@ DEFINE_DEVICE_TYPE(ECONET_SLOT, econet_slot_device, "econet_slot", "Econet stati
//-------------------------------------------------
device_econet_interface::device_econet_interface(const machine_config &mconfig, device_t &device) :
- device_interface(device, "econet"), m_econet(nullptr), m_address(0), m_next(nullptr)
+ device_interface(device, "econet"), m_econet(nullptr), m_address(0)
{
}
@@ -56,8 +56,9 @@ device_econet_interface::device_econet_interface(const machine_config &mconfig,
econet_slot_device::econet_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, ECONET_SLOT, tag, owner, clock),
- device_slot_interface(mconfig, *this),
- m_address(0), m_econet(*this, finder_base::DUMMY_TAG)
+ device_single_card_slot_interface<device_econet_interface>(mconfig, *this),
+ m_address(0),
+ m_econet(*this, finder_base::DUMMY_TAG)
{
}
@@ -68,8 +69,9 @@ econet_slot_device::econet_slot_device(const machine_config &mconfig, const char
void econet_slot_device::device_start()
{
- device_econet_interface *dev = dynamic_cast<device_econet_interface *>(get_card_device());
- if (dev) m_econet->add_device(get_card_device(), m_address);
+ device_econet_interface *dev = get_card_device();
+ if (dev)
+ m_econet->add_device(*dev, m_address);
}
@@ -97,21 +99,17 @@ inline void econet_device::set_signal(device_t *device, int signal, int state)
}
else
{
- daisy_entry *entry = m_device_list.first();
-
- while (entry)
+ for (auto &entry : m_device_list)
{
- if (!strcmp(entry->m_device->tag(), device->tag()))
+ if (!strcmp(entry.device().tag(), device->tag()))
{
- if (entry->m_line[signal] != state)
+ if (entry.m_line[signal] != state)
{
if (LOG) logerror("Econet: '%s' %s %u\n", device->tag(), SIGNAL_NAME[signal], state);
- entry->m_line[signal] = state;
+ entry.m_line[signal] = state;
changed = true;
}
}
-
- entry = entry->next();
}
}
@@ -123,22 +121,18 @@ inline void econet_device::set_signal(device_t *device, int signal, int state)
case DATA: m_write_data(state); break;
}
- daisy_entry *entry = m_device_list.first();
-
- while (entry)
+ for (auto &entry : m_device_list)
{
switch (signal)
{
case CLK:
- entry->m_interface->econet_clk(state);
+ entry.interface().econet_clk(state);
break;
case DATA:
- entry->m_interface->econet_data(state);
+ entry.interface().econet_data(state);
break;
}
-
- entry = entry->next();
}
if (LOG) logerror("Econet: CLK %u DATA %u\n", get_signal(CLK), get_signal(DATA));
@@ -156,17 +150,13 @@ inline int econet_device::get_signal(int signal)
if (state)
{
- daisy_entry *entry = m_device_list.first();
-
- while (entry)
+ for (auto &entry : m_device_list)
{
- if (!entry->m_line[signal])
+ if (!entry.m_line[signal])
{
state = 0;
break;
}
-
- entry = entry->next();
}
}
@@ -213,7 +203,7 @@ void econet_device::device_start()
void econet_device::device_stop()
{
- m_device_list.reset();
+ m_device_list.clear();
}
@@ -221,14 +211,12 @@ void econet_device::device_stop()
// add_device -
//-------------------------------------------------
-void econet_device::add_device(device_t *target, int address)
+void econet_device::add_device(device_econet_interface &target, int address)
{
- auto entry = new daisy_entry(target);
+ target.m_econet = this;
+ target.m_address = address;
- entry->m_interface->m_econet = this;
- entry->m_interface->m_address = address;
-
- m_device_list.append(*entry);
+ m_device_list.emplace_back(target);
}
@@ -236,17 +224,12 @@ void econet_device::add_device(device_t *target, int address)
// daisy_entry - constructor
//-------------------------------------------------
-econet_device::daisy_entry::daisy_entry(device_t *device) :
- m_next(nullptr),
- m_device(device),
- m_interface(nullptr)
+econet_device::daisy_entry::daisy_entry(device_econet_interface &device) :
+ m_device(&device.device()),
+ m_interface(&device)
{
- for (auto & elem : m_line)
- {
+ for (auto &elem : m_line)
elem = 1;
- }
-
- device->interface(m_interface);
}
diff --git a/src/devices/bus/econet/econet.h b/src/devices/bus/econet/econet.h
index 1aab9da8095..9d4f4bc095d 100644
--- a/src/devices/bus/econet/econet.h
+++ b/src/devices/bus/econet/econet.h
@@ -11,6 +11,7 @@
#pragma once
+#include <vector>
@@ -31,7 +32,7 @@ public:
auto clk_wr_callback() { return m_write_clk.bind(); }
auto data_wr_callback() { return m_write_data.bind(); }
- void add_device(device_t *target, int address);
+ void add_device(device_econet_interface &target, int address);
// writes for host (driver_device)
DECLARE_WRITE_LINE_MEMBER( host_clk_w );
@@ -49,31 +50,33 @@ protected:
SIGNAL_COUNT
};
- // device-level overrides
- virtual void device_start() override;
- virtual void device_stop() override;
-
class daisy_entry
{
public:
- daisy_entry(device_t *device);
- daisy_entry *next() const { return m_next; }
+ daisy_entry(device_econet_interface &device);
- daisy_entry * m_next; // next device
- device_t * m_device; // associated device
- device_econet_interface * m_interface; // associated device's daisy interface
+ device_t &device() { return *m_device; }
+ device_econet_interface &interface() { return *m_interface; }
int m_line[SIGNAL_COUNT];
+
+ private:
+ device_t * m_device; // associated device
+ device_econet_interface * m_interface; // associated device's daisy interface
};
- simple_list<daisy_entry> m_device_list;
+ // device_t implementation
+ virtual void device_start() override;
+ virtual void device_stop() override;
+
+ std::vector<daisy_entry> m_device_list;
private:
devcb_write_line m_write_clk;
devcb_write_line m_write_data;
- inline void set_signal(device_t *device, int signal, int state);
- inline int get_signal(int signal);
+ void set_signal(device_t *device, int signal, int state);
+ int get_signal(int signal);
int m_line[SIGNAL_COUNT];
};
@@ -81,8 +84,7 @@ private:
// ======================> econet_slot_device
-class econet_slot_device : public device_t,
- public device_slot_interface
+class econet_slot_device : public device_t, public device_single_card_slot_interface<device_econet_interface>
{
public:
// construction/destruction
@@ -115,11 +117,8 @@ private:
class device_econet_interface : public device_interface
{
friend class econet_device;
- template <class ElementType> friend class simple_list;
public:
- device_econet_interface *next() const { return m_next; }
-
virtual void econet_clk(int state) = 0;
virtual void econet_data(int state) = 0;
@@ -129,9 +128,6 @@ protected:
econet_device *m_econet;
uint8_t m_address;
-
-private:
- device_econet_interface *m_next;
};
diff --git a/src/devices/bus/nasbus/nasbus.cpp b/src/devices/bus/nasbus/nasbus.cpp
index 29fff032d39..d72bd2c7d93 100644
--- a/src/devices/bus/nasbus/nasbus.cpp
+++ b/src/devices/bus/nasbus/nasbus.cpp
@@ -70,7 +70,6 @@ nasbus_device::nasbus_device(const machine_config &mconfig, const char *tag, dev
nasbus_device::~nasbus_device()
{
- m_dev.detach_all();
}
//-------------------------------------------------
@@ -98,7 +97,7 @@ void nasbus_device::device_reset()
void nasbus_device::add_card(device_nasbus_card_interface &card)
{
card.set_nasbus_device(*this);
- m_dev.append(card);
+ m_dev.emplace_back(card);
}
// callbacks from slot device to the host
@@ -115,8 +114,7 @@ WRITE_LINE_MEMBER( nasbus_device::ram_disable_w ) { m_ram_disable_handler(state)
device_nasbus_card_interface::device_nasbus_card_interface(const machine_config &mconfig, device_t &device) :
device_interface(device, "nasbus"),
- m_nasbus(nullptr),
- m_next(nullptr)
+ m_nasbus(nullptr)
{
}
diff --git a/src/devices/bus/nasbus/nasbus.h b/src/devices/bus/nasbus/nasbus.h
index 04e1c3942f7..550c9542faf 100644
--- a/src/devices/bus/nasbus/nasbus.h
+++ b/src/devices/bus/nasbus/nasbus.h
@@ -92,6 +92,9 @@
#pragma once
+#include <functional>
+#include <vector>
+
//**************************************************************************
@@ -125,7 +128,7 @@ public:
protected:
nasbus_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
- // device-level overrides
+ // device_t implementation
virtual void device_start() override;
private:
@@ -156,17 +159,19 @@ public:
DECLARE_WRITE_LINE_MEMBER( ram_disable_w );
protected:
- // device-level overrides
+ // device_t implementation
virtual void device_start() override;
virtual void device_reset() override;
private:
+ using card_vector = std::vector<std::reference_wrapper<device_nasbus_card_interface> >;
+
required_address_space m_program;
required_address_space m_io;
- simple_list<device_nasbus_card_interface> m_dev;
-
devcb_write_line m_ram_disable_handler;
+
+ card_vector m_dev;
};
// device type definition
@@ -176,15 +181,12 @@ DECLARE_DEVICE_TYPE(NASBUS, nasbus_device)
class device_nasbus_card_interface : public device_interface
{
- template <class ElementType> friend class simple_list;
public:
// construction/destruction
virtual ~device_nasbus_card_interface();
void set_nasbus_device(nasbus_device &nasbus);
- device_nasbus_card_interface *next() const { return m_next; }
-
protected:
device_nasbus_card_interface(const machine_config &mconfig, device_t &device);
@@ -197,8 +199,6 @@ protected:
private:
nasbus_device *m_nasbus;
-
- device_nasbus_card_interface *m_next;
};
// include here so drivers don't need to
diff --git a/src/devices/bus/svi3x8/slot/slot.cpp b/src/devices/bus/svi3x8/slot/slot.cpp
index 705734dea4c..f486094ade2 100644
--- a/src/devices/bus/svi3x8/slot/slot.cpp
+++ b/src/devices/bus/svi3x8/slot/slot.cpp
@@ -34,7 +34,6 @@ svi_slot_bus_device::svi_slot_bus_device(const machine_config &mconfig, const ch
svi_slot_bus_device::~svi_slot_bus_device()
{
- m_dev.detach_all();
}
//-------------------------------------------------
@@ -56,7 +55,7 @@ void svi_slot_bus_device::device_start()
void svi_slot_bus_device::add_card(device_svi_slot_interface &card)
{
card.set_bus_device(*this);
- m_dev.append(card);
+ m_dev.emplace_back(card);
}
//-------------------------------------------------
@@ -65,14 +64,10 @@ void svi_slot_bus_device::add_card(device_svi_slot_interface &card)
uint8_t svi_slot_bus_device::mreq_r(offs_t offset)
{
- device_svi_slot_interface *entry = m_dev.first();
uint8_t data = 0xff;
- while (entry)
- {
- data &= entry->mreq_r(offset);
- entry = entry->next();
- }
+ for (device_svi_slot_interface &entry : m_dev)
+ data &= entry.mreq_r(offset);
return data;
}
@@ -83,13 +78,8 @@ uint8_t svi_slot_bus_device::mreq_r(offs_t offset)
void svi_slot_bus_device::mreq_w(offs_t offset, uint8_t data)
{
- device_svi_slot_interface *entry = m_dev.first();
-
- while (entry)
- {
- entry->mreq_w(offset, data);
- entry = entry->next();
- }
+ for (device_svi_slot_interface &entry : m_dev)
+ entry.mreq_w(offset, data);
}
//-------------------------------------------------
@@ -98,14 +88,10 @@ void svi_slot_bus_device::mreq_w(offs_t offset, uint8_t data)
uint8_t svi_slot_bus_device::iorq_r(offs_t offset)
{
- device_svi_slot_interface *entry = m_dev.first();
uint8_t data = 0xff;
- while (entry)
- {
- data &= entry->iorq_r(offset);
- entry = entry->next();
- }
+ for (device_svi_slot_interface &entry : m_dev)
+ data &= entry.iorq_r(offset);
return data;
}
@@ -116,13 +102,8 @@ uint8_t svi_slot_bus_device::iorq_r(offs_t offset)
void svi_slot_bus_device::iorq_w(offs_t offset, uint8_t data)
{
- device_svi_slot_interface *entry = m_dev.first();
-
- while (entry)
- {
- entry->iorq_w(offset, data);
- entry = entry->next();
- }
+ for (device_svi_slot_interface &entry : m_dev)
+ entry.iorq_w(offset, data);
}
//-------------------------------------------------
@@ -131,13 +112,8 @@ void svi_slot_bus_device::iorq_w(offs_t offset, uint8_t data)
WRITE_LINE_MEMBER( svi_slot_bus_device::bk21_w )
{
- device_svi_slot_interface *entry = m_dev.first();
-
- while (entry)
- {
- entry->bk21_w(state);
- entry = entry->next();
- }
+ for (device_svi_slot_interface &entry : m_dev)
+ entry.bk21_w(state);
}
//-------------------------------------------------
@@ -146,13 +122,8 @@ WRITE_LINE_MEMBER( svi_slot_bus_device::bk21_w )
WRITE_LINE_MEMBER( svi_slot_bus_device::bk22_w )
{
- device_svi_slot_interface *entry = m_dev.first();
-
- while (entry)
- {
- entry->bk22_w(state);
- entry = entry->next();
- }
+ for (device_svi_slot_interface &entry : m_dev)
+ entry.bk22_w(state);
}
//-------------------------------------------------
@@ -161,13 +132,8 @@ WRITE_LINE_MEMBER( svi_slot_bus_device::bk22_w )
WRITE_LINE_MEMBER( svi_slot_bus_device::bk31_w )
{
- device_svi_slot_interface *entry = m_dev.first();
-
- while (entry)
- {
- entry->bk31_w(state);
- entry = entry->next();
- }
+ for (device_svi_slot_interface &entry : m_dev)
+ entry.bk31_w(state);
}
//-------------------------------------------------
@@ -176,13 +142,8 @@ WRITE_LINE_MEMBER( svi_slot_bus_device::bk31_w )
WRITE_LINE_MEMBER( svi_slot_bus_device::bk32_w )
{
- device_svi_slot_interface *entry = m_dev.first();
-
- while (entry)
- {
- entry->bk32_w(state);
- entry = entry->next();
- }
+ for (device_svi_slot_interface &entry : m_dev)
+ entry.bk32_w(state);
}
@@ -225,8 +186,7 @@ void svi_slot_device::device_start()
device_svi_slot_interface::device_svi_slot_interface(const machine_config &mconfig, device_t &device) :
device_interface(device, "svi3x8slot"),
- m_bus(nullptr),
- m_next(nullptr)
+ m_bus(nullptr)
{
}
diff --git a/src/devices/bus/svi3x8/slot/slot.h b/src/devices/bus/svi3x8/slot/slot.h
index 11b94d07e5d..da676e7ec84 100644
--- a/src/devices/bus/svi3x8/slot/slot.h
+++ b/src/devices/bus/svi3x8/slot/slot.h
@@ -39,6 +39,9 @@
#pragma once
+#include <functional>
+#include <vector>
+
//**************************************************************************
@@ -80,10 +83,12 @@ public:
DECLARE_WRITE_LINE_MEMBER( bk32_w );
private:
- // device-level overrides
+ using card_vector = std::vector<std::reference_wrapper<device_svi_slot_interface> >;
+
+ // device_t implementation
virtual void device_start() override;
- simple_list<device_svi_slot_interface> m_dev;
+ card_vector m_dev;
devcb_write_line m_int_handler;
devcb_write_line m_romdis_handler;
@@ -115,7 +120,7 @@ public:
template <typename T> void set_bus(T &&tag) { m_bus.set_tag(std::forward<T>(tag)); }
protected:
- // device-level overrides
+ // device_t implementation
virtual void device_start() override;
// configuration
@@ -129,15 +134,12 @@ DECLARE_DEVICE_TYPE(SVI_SLOT, svi_slot_device)
class device_svi_slot_interface : public device_interface
{
- template <class ElementType> friend class simple_list;
public:
// construction/destruction
virtual ~device_svi_slot_interface();
void set_bus_device(svi_slot_bus_device &bus);
- device_svi_slot_interface *next() const { return m_next; }
-
virtual uint8_t mreq_r(offs_t offset) { return 0xff; }
virtual void mreq_w(offs_t offset, uint8_t data) { }
virtual uint8_t iorq_r(offs_t offset) { return 0xff; }
@@ -152,9 +154,6 @@ protected:
device_svi_slot_interface(const machine_config &mconfig, device_t &device);
svi_slot_bus_device *m_bus;
-
-private:
- device_svi_slot_interface *m_next;
};
// include here so drivers don't need to
diff --git a/src/devices/bus/tiki100/exp.cpp b/src/devices/bus/tiki100/exp.cpp
index fee968f40d7..3ada6616c65 100644
--- a/src/devices/bus/tiki100/exp.cpp
+++ b/src/devices/bus/tiki100/exp.cpp
@@ -63,6 +63,10 @@ tiki100_bus_device::tiki100_bus_device(const machine_config &mconfig, const char
{
}
+tiki100_bus_device::~tiki100_bus_device()
+{
+}
+
//-------------------------------------------------
// device_start - device-specific startup
@@ -85,7 +89,7 @@ void tiki100_bus_device::device_start()
void tiki100_bus_device::add_card(device_tiki100bus_card_interface &card)
{
- m_device_list.append(card);
+ m_device_list.emplace_back(card);
card.m_bus = this;
}
@@ -97,13 +101,8 @@ void tiki100_bus_device::add_card(device_tiki100bus_card_interface &card)
uint8_t tiki100_bus_device::mrq_r(offs_t offset, uint8_t data, bool &mdis)
{
- device_tiki100bus_card_interface *entry = m_device_list.first();
-
- while (entry)
- {
- data &= entry->mrq_r(offset, data, mdis);
- entry = entry->next();
- }
+ for (device_tiki100bus_card_interface &entry : m_device_list)
+ data &= entry.mrq_r(offset, data, mdis);
return data;
}
@@ -115,13 +114,8 @@ uint8_t tiki100_bus_device::mrq_r(offs_t offset, uint8_t data, bool &mdis)
void tiki100_bus_device::mrq_w(offs_t offset, uint8_t data)
{
- device_tiki100bus_card_interface *entry = m_device_list.first();
-
- while (entry)
- {
- entry->mrq_w(offset, data);
- entry = entry->next();
- }
+ for (device_tiki100bus_card_interface &entry : m_device_list)
+ entry.mrq_w(offset, data);
}
@@ -131,13 +125,8 @@ void tiki100_bus_device::mrq_w(offs_t offset, uint8_t data)
uint8_t tiki100_bus_device::iorq_r(offs_t offset, uint8_t data)
{
- device_tiki100bus_card_interface *entry = m_device_list.first();
-
- while (entry)
- {
- data &= entry->iorq_r(offset, data);
- entry = entry->next();
- }
+ for (device_tiki100bus_card_interface &entry : m_device_list)
+ data &= entry.iorq_r(offset, data);
return data;
}
@@ -149,13 +138,8 @@ uint8_t tiki100_bus_device::iorq_r(offs_t offset, uint8_t data)
void tiki100_bus_device::iorq_w(offs_t offset, uint8_t data)
{
- device_tiki100bus_card_interface *entry = m_device_list.first();
-
- while (entry)
- {
- entry->iorq_w(offset, data);
- entry = entry->next();
- }
+ for (device_tiki100bus_card_interface &entry : m_device_list)
+ entry.iorq_w(offset, data);
}
@@ -165,13 +149,8 @@ void tiki100_bus_device::iorq_w(offs_t offset, uint8_t data)
WRITE_LINE_MEMBER( tiki100_bus_device::busak_w )
{
- device_tiki100bus_card_interface *entry = m_device_list.first();
-
- while (entry)
- {
- entry->busak_w(state);
- entry = entry->next();
- }
+ for (device_tiki100bus_card_interface &entry : m_device_list)
+ entry.busak_w(state);
}
@@ -187,8 +166,7 @@ WRITE_LINE_MEMBER( tiki100_bus_device::busak_w )
device_tiki100bus_card_interface::device_tiki100bus_card_interface(const machine_config &mconfig, device_t &device) :
device_interface(device, "tiki100bus"),
m_bus(nullptr),
- m_busak(CLEAR_LINE),
- m_next(nullptr)
+ m_busak(CLEAR_LINE)
{
m_slot = dynamic_cast<tiki100_bus_slot_device *>(device.owner());
}
diff --git a/src/devices/bus/tiki100/exp.h b/src/devices/bus/tiki100/exp.h
index 7625971a47d..9afcbddfecd 100644
--- a/src/devices/bus/tiki100/exp.h
+++ b/src/devices/bus/tiki100/exp.h
@@ -16,6 +16,9 @@
#include "machine/z80daisy.h"
+#include <functional>
+#include <vector>
+
//**************************************************************************
@@ -33,11 +36,8 @@ class tiki100_bus_slot_device;
class device_tiki100bus_card_interface : public device_interface
{
friend class tiki100_bus_device;
- template <class ElementType> friend class simple_list;
public:
- device_tiki100bus_card_interface *next() const { return m_next; }
-
// memory access
virtual uint8_t mrq_r(offs_t offset, uint8_t data, bool &mdis) { mdis = 1; return data; }
virtual void mrq_w(offs_t offset, uint8_t data) { }
@@ -62,9 +62,6 @@ protected:
tiki100_bus_device *m_bus;
tiki100_bus_slot_device *m_slot;
int m_busak;
-
-private:
- device_tiki100bus_card_interface *m_next;
};
@@ -92,10 +89,10 @@ public:
template <typename T> void set_bus(T &&tag) { m_bus.set_tag(std::forward<T>(tag)); }
protected:
- // device-level overrides
+ // device_t implementation
virtual void device_start() override;
- // device_z80daisy_interface overrides
+ // device_z80daisy_interface implementation
virtual int z80daisy_irq_state() override { return get_card_device() ? m_card->z80daisy_irq_state() : 0; }
virtual int z80daisy_irq_ack() override { return get_card_device() ? m_card->z80daisy_irq_ack() : 0; }
virtual void z80daisy_irq_reti() override { if (get_card_device()) m_card->z80daisy_irq_reti(); }
@@ -118,7 +115,7 @@ class tiki100_bus_device : public device_t
public:
// construction/destruction
tiki100_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- ~tiki100_bus_device() { m_device_list.detach_all(); }
+ ~tiki100_bus_device();
auto irq_wr_callback() { return m_irq_cb.bind(); }
auto nmi_wr_callback() { return m_nmi_cb.bind(); }
@@ -145,17 +142,19 @@ public:
void exin_mrq_w(offs_t offset, uint8_t data) { m_out_mrq_cb(offset, data); }
protected:
- // device-level overrides
+ // device_t implementation
virtual void device_start() override;
private:
+ using card_vector = std::vector<std::reference_wrapper<device_tiki100bus_card_interface> >;
+
devcb_write_line m_irq_cb;
devcb_write_line m_nmi_cb;
devcb_write_line m_busrq_cb;
devcb_read8 m_in_mrq_cb;
devcb_write8 m_out_mrq_cb;
- simple_list<device_tiki100bus_card_interface> m_device_list;
+ card_vector m_device_list;
};
diff --git a/src/devices/bus/wangpc/wangpc.cpp b/src/devices/bus/wangpc/wangpc.cpp
index 7f209465d2d..f2c2e4c3c65 100644
--- a/src/devices/bus/wangpc/wangpc.cpp
+++ b/src/devices/bus/wangpc/wangpc.cpp
@@ -41,7 +41,7 @@ wangpcbus_slot_device::wangpcbus_slot_device(const machine_config &mconfig, cons
void wangpcbus_slot_device::device_start()
{
- device_wangpcbus_card_interface *dev = get_card_device();
+ device_wangpcbus_card_interface *const dev = get_card_device();
if (dev)
m_bus->add_card(*dev, m_sid);
}
@@ -66,6 +66,10 @@ wangpcbus_device::wangpcbus_device(const machine_config &mconfig, const char *ta
{
}
+wangpcbus_device::~wangpcbus_device()
+{
+}
+
//-------------------------------------------------
// device_start - device-specific startup
@@ -93,7 +97,7 @@ void wangpcbus_device::device_start()
void wangpcbus_device::add_card(device_wangpcbus_card_interface &card, int sid)
{
- m_device_list.append(card);
+ m_device_list.emplace_back(card);
card.m_bus = this;
card.m_sid = sid;
@@ -108,13 +112,8 @@ uint16_t wangpcbus_device::mrdc_r(offs_t offset, uint16_t mem_mask)
{
uint16_t data = 0xffff;
- device_wangpcbus_card_interface *entry = m_device_list.first();
-
- while (entry)
- {
- data &= entry->wangpcbus_mrdc_r(offset + 0x40000/2, mem_mask);
- entry = entry->next();
- }
+ for (device_wangpcbus_card_interface &entry : m_device_list)
+ data &= entry.wangpcbus_mrdc_r(offset + 0x40000/2, mem_mask);
return data;
}
@@ -126,13 +125,8 @@ uint16_t wangpcbus_device::mrdc_r(offs_t offset, uint16_t mem_mask)
void wangpcbus_device::amwc_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
- device_wangpcbus_card_interface *entry = m_device_list.first();
-
- while (entry)
- {
- entry->wangpcbus_amwc_w(offset + 0x40000/2, mem_mask, data);
- entry = entry->next();
- }
+ for (device_wangpcbus_card_interface &entry : m_device_list)
+ entry.wangpcbus_amwc_w(offset + 0x40000/2, mem_mask, data);
}
@@ -144,13 +138,8 @@ uint16_t wangpcbus_device::sad_r(offs_t offset, uint16_t mem_mask)
{
uint16_t data = 0xffff;
- device_wangpcbus_card_interface *entry = m_device_list.first();
-
- while (entry)
- {
- data &= entry->wangpcbus_iorc_r(offset + 0x1100/2, mem_mask);
- entry = entry->next();
- }
+ for (device_wangpcbus_card_interface &entry : m_device_list)
+ data &= entry.wangpcbus_iorc_r(offset + 0x1100/2, mem_mask);
return data;
}
@@ -162,13 +151,8 @@ uint16_t wangpcbus_device::sad_r(offs_t offset, uint16_t mem_mask)
void wangpcbus_device::sad_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
- device_wangpcbus_card_interface *entry = m_device_list.first();
-
- while (entry)
- {
- entry->wangpcbus_aiowc_w(offset + 0x1100/2, mem_mask, data);
- entry = entry->next();
- }
+ for (device_wangpcbus_card_interface &entry : m_device_list)
+ entry.wangpcbus_aiowc_w(offset + 0x1100/2, mem_mask, data);
}
@@ -179,17 +163,14 @@ void wangpcbus_device::sad_w(offs_t offset, uint16_t data, uint16_t mem_mask)
uint8_t wangpcbus_device::dack_r(int line)
{
uint8_t retVal = 0xff;
- device_wangpcbus_card_interface *entry = m_device_list.first();
- while (entry)
+ for (device_wangpcbus_card_interface &entry : m_device_list)
{
- if (entry->wangpcbus_have_dack(line))
+ if (entry.wangpcbus_have_dack(line))
{
- retVal = entry->wangpcbus_dack_r(line);
+ retVal = entry.wangpcbus_dack_r(line);
break;
}
-
- entry = entry->next();
}
return retVal;
@@ -202,16 +183,10 @@ uint8_t wangpcbus_device::dack_r(int line)
void wangpcbus_device::dack_w(int line, uint8_t data)
{
- device_wangpcbus_card_interface *entry = m_device_list.first();
-
- while (entry)
+ for (device_wangpcbus_card_interface &entry : m_device_list)
{
- if (entry->wangpcbus_have_dack(line))
- {
- entry->wangpcbus_dack_w(line, data);
- }
-
- entry = entry->next();
+ if (entry.wangpcbus_have_dack(line))
+ entry.wangpcbus_dack_w(line, data);
}
}
@@ -222,13 +197,8 @@ void wangpcbus_device::dack_w(int line, uint8_t data)
WRITE_LINE_MEMBER( wangpcbus_device::tc_w )
{
- device_wangpcbus_card_interface *entry = m_device_list.first();
-
- while (entry)
- {
- entry->wangpcbus_tc_w(state);
- entry = entry->next();
- }
+ for (device_wangpcbus_card_interface &entry : m_device_list)
+ entry.wangpcbus_tc_w(state);
}
@@ -242,9 +212,11 @@ WRITE_LINE_MEMBER( wangpcbus_device::tc_w )
//-------------------------------------------------
device_wangpcbus_card_interface::device_wangpcbus_card_interface(const machine_config &mconfig, device_t &device) :
- device_interface(device, "wangpcbus"), m_bus(nullptr), m_sid(0), m_next(nullptr)
+ device_interface(device, "wangpcbus"),
+ m_bus(nullptr),
+ m_slot(dynamic_cast<wangpcbus_slot_device *>(device.owner())),
+ m_sid(0)
{
- m_slot = dynamic_cast<wangpcbus_slot_device *>(device.owner());
}
diff --git a/src/devices/bus/wangpc/wangpc.h b/src/devices/bus/wangpc/wangpc.h
index 05ca1908f75..e04dda52d65 100644
--- a/src/devices/bus/wangpc/wangpc.h
+++ b/src/devices/bus/wangpc/wangpc.h
@@ -14,6 +14,8 @@
#pragma once
+#include <functional>
+#include <vector>
@@ -49,7 +51,7 @@ public:
void set_bus_slot(int sid) { m_sid = sid; }
protected:
- // device-level overrides
+ // device_t implementation
virtual void device_start() override;
private:
@@ -70,7 +72,7 @@ class wangpcbus_device : public device_t
public:
// construction/destruction
wangpcbus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- ~wangpcbus_device() { m_device_list.detach_all(); }
+ ~wangpcbus_device();
auto irq2_wr_callback() { return m_write_irq2.bind(); }
auto irq3_wr_callback() { return m_write_irq3.bind(); }
@@ -119,10 +121,12 @@ public:
DECLARE_WRITE_LINE_MEMBER( ioerror_w ) { m_write_ioerror(state); }
protected:
- // device-level overrides
+ // devicedevice_t implementation
virtual void device_start() override;
private:
+ using card_vector = std::vector<std::reference_wrapper<device_wangpcbus_card_interface> >;
+
devcb_write_line m_write_irq2;
devcb_write_line m_write_irq3;
devcb_write_line m_write_irq4;
@@ -134,7 +138,7 @@ private:
devcb_write_line m_write_drq3;
devcb_write_line m_write_ioerror;
- simple_list<device_wangpcbus_card_interface> m_device_list;
+ card_vector m_device_list;
};
@@ -148,11 +152,8 @@ DECLARE_DEVICE_TYPE(WANGPC_BUS, wangpcbus_device)
class device_wangpcbus_card_interface : public device_interface
{
friend class wangpcbus_device;
- template <class ElementType> friend class simple_list;
public:
- device_wangpcbus_card_interface *next() const { return m_next; }
-
// memory access
virtual uint16_t wangpcbus_mrdc_r(offs_t offset, uint16_t mem_mask) { return 0; }
virtual void wangpcbus_amwc_w(offs_t offset, uint16_t mem_mask, uint16_t data) { }
@@ -175,12 +176,9 @@ protected:
virtual void interface_pre_start() override;
wangpcbus_device *m_bus;
- wangpcbus_slot_device *m_slot;
+ wangpcbus_slot_device *const m_slot;
int m_sid;
-
-private:
- device_wangpcbus_card_interface *m_next;
};
diff --git a/src/devices/bus/wysekbd/wysekbd.h b/src/devices/bus/wysekbd/wysekbd.h
index 8cbfc662b81..d841d26ae48 100644
--- a/src/devices/bus/wysekbd/wysekbd.h
+++ b/src/devices/bus/wysekbd/wysekbd.h
@@ -37,8 +37,8 @@ public:
}
// line handlers
- inline DECLARE_WRITE_LINE_MEMBER(cmd_w);
- inline DECLARE_READ_LINE_MEMBER(data_r);
+ DECLARE_WRITE_LINE_MEMBER(cmd_w);
+ DECLARE_READ_LINE_MEMBER(data_r);
protected:
// device-level overrides
@@ -75,13 +75,13 @@ extern void wy60_keyboards(device_slot_interface &slot);
// INLINE FUNCTIONS
//**************************************************************************
-WRITE_LINE_MEMBER(wyse_keyboard_port_device::cmd_w)
+inline WRITE_LINE_MEMBER(wyse_keyboard_port_device::cmd_w)
{
if (m_kbd != nullptr)
m_kbd->wysekbd_write_cmd(state);
}
-READ_LINE_MEMBER(wyse_keyboard_port_device::data_r)
+inline READ_LINE_MEMBER(wyse_keyboard_port_device::data_r)
{
if (m_kbd != nullptr)
return m_kbd->wysekbd_read_data();
diff --git a/src/emu/ioport.cpp b/src/emu/ioport.cpp
index 814eb286472..f74fe2c30f0 100644
--- a/src/emu/ioport.cpp
+++ b/src/emu/ioport.cpp
@@ -1846,14 +1846,14 @@ time_t ioport_manager::initialize()
port.second->init_live_state();
// handle autoselection of devices
- init_autoselect_devices(IPT_AD_STICK_X, IPT_AD_STICK_Y, IPT_AD_STICK_Z, OPTION_ADSTICK_DEVICE, "analog joystick");
- init_autoselect_devices(IPT_PADDLE, IPT_PADDLE_V, 0, OPTION_PADDLE_DEVICE, "paddle");
- init_autoselect_devices(IPT_PEDAL, IPT_PEDAL2, IPT_PEDAL3, OPTION_PEDAL_DEVICE, "pedal");
- init_autoselect_devices(IPT_LIGHTGUN_X, IPT_LIGHTGUN_Y, 0, OPTION_LIGHTGUN_DEVICE, "lightgun");
- init_autoselect_devices(IPT_POSITIONAL, IPT_POSITIONAL_V, 0, OPTION_POSITIONAL_DEVICE, "positional");
- init_autoselect_devices(IPT_DIAL, IPT_DIAL_V, 0, OPTION_DIAL_DEVICE, "dial");
- init_autoselect_devices(IPT_TRACKBALL_X, IPT_TRACKBALL_Y, 0, OPTION_TRACKBALL_DEVICE, "trackball");
- init_autoselect_devices(IPT_MOUSE_X, IPT_MOUSE_Y, 0, OPTION_MOUSE_DEVICE, "mouse");
+ init_autoselect_devices({ IPT_AD_STICK_X, IPT_AD_STICK_Y, IPT_AD_STICK_Z }, OPTION_ADSTICK_DEVICE, "analog joystick");
+ init_autoselect_devices({ IPT_PADDLE, IPT_PADDLE_V }, OPTION_PADDLE_DEVICE, "paddle");
+ init_autoselect_devices({ IPT_PEDAL, IPT_PEDAL2, IPT_PEDAL3 }, OPTION_PEDAL_DEVICE, "pedal");
+ init_autoselect_devices({ IPT_LIGHTGUN_X, IPT_LIGHTGUN_Y }, OPTION_LIGHTGUN_DEVICE, "lightgun");
+ init_autoselect_devices({ IPT_POSITIONAL, IPT_POSITIONAL_V }, OPTION_POSITIONAL_DEVICE, "positional");
+ init_autoselect_devices({ IPT_DIAL, IPT_DIAL_V }, OPTION_DIAL_DEVICE, "dial");
+ init_autoselect_devices({ IPT_TRACKBALL_X, IPT_TRACKBALL_Y }, OPTION_TRACKBALL_DEVICE, "trackball");
+ init_autoselect_devices({ IPT_MOUSE_X, IPT_MOUSE_Y }, OPTION_MOUSE_DEVICE, "mouse");
// look for 4-way diagonal joysticks and change the default map if we find any
const char *joystick_map_default = machine().options().joystick_map();
@@ -1911,39 +1911,71 @@ void ioport_manager::init_port_types()
// in and the corresponding option
//-------------------------------------------------
-void ioport_manager::init_autoselect_devices(int type1, int type2, int type3, const char *option, const char *ananame)
+void ioport_manager::init_autoselect_devices(std::initializer_list<ioport_type> types, std::string_view option, std::string_view ananame)
{
+ static std::pair<char const *, char const *> const CLASS_OPTIONS[] = {
+ { "mouse", OPTION_MOUSE },
+ { "joystick", OPTION_JOYSTICK },
+ { "lightgun", OPTION_LIGHTGUN } };
+
// if nothing specified, ignore the option
- const char *stemp = machine().options().value(option);
- if (stemp[0] == 0 || strcmp(stemp, "none") == 0)
+ auto const autooption = machine().options().get_entry(option);
+ char const *const autoclass = autooption->value();
+ if (!autoclass || !*autoclass || !std::strcmp(autoclass, "none"))
return;
- // extract valid strings
+ // if the device class is enabled anyway or disabled at a higher priority level, do nothing
+ auto const classname = std::find_if(
+ std::begin(CLASS_OPTIONS),
+ std::end(CLASS_OPTIONS),
+ [&autoclass] (auto const &x) { return !std::strcmp(autoclass, x.first); });
+ if (std::end(CLASS_OPTIONS) != classname)
+ {
+ if (machine().options().bool_value(classname->second))
+ return;
+
+ auto const classoption = machine().options().get_entry(classname->second);
+ if (classoption->priority() > autooption->priority())
+ {
+ osd_printf_verbose("Input: Won't autoenable %s in presence of a %s as it's disabled at a higher priority\n", autoclass, ananame);
+ return;
+ }
+ }
+
+ // find matching device class
input_class *autoenable_class = nullptr;
for (input_device_class devclass = DEVICE_CLASS_FIRST_VALID; devclass <= DEVICE_CLASS_LAST_VALID; ++devclass)
- if (strcmp(stemp, machine().input().device_class(devclass).name()) == 0)
+ {
+ if (!std::strcmp(autoclass, machine().input().device_class(devclass).name()))
{
autoenable_class = &machine().input().device_class(devclass);
break;
}
- if (autoenable_class == nullptr)
+ }
+ if (!autoenable_class)
{
- osd_printf_error("Invalid %s value %s; reverting to keyboard\n", option, stemp);
+ osd_printf_error("Invalid %s value %s; reverting to keyboard\n", option, autoclass);
autoenable_class = &machine().input().device_class(DEVICE_CLASS_KEYBOARD);
}
- // only scan the list if we haven't already enabled this class of control
- if (!autoenable_class->enabled())
- for (auto &port : m_portlist)
- for (ioport_field const &field : port.second->fields())
+ // nothing to do if the class is already enabled
+ if (autoenable_class->enabled())
+ return;
- // if this port type is in use, apply the autoselect criteria
- if ((type1 != 0 && field.type() == type1) || (type2 != 0 && field.type() == type2) || (type3 != 0 && field.type() == type3))
- {
- osd_printf_verbose("Input: Autoenabling %s due to presence of a %s\n", autoenable_class->name(), ananame);
- autoenable_class->enable();
- break;
- }
+ // scan the port list
+ for (auto &port : m_portlist)
+ {
+ for (ioport_field const &field : port.second->fields())
+ {
+ // if this port type is in use, apply the autoselect criteria
+ if (std::find(std::begin(types), std::end(types), field.type()) != std::end(types))
+ {
+ osd_printf_verbose("Input: Autoenabling %s due to presence of a %s\n", autoenable_class->name(), ananame);
+ autoenable_class->enable();
+ return;
+ }
+ }
+ }
}
diff --git a/src/emu/ioport.h b/src/emu/ioport.h
index 0a80e01bd00..3d8d34bc9ce 100644
--- a/src/emu/ioport.h
+++ b/src/emu/ioport.h
@@ -25,6 +25,7 @@
#include <cstdint>
#include <cstring>
#include <ctime>
+#include <initializer_list>
#include <list>
#include <memory>
#include <vector>
@@ -961,7 +962,7 @@ public:
private:
// internal helpers
void init_port_types();
- void init_autoselect_devices(int type1, int type2, int type3, const char *option, const char *ananame);
+ void init_autoselect_devices(std::initializer_list<ioport_type> types, std::string_view option, std::string_view ananame);
void frame_update_callback();
void frame_update();
diff --git a/src/emu/sound.cpp b/src/emu/sound.cpp
index ef13fd7c635..45f430e2461 100644
--- a/src/emu/sound.cpp
+++ b/src/emu/sound.cpp
@@ -1377,7 +1377,12 @@ void sound_manager::config_load(config_type cfg_type, config_level cfg_level, ut
// master volume attenuation
if (util::xml::data_node const *node = parentnode->get_child("attenuation"))
- set_attenuation(std::clamp(int(node->get_attribute_int("value", 0)), -32, 0));
+ {
+ // treat source INI files or more specific as higher priority than CFG
+ // FIXME: leaky abstraction - this depends on a front-end implementation detail
+ if ((OPTION_PRIORITY_NORMAL + 5) > machine().options().get_entry(OPTION_VOLUME)->priority())
+ set_attenuation(std::clamp(int(node->get_attribute_int("value", 0)), -32, 0));
+ }
// iterate over channel nodes
for (util::xml::data_node const *channelnode = parentnode->get_child("channel"); channelnode != nullptr; channelnode = channelnode->get_next_sibling("channel"))