diff options
Diffstat (limited to 'src/devices/sound/samples.cpp')
-rw-r--r-- | src/devices/sound/samples.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/devices/sound/samples.cpp b/src/devices/sound/samples.cpp index 40ff619cdce..21617148669 100644 --- a/src/devices/sound/samples.cpp +++ b/src/devices/sound/samples.cpp @@ -119,6 +119,27 @@ void samples_device::start_raw(uint8_t channel, const int16_t *sampledata, uint3 chan.loop = loop; } +void samples_device::update_raw(uint8_t channel, const int16_t *sampledata, uint32_t samples, uint32_t frequency, bool loop) +{ + assert(channel < m_channels); + + // update the parameters + channel_t &chan = m_channel[channel]; + bool is_update = chan.source != nullptr; + + chan.source = sampledata; + chan.source_length = samples; + chan.basefreq = frequency; + chan.step = (int64_t(chan.basefreq) << FRAC_BITS) / machine().sample_rate(); + chan.loop = loop; + + if (!is_update) { + chan.source_num = -1; + chan.pos = 0; + chan.frac = 0; + } +} + //------------------------------------------------- // set_frequency - set the playback frequency of @@ -321,8 +342,13 @@ void samples_device::device_post_load() void samples_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) { + if (!m_samples_update_cb.isnull()) { + m_samples_update_cb(); + } + // find the channel with this stream for (int channel = 0; channel < m_channels; channel++) + { if (&stream == m_channel[channel].stream) { channel_t &chan = m_channel[channel]; @@ -355,7 +381,9 @@ void samples_device::sound_stream_update(sound_stream &stream, stream_sample_t * if (pos >= sample_length) { if (chan.loop) + { pos %= sample_length; + } else { chan.source = nullptr; @@ -375,6 +403,7 @@ void samples_device::sound_stream_update(sound_stream &stream, stream_sample_t * memset(buffer, 0, samples * sizeof(*buffer)); break; } + } } @@ -638,3 +667,16 @@ bool samples_device::load_samples() } return ok; } + +uint32_t samples_device::get_position(uint8_t channel) +{ + assert(channel < m_channels); + + channel_t &chan = m_channel[channel]; + + if (chan.source == nullptr) { + return 0; + } + + return chan.pos; +} |