summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/philips/cdicdic.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/philips/cdicdic.cpp')
-rw-r--r--src/mame/philips/cdicdic.cpp49
1 files changed, 24 insertions, 25 deletions
diff --git a/src/mame/philips/cdicdic.cpp b/src/mame/philips/cdicdic.cpp
index 8be63d6a756..a00029f79f2 100644
--- a/src/mame/philips/cdicdic.cpp
+++ b/src/mame/philips/cdicdic.cpp
@@ -41,6 +41,17 @@ TODO:
#define VERBOSE (0)
#include "logmacro.h"
+
+namespace {
+
+[[maybe_unused]] constexpr int16_t clip_int16(int32_t sample)
+{
+ return int16_t(std::clamp<int32_t>(sample, -32768, 32767));
+}
+
+} // anonymous namespace
+
+
// device type definition
DEFINE_DEVICE_TYPE(CDI_CDIC, cdicdic_device, "cdicdic", "CD-i CDIC")
@@ -256,27 +267,15 @@ const uint8_t cdicdic_device::s_sector_scramble[2448] =
// MEMBER FUNCTIONS
//**************************************************************************
-int16_t clip_int16(int32_t sample) {
- if (sample < -32768)
- return -32768;
- else if (sample > 32767)
- return 32767;
- return sample;
-}
-
-inline void rotate_samples(int16_t val, int16_t& a, int16_t& b, int16_t& output) {
- b = a;
- a = val;
- output = a;
-}
-void cdicdic_device::decode_xa_unit(const uint8_t param, int16_t sample, int16_t& sample0, int16_t& sample1, int16_t& out_buffer)
+void cdicdic_device::decode_xa_unit(const uint8_t param, int16_t sample, int16_t &sample0, int16_t &sample1, int16_t &out_buffer)
{
- const int16_t* filter = s_xa_filter_coef[(param >> 4) & 3];
- uint8_t range = (param & 0xf);
- sample = (sample>>range) + ((filter[0] * sample0 + filter[1] * sample1 + 128) >> 8);
+ int16_t const *const filter = s_xa_filter_coef[(param >> 4) & 3];
+ uint8_t const range = (param & 0xf);
+ sample = (sample >> range) + ((filter[0] * sample0 + filter[1] * sample1 + 128) >> 8);
- //int16_t sample16 = clip_int16(sample);
- rotate_samples(sample, sample0, sample1, out_buffer);
+ //int16_t const sample16 = clip_int16(sample);
+ sample1 = std::exchange(sample0, sample);
+ out_buffer = sample0;
}
void cdicdic_device::decode_xa_mono(int16_t *cdic_xa_last, const uint8_t *xa, int16_t *dp)
@@ -310,7 +309,7 @@ void cdicdic_device::decode_xa_mono(int16_t *cdic_xa_last, const uint8_t *xa, in
}
}
-void cdicdic_device::decode_xa_mono8(int16_t *cdic_xa_last, const uint8_t *xa, int16_t*dp)
+void cdicdic_device::decode_xa_mono8(int16_t *cdic_xa_last, const uint8_t *xa, int16_t *dp)
{
for (int32_t b = 0; b < 18; b++)
{
@@ -383,10 +382,10 @@ void cdicdic_device::decode_xa_stereo8(int16_t *cdic_xa_last, const uint8_t *xa,
void cdicdic_device::decode_8bit_xa_unit(int channel, uint8_t param, const uint8_t *data, int16_t *out_buffer)
{
- int16_t* old_samples = &m_xa_last[channel << 1];
+ int16_t *const old_samples = &m_xa_last[channel << 1];
for (int i = 0; i < 28; i++)
{
- int16_t sample = (*data)<<8;
+ int16_t sample = int16_t(uint16_t(*data) << 8);
decode_xa_unit(param, sample, old_samples[0], old_samples[1], out_buffer[i]);
data += 4;
}
@@ -394,10 +393,10 @@ void cdicdic_device::decode_8bit_xa_unit(int channel, uint8_t param, const uint8
void cdicdic_device::decode_4bit_xa_unit(int channel, uint8_t param, const uint8_t *data, uint8_t shift, int16_t *out_buffer)
{
- int16_t* old_samples = &m_xa_last[channel << 1];
+ int16_t *const old_samples = &m_xa_last[channel << 1];
for (int i = 0; i < 28; i++)
{
- int16_t sample = ((*data >> shift) & 0xf)<<12;
+ int16_t sample = int16_t(uint16_t((*data >> shift) & 0xf) << 12);
decode_xa_unit(param, sample, old_samples[0], old_samples[1], out_buffer[i]);
data += 4;
}
@@ -408,7 +407,7 @@ void cdicdic_device::play_raw_group(const uint8_t *data)
int16_t samples[28];
for (int i = 0; i < 28; i++)
{
- samples[i] = (int16_t)((data[1] << 8) | data[0]);
+ samples[i] = int16_t((uint16_t(data[1]) << 8) | data[0]);
data += 4;
}