diff options
author | 2020-09-13 10:18:44 -0700 | |
---|---|---|
committer | 2020-09-13 10:18:44 -0700 | |
commit | c1bd56f0d318c71faac757d89c910c2682af6651 (patch) | |
tree | 9f4bbe78f74401a13603d89b6314c67fbd68a3f5 /src/devices/sound/ym2151.cpp | |
parent | a3572727bd862176aa7458a84e2e9664c9d3f918 (diff) |
Significant internal changes to sound streams (#7169)
Significant internal changes to sound streams:
Abstracted buffers of sound data into an internal stream_buffer class, with helper classes read_stream_view and write_stream_view which offer readable/writable "views" into the buffers
Internal sound calculations are all done using stream_buffer::sample_t, which is a 32-bit float; existing callbacks are supported through an adapter that converts to/from signed 32-bit integers
Improved behavior of dynamic stream sample rate changes to resample a short runway of data to preserve continuity across transitions
Created a new stream update callback which passes a std::vector of read_stream_views for inputs, and a std::vector of write_stream_views for outputs
Updated core mixer and speaker devices to the new stream update callback
Updated the following sound cores to the new stream update callback: ay8910, dac, k054539, msm5205, namco, netlist, okim6295, pokey, samples, sn76496, sp0250, tms5220, tms57002, upd7759, vgm_visualizer, volt_reg
Changed existing stream update callback to make inputs explicitly const and the output pointers const as well, since they are re-used across calls; fixed several engines that violated this rule
Sound_manager::stream_alloc can no longer automatically connect to a device's sound_stream_update callback; instead, the stream_alloc() on the sound_device_interface should be called; updated many violators of this rule
Streams can be created with SAMPLE_RATE_OUTPUT_ADAPTIVE, which dynamically tracks the sample rate of its first downstream output, or with SAMPLE_RATE_INPUT_ADAPTIVE, which tracks the sample rate of its first input
Changed resampling to be a separate sound_stream that is invoked as needed, opening the path for selectable resampling implementations
Added a flags parameter to the new stream allocation method that allows you to specify a that input streams should not be resampled
Exposed stream_input and stream_output classes directly, simplifying access to user gains and stream names
Added a simple dynamic compressor to sound_manager to provide nicer results when overdriven sound happens; compression does not affect speaker_report results
Improved verbose speaker_report to print a graph of peaks over time
More aggressive debugging enabled for now even in release builds (should be disabled prior to next release) via SOUND_DEBUG define in sound.h; report any assertions for fixing
Diffstat (limited to 'src/devices/sound/ym2151.cpp')
-rw-r--r-- | src/devices/sound/ym2151.cpp | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/devices/sound/ym2151.cpp b/src/devices/sound/ym2151.cpp index 744fec923ad..b519d9a1224 100644 --- a/src/devices/sound/ym2151.cpp +++ b/src/devices/sound/ym2151.cpp @@ -1836,16 +1836,17 @@ WRITE_LINE_MEMBER(ym2151_device::reset_w) // sound_stream_update - handle a stream update //------------------------------------------------- -void ym2151_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) +void ym2151_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) { if (m_reset_active) { - std::fill(&outputs[0][0], &outputs[0][samples], 0); - std::fill(&outputs[1][0], &outputs[1][samples], 0); + outputs[0].fill(0); + outputs[1].fill(0); return; } - for (int i=0; i<samples; i++) + constexpr stream_buffer::sample_t sample_scale = 1.0 / 32768.0; + for (int sampindex=0; sampindex<outputs[0].samples(); sampindex++) { advance_eg(); @@ -1871,8 +1872,8 @@ void ym2151_device::sound_stream_update(sound_stream &stream, stream_sample_t ** outr = 32767; else if (outr < -32768) outr = -32768; - outputs[0][i] = outl; - outputs[1][i] = outr; + outputs[0].put(sampindex, stream_buffer::sample_t(outl) * sample_scale); + outputs[1].put(sampindex, stream_buffer::sample_t(outr) * sample_scale); advance(); } |