diff options
Diffstat (limited to 'src/emu/sound.cpp')
-rw-r--r-- | src/emu/sound.cpp | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/src/emu/sound.cpp b/src/emu/sound.cpp index d2c968ca370..a00546f7af3 100644 --- a/src/emu/sound.cpp +++ b/src/emu/sound.cpp @@ -208,7 +208,7 @@ void stream_buffer::flush_wav() // convert and fill for (int sampindex = 0; sampindex < cursamples; sampindex++) - buffer[sampindex] = s16(view.get_indexed(samplebase + sampindex) * 32768.0); + buffer[sampindex] = s16(view.get(samplebase + sampindex) * 32768.0); // write to the WAV wav_add_data_16(m_wav_file, buffer, cursamples); @@ -743,7 +743,7 @@ read_stream_view sound_stream::update_view(attotime start, attotime end, u32 out #if (SOUND_DEBUG) // clear each output view to NANs before we call the callback for (unsigned int outindex = 0; outindex < m_output.size(); outindex++) - m_output_view[outindex].fill_indexed(0, NAN); + m_output_view[outindex].fill(NAN); #endif // if we have an extended callback, that's all we need @@ -753,7 +753,7 @@ read_stream_view sound_stream::update_view(attotime start, attotime end, u32 out // make sure everything was overwritten for (unsigned int outindex = 0; outindex < m_output.size(); outindex++) for (int sampindex = 0; sampindex < m_output_view[outindex].samples(); sampindex++) - m_output_view[outindex].get_indexed(sampindex); + m_output_view[outindex].get(sampindex); for (unsigned int outindex = 0; outindex < m_output.size(); outindex++) m_output[outindex].m_buffer.flush_wav(); @@ -934,7 +934,7 @@ void sound_stream::stream_update_legacy(sound_stream &stream, std::vector<read_s { stream_sample_t *dest = inputptr[inputnum]; for (int index = 0; index < cursamples; index++) - dest[index] = stream_sample_t(inputs[inputnum].get_indexed(baseindex + index) * stream_buffer::sample_t(32768.0)); + dest[index] = stream_sample_t(inputs[inputnum].get(baseindex + index) * stream_buffer::sample_t(32768.0)); } // run the callback @@ -945,7 +945,7 @@ void sound_stream::stream_update_legacy(sound_stream &stream, std::vector<read_s { stream_sample_t *src = outputptr[outputnum]; for (int index = 0; index < cursamples; index++) - outputs[outputnum].put_indexed(baseindex + index, stream_buffer::sample_t(src[index]) * stream_buffer::sample_t(1.0 / 32768.0)); + outputs[outputnum].put(baseindex + index, stream_buffer::sample_t(src[index]) * stream_buffer::sample_t(1.0 / 32768.0)); } } } @@ -1012,6 +1012,7 @@ void default_resampler_stream::resampler_sound_update(sound_stream &stream, std: } // if we have equal sample rates, we just need to copy + auto numsamples = output.samples(); if (input.sample_rate() == output.sample_rate()) { output.copy(input); @@ -1033,13 +1034,14 @@ void default_resampler_stream::resampler_sound_update(sound_stream &stream, std: attotime latency = latency_samples * input.sample_period(); // clamp the latency to the start (only relevant at the beginning) + s32 dstindex = 0; attotime output_start = output.start_time(); - while (latency > output_start && !output.done()) + while (latency > output_start && dstindex < numsamples) { - output.put(0); + output.put(dstindex++, 0); output_start += output.sample_period(); } - if (output.done()) + if (dstindex >= numsamples) return; // create a rebased input buffer around the adjusted start time @@ -1053,14 +1055,15 @@ void default_resampler_stream::resampler_sound_update(sound_stream &stream, std: sound_assert(srcpos <= 1.0f); // input is undersampled: point sample except where our sample period covers a boundary + s32 srcindex = 0; if (step < 1.0) { - stream_buffer::sample_t cursample = rebased.get(); - while (!output.done()) + stream_buffer::sample_t cursample = rebased.get(srcindex++); + for ( ; dstindex < numsamples; dstindex++) { // if still within the current sample, just replicate if (srcpos <= 1.0) - output.put(cursample); + output.put(dstindex, cursample); // if crossing a sample boundary, blend with the neighbor else @@ -1068,18 +1071,19 @@ void default_resampler_stream::resampler_sound_update(sound_stream &stream, std: srcpos -= 1.0; sound_assert(srcpos <= step + 1e-5); stream_buffer::sample_t prevsample = cursample; - cursample = rebased.get(); - output.put(stepinv * (prevsample * (step - srcpos) + srcpos * cursample)); + cursample = rebased.get(srcindex++); + output.put(dstindex, stepinv * (prevsample * (step - srcpos) + srcpos * cursample)); } srcpos += step; } + sound_assert(srcindex <= rebased.samples()); } // input is oversampled: sum the energy else { - float cursample = rebased.get(); - while (!output.done()) + float cursample = rebased.get(srcindex++); + for ( ; dstindex < numsamples; dstindex++) { // compute the partial first sample and advance stream_buffer::sample_t scale = 1.0 - srcpos; @@ -1089,17 +1093,18 @@ void default_resampler_stream::resampler_sound_update(sound_stream &stream, std: stream_buffer::sample_t remaining = step - scale; while (remaining >= 1.0) { - sample += rebased.get(); + sample += rebased.get(srcindex++); remaining -= 1.0; } // add in the final partial sample - cursample = rebased.get(); + cursample = rebased.get(srcindex++); sample += cursample * remaining; - output.put(sample * stepinv); + output.put(dstindex, sample * stepinv); // our position is now the remainder srcpos = remaining; + sound_assert(srcindex <= rebased.samples()); } } } |