static void generate_adpcm(struct okim6295 *chip, struct ADPCMVoice *voice, INT16 *buffer, int samples) { /* if this voice is active */ if (voice->playing) { UINT8 *base = chip->region_base + chip->bank_offset + voice->base_offset; int sample = voice->sample; int count = voice->count; /* loop while we still have samples to generate */ while (samples) { /* compute the new amplitude and update the current step */ int nibble = base[sample / 2] >> (((sample & 1) << 2) ^ 4); /* output to the buffer, scaling by the volume */ *buffer++ = clock_adpcm(&voice->adpcm, nibble) * voice->volume / 256; samples--; /* next! */ if (++sample >= count) { voice->playing = 0; break; } } /* update the parameters */ voice->sample = sample; }
static STREAM_UPDATE( okim6258_update ) { okim6258_state *chip = (okim6258_state *)param; stream_sample_t *buffer = outputs[0]; memset(outputs[0], 0, samples * sizeof(*outputs[0])); if (chip->status & STATUS_PLAYING) { int nibble_shift = chip->nibble_shift; while (samples) { /* Compute the new amplitude and update the current step */ int nibble = (chip->data_in >> nibble_shift) & 0xf; /* Output to the buffer */ INT16 sample = clock_adpcm(chip, nibble); nibble_shift ^= 4; *buffer++ = sample; samples--; } /* Update the parameters */ chip->nibble_shift = nibble_shift; }
void okim6258_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) { stream_sample_t *buffer = outputs[0]; memset(outputs[0], 0, samples * sizeof(*outputs[0])); if (m_status & STATUS_PLAYING) { int nibble_shift = m_nibble_shift; while (samples) { /* Compute the new amplitude and update the current step */ int nibble = (m_data_in >> nibble_shift) & 0xf; /* Output to the buffer */ INT16 sample = clock_adpcm(nibble); nibble_shift ^= 4; *buffer++ = sample; samples--; } /* Update the parameters */ m_nibble_shift = nibble_shift; }
static void generate_adpcm(okim6376_state *chip, struct ADPCMVoice *voice, INT16 *buffer, int samples,int channel) { /* if this voice is active */ if (voice->playing) { UINT8 *base = chip->region_base + voice->base_offset; int sample = voice->sample; int count = voice->count; /* loop while we still have samples to generate */ while (samples) { int nibble; if (count == 0) { /* get the number of samples to play */ count = (base[sample / 2] & 0x7f) << 1; /* end of voice marker */ if (count == 0) { voice->playing = 0; break; } else { /* step past the count byte */ sample += 2; } } /* compute the new amplitude and update the current step */ nibble = base[sample / 2] >> (((sample & 1) << 2) ^ 4); /* output to the buffer, scaling by the volume */ /* signal in range -4096..4095, volume in range 2..16 => signal * volume / 2 in range -32768..32767 */ *buffer++ = clock_adpcm(voice, nibble) * voice->volume / 2; ++sample; --count; --samples; } /* update the parameters */ voice->sample = sample; voice->count = count; }