summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Fabio Priuli <etabeta78@users.noreply.github.com>2014-04-11 07:36:56 +0000
committer Fabio Priuli <etabeta78@users.noreply.github.com>2014-04-11 07:36:56 +0000
commite238b85bc69cf602bc1e54f3931e33df88bb78eb (patch)
treeed93600a619b5b44ba3fb5fe2a9be979647498fd
parentaf800c1155e24c397849ac52d62aedb250214662 (diff)
rf5c68: converted to use delegates. nw.
-rw-r--r--src/emu/sound/rf5c68.c17
-rw-r--r--src/emu/sound/rf5c68.h15
-rw-r--r--src/mess/drivers/fmtowns.c21
3 files changed, 21 insertions, 32 deletions
diff --git a/src/emu/sound/rf5c68.c b/src/emu/sound/rf5c68.c
index 23dcb94cd46..372f1bf65f0 100644
--- a/src/emu/sound/rf5c68.c
+++ b/src/emu/sound/rf5c68.c
@@ -24,8 +24,7 @@ rf5c68_device::rf5c68_device(const machine_config &mconfig, const char *tag, dev
m_stream(NULL),
m_cbank(0),
m_wbank(0),
- m_enable(0),
- m_sample_callback(NULL)
+ m_enable(0)
{
memset(m_data, 0, sizeof(UINT8)*0x10000);
}
@@ -37,19 +36,13 @@ rf5c68_device::rf5c68_device(const machine_config &mconfig, const char *tag, dev
void rf5c68_device::device_start()
{
- const rf5c68_interface* intf = (const rf5c68_interface*)static_config();
-
+ m_sample_end_cb.bind_relative_to(*owner());
+
/* allocate memory for the chip */
memset(m_data, 0xff, sizeof(m_data));
/* allocate the stream */
m_stream = stream_alloc(0, 2, clock() / 384);
-
- /* set up callback */
- if(intf != NULL)
- m_sample_callback = intf->sample_end_callback;
- else
- m_sample_callback = NULL;
}
@@ -88,10 +81,10 @@ void rf5c68_device::sound_stream_update(sound_stream &stream, stream_sample_t **
int sample;
/* trigger sample callback */
- if(m_sample_callback)
+ if(!m_sample_end_cb.isnull())
{
if(((chan->addr >> 11) & 0xfff) == 0xfff)
- m_sample_callback(this, ((chan->addr >> 11)/0x2000));
+ m_sample_end_cb((chan->addr >> 11)/0x2000);
}
/* fetch the sample and handle looping */
diff --git a/src/emu/sound/rf5c68.h b/src/emu/sound/rf5c68.h
index 22468038f2b..d4d5b13cf04 100644
--- a/src/emu/sound/rf5c68.h
+++ b/src/emu/sound/rf5c68.h
@@ -19,15 +19,16 @@
#define MCFG_RF5C68_REPLACE(_tag, _clock) \
MCFG_DEVICE_REPLACE(_tag, RF5C68, _clock)
+#define MCFG_RF5C68_SAMPLE_END_CB(_class, _method) \
+ rf5c68_device::set_end_callback(*device, rf5c68_sample_end_cb_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
-struct rf5c68_interface
-{
- void (*sample_end_callback)(device_t* device, int channel);
-};
+typedef device_delegate<void (int channel)> rf5c68_sample_end_cb_delegate;
+
+#define RF5C68_SAMPLE_END_CB_MEMBER(_name) void _name(int channel)
struct rf5c68_pcm_channel
@@ -51,7 +52,6 @@ struct rf5c68_pcm_channel
};
-
// ======================> rf5c68_device
class rf5c68_device : public device_t,
@@ -61,6 +61,8 @@ public:
rf5c68_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
~rf5c68_device() { }
+ static void set_end_callback(device_t &device, rf5c68_sample_end_cb_delegate callback) { downcast<rf5c68_device &>(device).m_sample_end_cb = callback; }
+
protected:
// device-level overrides
virtual void device_start();
@@ -82,7 +84,8 @@ private:
UINT8 m_wbank;
UINT8 m_enable;
UINT8 m_data[0x10000];
- void (*m_sample_callback)(device_t* device,int channel);
+
+ rf5c68_sample_end_cb_delegate m_sample_end_cb;
};
extern const device_type RF5C68;
diff --git a/src/mess/drivers/fmtowns.c b/src/mess/drivers/fmtowns.c
index 0af8b3fdb74..08168a6c5a4 100644
--- a/src/mess/drivers/fmtowns.c
+++ b/src/mess/drivers/fmtowns.c
@@ -2078,16 +2078,13 @@ WRITE_LINE_MEMBER(towns_state::towns_fm_irq)
}
// PCM interrupt (IRQ 13)
-static void towns_pcm_irq(device_t* device, int channel)
+RF5C68_SAMPLE_END_CB_MEMBER(towns_state::towns_pcm_irq)
{
- towns_state* state = device->machine().driver_data<towns_state>();
- pic8259_device* pic = state->m_pic_slave;
-
- if(state->m_towns_pcm_channel_mask & (1 << channel))
+ if (m_towns_pcm_channel_mask & (1 << channel))
{
- state->m_towns_pcm_irq_flag = 1;
- state->m_towns_pcm_channel_flag |= (1 << channel);
- pic->ir5_w(1);
+ m_towns_pcm_irq_flag = 1;
+ m_towns_pcm_channel_flag |= (1 << channel);
+ m_pic_slave->ir5_w(1);
if(IRQ_LOG) logerror("PIC: IRQ13 (PCM) set high (channel %i)\n",channel);
}
}
@@ -2670,11 +2667,6 @@ static const upd71071_intf towns_dma_config =
{ DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }
};
-static const rf5c68_interface rf5c68_intf =
-{
- towns_pcm_irq
-};
-
static const gfx_layout fnt_chars_16x16 =
{
16,16,
@@ -2733,8 +2725,9 @@ static MACHINE_CONFIG_FRAGMENT( towns_base )
MCFG_SOUND_ADD("fm", YM3438, 53693100 / 7) // actual clock speed unknown
MCFG_YM2612_IRQ_HANDLER(WRITELINE(towns_state, towns_fm_irq))
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+
MCFG_RF5C68_ADD("pcm", 53693100 / 7) // actual clock speed unknown
- MCFG_SOUND_CONFIG(rf5c68_intf)
+ MCFG_RF5C68_SAMPLE_END_CB(towns_state, towns_pcm_irq)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.50)
MCFG_SOUND_ADD("cdda",CDDA,0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)