trunk/src/emu/sound/k053260.c
| r32475 | r32476 | |
| 128 | 128 | |
| 129 | 129 | void k053260_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) |
| 130 | 130 | { |
| 131 | | static const long dpcmcnv[] = { 0,1,2,4,8,16,32,64, -128, -64, -32, -16, -8, -4, -2, -1}; |
| 131 | static const INT8 dpcmcnv[] = { 0,1,2,4,8,16,32,64, -128, -64, -32, -16, -8, -4, -2, -1}; |
| 132 | 132 | |
| 133 | | int i, j, lvol[4], rvol[4], play[4], loop[4], ppcm_data[4], ppcm[4]; |
| 134 | | unsigned char *rom[4]; |
| 133 | int lvol[4], rvol[4], play[4], loop[4], ppcm[4]; |
| 134 | UINT8 *rom[4]; |
| 135 | 135 | UINT32 delta[4], end[4], pos[4]; |
| 136 | INT8 ppcm_data[4]; |
| 136 | 137 | int dataL, dataR; |
| 137 | | signed char d; |
| 138 | INT8 d; |
| 138 | 139 | |
| 139 | 140 | /* precache some values */ |
| 140 | | for ( i = 0; i < 4; i++ ) { |
| 141 | for ( int i = 0; i < 4; i++ ) { |
| 141 | 142 | rom[i]= &m_rom[m_channels[i].start + ( m_channels[i].bank << 16 )]; |
| 142 | 143 | delta[i] = m_delta_table[m_channels[i].rate]; |
| 143 | 144 | lvol[i] = m_channels[i].volume * m_channels[i].pan; |
| r32475 | r32476 | |
| 152 | 153 | delta[i] /= 2; |
| 153 | 154 | } |
| 154 | 155 | |
| 155 | | for ( j = 0; j < samples; j++ ) { |
| 156 | for ( int j = 0; j < samples; j++ ) { |
| 156 | 157 | dataL = dataR = 0; |
| 157 | 158 | |
| 158 | | for ( i = 0; i < 4; i++ ) { |
| 159 | for ( int i = 0; i < 4; i++ ) { |
| 159 | 160 | /* see if the voice is on */ |
| 160 | 161 | if ( play[i] ) { |
| 161 | 162 | /* see if we're done */ |
| r32475 | r32476 | |
| 183 | 184 | newdata = ( ( rom[i][pos[i] >> BASE_SHIFT] ) ) & 0x0f; /*low nybble*/ |
| 184 | 185 | } |
| 185 | 186 | |
| 186 | | ppcm_data[i] = (( ( ppcm_data[i] * 62 ) >> 6 ) + dpcmcnv[newdata]); |
| 187 | | |
| 188 | | if ( ppcm_data[i] > 127 ) |
| 189 | | ppcm_data[i] = 127; |
| 190 | | else |
| 191 | | if ( ppcm_data[i] < -128 ) |
| 192 | | ppcm_data[i] = -128; |
| 187 | ppcm_data[i] += dpcmcnv[newdata]; |
| 193 | 188 | } |
| 194 | 189 | |
| 195 | 190 | |
| r32475 | r32476 | |
| 215 | 210 | } |
| 216 | 211 | |
| 217 | 212 | /* update the regs now */ |
| 218 | | for ( i = 0; i < 4; i++ ) { |
| 213 | for ( int i = 0; i < 4; i++ ) { |
| 219 | 214 | m_channels[i].pos = pos[i]; |
| 220 | 215 | m_channels[i].play = play[i]; |
| 221 | 216 | m_channels[i].ppcm_data = ppcm_data[i]; |