summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/audio/gamate.c
blob: 5c682841076a2aa4431c23c0ac021292902fe47e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/***************************************************************************
 gamate sound hardware

 PeT mess@utanet.at
***************************************************************************/

#include "emu.h"
#include "includes/gamate.h"


// device type definition
const device_type GAMATE_SND = &device_creator<gamate_sound_device>;


//**************************************************************************
//  LIVE DEVICE
//**************************************************************************

//-------------------------------------------------
//  gamate_sound_device - constructor
//-------------------------------------------------

gamate_sound_device::gamate_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
	: device_t(mconfig, GAMATE_SND, "Gamate Audio Custom", tag, owner, clock, "gamate_sound", __FILE__),
		device_sound_interface(mconfig, *this),
		m_mixer_channel(NULL)
{
}


//-------------------------------------------------
//  device_start - device-specific startup
//-------------------------------------------------

void gamate_sound_device::device_start()
{
	// bind callbacks
//  m_irq_cb.bind_relative_to(*owner());

	memset(m_channels, 0, sizeof(m_channels));
	memset(reg, 0, sizeof(reg));

	m_mixer_channel = stream_alloc(0, 2, machine().sample_rate());
}


//-------------------------------------------------
//  sound_stream_update - handle a stream update
//-------------------------------------------------

void gamate_sound_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
{
	stream_sample_t *left=outputs[0], *right=outputs[1];
	int i, j;
	GAMATE_CHANNEL *channel;

	for (i = 0; i < samples; i++, left++, right++)
	{
		*left = 0;
		*right = 0;
		for (channel=m_channels, j=0; j<ARRAY_LENGTH(m_channels); j++, channel++)
		{
			if (channel->size != 0)
			{
				if (channel->on)//||channel->count)
				{
					int on = FALSE;
					on = channel->pos <= channel->size / 2;
					{
						INT16 s = on ? channel->volume << 8 : 0;
						if (j == 0)
							*right += s;
						else if (j==1)
							*left += s;
						else {
							*right += s;
							*left += s;
						}
					}
				}
				channel->pos++;
				if (channel->pos >= channel->size)
					channel->pos = 0;
			}
		}
	}
}

WRITE8_MEMBER( gamate_sound_device::device_w )
{
	UINT16 size;

	m_mixer_channel->update();
	reg[offset] = data;
	int chan=-1;

	switch (offset)
	{
		case 0:
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			chan=offset/2;
			size = reg[chan*2] | ((reg[chan*2+1] & 0xf) << 8);
			if (size)
			{
				m_channels[chan].size= (int) (machine().sample_rate() * (size << 5) / machine().device("maincpu")->unscaled_clock());
			}
			else
			{
				m_channels[chan].size = 0;
			}
			m_channels[chan].pos = 0;
			break;
		case 6:
		case 7:
		case 8:
			chan=offset-6;
//          m_channels[chan]->on = data & 0x40;
//          channel->waveform = (data & 0x30) >> 4;
			m_channels[chan].volume = data & 0xf;
			break;
	}
	if (chan!=-1) m_channels[chan].on=m_channels[chan].volume!=0 && m_channels[chan].size>3/* avoid speed loss for unhearable >=23khz*/;
}