static STREAM_UPDATE( snk6502_tone_update ) { stream_sample_t *buffer = outputs[0]; snk6502_sound_state *state = get_safe_token(device); TONE *tone_channels = state->m_tone_channels; int i; for (i = 0; i < CHANNELS; i++) validate_tone_channel(state, i); while (samples-- > 0) { INT32 data = 0; for (i = 0; i < CHANNELS; i++) { TONE *voice = &tone_channels[i]; INT16 *form = voice->form; if (!voice->mute && voice->sample_step) { int cur_pos = voice->sample_cur + voice->sample_step; int prev = form[(voice->sample_cur >> FRAC_BITS) & 15]; int cur = form[(cur_pos >> FRAC_BITS) & 15]; /* interpolate */ data += ((INT32)prev * (FRAC_ONE - (cur_pos & FRAC_MASK)) + (INT32)cur * (cur_pos & FRAC_MASK)) >> FRAC_BITS; voice->sample_cur = cur_pos; } } *buffer++ = data; state->m_tone_clock += FRAC_ONE; if (state->m_tone_clock >= state->m_tone_clock_expire) { for (i = 0; i < CHANNELS; i++) { tone_channels[i].offset++; tone_channels[i].offset &= tone_channels[i].mask; validate_tone_channel(state, i); } if (tone_channels[0].offset == 0 && state->m_Sound0StopOnRollover) tone_channels[0].mute = 1; state->m_tone_clock -= state->m_tone_clock_expire; } }
void snk6502_sound_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) { stream_sample_t *buffer = outputs[0]; int i; for (i = 0; i < CHANNELS; i++) validate_tone_channel(i); while (samples-- > 0) { INT32 data = 0; for (i = 0; i < CHANNELS; i++) { TONE *voice = &m_tone_channels[i]; INT16 *form = voice->form; if (!voice->mute && voice->sample_step) { int cur_pos = voice->sample_cur + voice->sample_step; int prev = form[(voice->sample_cur >> FRAC_BITS) & 15]; int cur = form[(cur_pos >> FRAC_BITS) & 15]; /* interpolate */ data += ((INT32)prev * (FRAC_ONE - (cur_pos & FRAC_MASK)) + (INT32)cur * (cur_pos & FRAC_MASK)) >> FRAC_BITS; voice->sample_cur = cur_pos; } } *buffer++ = data; m_tone_clock += FRAC_ONE; if (m_tone_clock >= m_tone_clock_expire) { for (i = 0; i < CHANNELS; i++) { m_tone_channels[i].offset++; m_tone_channels[i].offset &= m_tone_channels[i].mask; validate_tone_channel(i); } if (m_tone_channels[0].offset == 0 && m_Sound0StopOnRollover) m_tone_channels[0].mute = 1; m_tone_clock -= m_tone_clock_expire; } }
static void rockola_tone_update(void *param, stream_sample_t **inputs, stream_sample_t **outputs, int len) { stream_sample_t *buffer = outputs[0]; int i; for (i = 0; i < CHANNELS; i++) validate_tone_channel(i); while (len-- > 0) { INT32 data = 0; for (i = 0; i < CHANNELS; i++) { TONE *voice = &tone_channels[i]; INT16 *form = voice->form; if (!voice->mute && voice->sample_step) { int cur_pos = voice->sample_cur + voice->sample_step; int prev = form[(voice->sample_cur >> FRAC_BITS) & 15]; int cur = form[(cur_pos >> FRAC_BITS) & 15]; /* interpolate */ data += ((INT32)prev * (FRAC_ONE - (cur_pos & FRAC_MASK)) + (INT32)cur * (cur_pos & FRAC_MASK)) >> FRAC_BITS; voice->sample_cur = cur_pos; } } *buffer++ = data; tone_clock += FRAC_ONE; if (tone_clock >= tone_clock_expire) { for (i = 0; i < CHANNELS; i++) { tone_channels[i].offset++; tone_channels[i].offset &= tone_channels[i].mask; validate_tone_channel(i); } if (tone_channels[0].offset == 0 && Sound0StopOnRollover) tone_channels[0].mute = 1; tone_clock -= tone_clock_expire; } }
void snk6502_sound_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) { stream_sample_t *buffer = outputs[0]; for (int i = 0; i < NUM_CHANNELS; i++) validate_tone_channel(i); while (samples-- > 0) { int32_t data = 0; for (tone_t &voice : m_tone_channels) { int16_t const *const form = voice.form; if (!voice.mute && voice.sample_step) { const int cur_pos = voice.sample_cur + voice.sample_step; const int prev = form[(voice.sample_cur >> FRAC_BITS) & 15]; const int cur = form[(cur_pos >> FRAC_BITS) & 15]; /* interpolate */ data += (int32_t(prev) * (FRAC_ONE - (cur_pos & FRAC_MASK)) + int32_t(cur) * (cur_pos & FRAC_MASK)) >> FRAC_BITS; voice.sample_cur = cur_pos; } } *buffer++ = data; m_tone_clock += FRAC_ONE; if (m_tone_clock >= m_tone_clock_expire) { for (int i = 0; i < NUM_CHANNELS; i++) { m_tone_channels[i].offset++; m_tone_channels[i].offset &= m_tone_channels[i].mask; validate_tone_channel(i); } if (m_tone_channels[0].offset == 0 && m_sound0_stop_on_rollover) m_tone_channels[0].mute = 1; m_tone_clock -= m_tone_clock_expire; } } }