pcm/{Traits,Dsd*}: use std::byte
This commit is contained in:
+2
-3
@@ -100,10 +100,9 @@ PcmConvert::Convert(std::span<const std::byte> buffer)
|
||||
{
|
||||
#ifdef ENABLE_DSD
|
||||
if (src_format.format == SampleFormat::DSD) {
|
||||
auto s = FromBytesStrict<const uint8_t>(buffer);
|
||||
auto d = dsd2pcm_float
|
||||
? std::as_bytes(dsd.ToFloat(src_format.channels, s))
|
||||
: std::as_bytes(dsd.ToS24(src_format.channels, s));
|
||||
? std::as_bytes(dsd.ToFloat(src_format.channels, buffer))
|
||||
: std::as_bytes(dsd.ToS24(src_format.channels, buffer));
|
||||
if (d.data() == nullptr)
|
||||
throw std::runtime_error("DSD to PCM conversion failed");
|
||||
|
||||
|
||||
+6
-6
@@ -8,15 +8,15 @@
|
||||
#include <functional>
|
||||
|
||||
static constexpr uint32_t
|
||||
pcm_two_dsd_to_dop_marker1(uint8_t a, uint8_t b) noexcept
|
||||
pcm_two_dsd_to_dop_marker1(std::byte a, std::byte b) noexcept
|
||||
{
|
||||
return 0xff050000 | (a << 8) | b;
|
||||
return 0xff050000 | (static_cast<uint32_t>(a) << 8) | static_cast<uint32_t>(b);
|
||||
}
|
||||
|
||||
static constexpr uint32_t
|
||||
pcm_two_dsd_to_dop_marker2(uint8_t a, uint8_t b) noexcept
|
||||
pcm_two_dsd_to_dop_marker2(std::byte a, std::byte b) noexcept
|
||||
{
|
||||
return 0xfffa0000 | (a << 8) | b;
|
||||
return 0xfffa0000 | (static_cast<uint32_t>(a) << 8) | static_cast<uint32_t>(b);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -25,7 +25,7 @@ pcm_two_dsd_to_dop_marker2(uint8_t a, uint8_t b) noexcept
|
||||
* in the destination buffer, one for each marker
|
||||
*/
|
||||
static void
|
||||
DsdToDop(uint32_t *dest, const uint8_t *src,
|
||||
DsdToDop(uint32_t *dest, const std::byte *src,
|
||||
size_t num_dop_quads, unsigned channels) noexcept
|
||||
{
|
||||
for (size_t i = num_dop_quads; i > 0; --i) {
|
||||
@@ -72,7 +72,7 @@ DsdToDopConverter::Open(unsigned _channels) noexcept
|
||||
}
|
||||
|
||||
std::span<const uint32_t>
|
||||
DsdToDopConverter::Convert(std::span<const uint8_t> src) noexcept
|
||||
DsdToDopConverter::Convert(std::span<const std::byte> src) noexcept
|
||||
{
|
||||
return rest_buffer.Process<uint32_t>(buffer, src, 2 * channels,
|
||||
[this](auto && arg1, auto && arg2, auto && arg3) { return DsdToDop(arg1, arg2, arg3, channels); });
|
||||
|
||||
+3
-6
@@ -1,8 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
// Copyright The Music Player Daemon Project
|
||||
|
||||
#ifndef MPD_PCM_DOP_HXX
|
||||
#define MPD_PCM_DOP_HXX
|
||||
#pragma once
|
||||
|
||||
#include "Buffer.hxx"
|
||||
#include "RestBuffer.hxx"
|
||||
@@ -20,7 +19,7 @@ class DsdToDopConverter {
|
||||
|
||||
PcmBuffer buffer;
|
||||
|
||||
PcmRestBuffer<uint8_t, 4> rest_buffer;
|
||||
PcmRestBuffer<std::byte, 4> rest_buffer;
|
||||
|
||||
public:
|
||||
void Open(unsigned _channels) noexcept;
|
||||
@@ -43,7 +42,5 @@ public:
|
||||
return 2 * GetInputBlockSize();
|
||||
}
|
||||
|
||||
std::span<const uint32_t> Convert(std::span<const uint8_t> src) noexcept;
|
||||
std::span<const uint32_t> Convert(std::span<const std::byte> src) noexcept;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
+4
-4
@@ -7,7 +7,7 @@
|
||||
* Construct a 16 bit integer from two bytes.
|
||||
*/
|
||||
static constexpr uint16_t
|
||||
Construct16(uint8_t a, uint8_t b) noexcept
|
||||
Construct16(std::byte a, std::byte b) noexcept
|
||||
{
|
||||
/* "a" is the oldest byte, which must be in the most
|
||||
significant byte */
|
||||
@@ -16,13 +16,13 @@ Construct16(uint8_t a, uint8_t b) noexcept
|
||||
}
|
||||
|
||||
static constexpr uint16_t
|
||||
Dsd8To16Sample(const uint8_t *src, unsigned channels) noexcept
|
||||
Dsd8To16Sample(const std::byte *src, unsigned channels) noexcept
|
||||
{
|
||||
return Construct16(src[0], src[channels]);
|
||||
}
|
||||
|
||||
static void
|
||||
Dsd8To16(uint16_t *dest, const uint8_t *src,
|
||||
Dsd8To16(uint16_t *dest, const std::byte *src,
|
||||
size_t out_frames, unsigned channels) noexcept
|
||||
{
|
||||
for (size_t i = 0; i < out_frames; ++i) {
|
||||
@@ -42,7 +42,7 @@ Dsd16Converter::Open(unsigned _channels) noexcept
|
||||
}
|
||||
|
||||
std::span<const uint16_t>
|
||||
Dsd16Converter::Convert(std::span<const uint8_t> src) noexcept
|
||||
Dsd16Converter::Convert(std::span<const std::byte> src) noexcept
|
||||
{
|
||||
return rest_buffer.Process<uint16_t>(buffer, src, channels,
|
||||
[this](auto && arg1, auto && arg2, auto && arg3) { return Dsd8To16(arg1, arg2, arg3, channels); });
|
||||
|
||||
+3
-6
@@ -1,8 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
// Copyright The Music Player Daemon Project
|
||||
|
||||
#ifndef MPD_PCM_DSD_16_HXX
|
||||
#define MPD_PCM_DSD_16_HXX
|
||||
#pragma once
|
||||
|
||||
#include "Buffer.hxx"
|
||||
#include "RestBuffer.hxx"
|
||||
@@ -18,7 +17,7 @@ class Dsd16Converter {
|
||||
|
||||
PcmBuffer buffer;
|
||||
|
||||
PcmRestBuffer<uint8_t, 2> rest_buffer;
|
||||
PcmRestBuffer<std::byte, 2> rest_buffer;
|
||||
|
||||
public:
|
||||
void Open(unsigned _channels) noexcept;
|
||||
@@ -41,7 +40,5 @@ public:
|
||||
return GetInputBlockSize();
|
||||
}
|
||||
|
||||
std::span<const uint16_t> Convert(std::span<const uint8_t> src) noexcept;
|
||||
std::span<const uint16_t> Convert(std::span<const std::byte> src) noexcept;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
+21
-19
@@ -178,11 +178,11 @@ Dsd2Pcm::Reset() noexcept
|
||||
}
|
||||
|
||||
inline void
|
||||
Dsd2Pcm::ApplySample(size_t ffp, uint8_t src) noexcept
|
||||
Dsd2Pcm::ApplySample(size_t ffp, std::byte src) noexcept
|
||||
{
|
||||
fifo[ffp] = src;
|
||||
uint8_t *p = fifo.data() + ((ffp-CTABLES) & FIFOMASK);
|
||||
*p = bit_reverse(*p);
|
||||
std::byte *p = fifo.data() + ((ffp-CTABLES) & FIFOMASK);
|
||||
*p = BitReverse(*p);
|
||||
}
|
||||
|
||||
inline float
|
||||
@@ -190,15 +190,16 @@ Dsd2Pcm::CalcOutputSample(size_t ffp) const noexcept
|
||||
{
|
||||
double acc = 0;
|
||||
for (size_t i = 0; i < CTABLES; ++i) {
|
||||
uint8_t bite1 = fifo[(ffp -i) & FIFOMASK];
|
||||
uint8_t bite2 = fifo[(ffp-(CTABLES*2-1)+i) & FIFOMASK];
|
||||
acc += double(ctables[i][bite1] + ctables[i][bite2]);
|
||||
std::byte bite1 = fifo[(ffp -i) & FIFOMASK];
|
||||
std::byte bite2 = fifo[(ffp-(CTABLES*2-1)+i) & FIFOMASK];
|
||||
acc += double(ctables[i][static_cast<std::size_t>(bite1)]
|
||||
+ ctables[i][static_cast<std::size_t>(bite2)]);
|
||||
}
|
||||
return float(acc);
|
||||
}
|
||||
|
||||
inline float
|
||||
Dsd2Pcm::TranslateSample(size_t ffp, uint8_t src) noexcept
|
||||
Dsd2Pcm::TranslateSample(size_t ffp, std::byte src) noexcept
|
||||
{
|
||||
ApplySample(ffp, src);
|
||||
return CalcOutputSample(ffp);
|
||||
@@ -209,15 +210,16 @@ Dsd2Pcm::CalcOutputSampleS24(size_t ffp) const noexcept
|
||||
{
|
||||
int32_t acc = 0;
|
||||
for (size_t i = 0; i < CTABLES; ++i) {
|
||||
uint8_t bite1 = fifo[(ffp -i) & FIFOMASK];
|
||||
uint8_t bite2 = fifo[(ffp-(CTABLES*2-1)+i) & FIFOMASK];
|
||||
acc += ctables_s24[i][bite1] + ctables_s24[i][bite2];
|
||||
std::byte bite1 = fifo[(ffp -i) & FIFOMASK];
|
||||
std::byte bite2 = fifo[(ffp-(CTABLES*2-1)+i) & FIFOMASK];
|
||||
acc += ctables_s24[i][static_cast<std::size_t>(bite1)]
|
||||
+ ctables_s24[i][static_cast<std::size_t>(bite2)];
|
||||
}
|
||||
return acc;
|
||||
}
|
||||
|
||||
inline int32_t
|
||||
Dsd2Pcm::TranslateSampleS24(size_t ffp, uint8_t src) noexcept
|
||||
Dsd2Pcm::TranslateSampleS24(size_t ffp, std::byte src) noexcept
|
||||
{
|
||||
ApplySample(ffp, src);
|
||||
return CalcOutputSampleS24(ffp);
|
||||
@@ -225,12 +227,12 @@ Dsd2Pcm::TranslateSampleS24(size_t ffp, uint8_t src) noexcept
|
||||
|
||||
void
|
||||
Dsd2Pcm::Translate(size_t samples,
|
||||
const uint8_t *gcc_restrict src, ptrdiff_t src_stride,
|
||||
const std::byte *gcc_restrict src, ptrdiff_t src_stride,
|
||||
float *dst, ptrdiff_t dst_stride) noexcept
|
||||
{
|
||||
size_t ffp = fifopos;
|
||||
while (samples-- > 0) {
|
||||
uint8_t bite1 = *src;
|
||||
std::byte bite1 = *src;
|
||||
src += src_stride;
|
||||
*dst = TranslateSample(ffp, bite1);
|
||||
dst += dst_stride;
|
||||
@@ -241,12 +243,12 @@ Dsd2Pcm::Translate(size_t samples,
|
||||
|
||||
void
|
||||
Dsd2Pcm::TranslateS24(size_t samples,
|
||||
const uint8_t *gcc_restrict src, ptrdiff_t src_stride,
|
||||
const std::byte *gcc_restrict src, ptrdiff_t src_stride,
|
||||
int32_t *dst, ptrdiff_t dst_stride) noexcept
|
||||
{
|
||||
size_t ffp = fifopos;
|
||||
while (samples-- > 0) {
|
||||
uint8_t bite1 = *src;
|
||||
std::byte bite1 = *src;
|
||||
src += src_stride;
|
||||
*dst = TranslateSampleS24(ffp, bite1);
|
||||
dst += dst_stride;
|
||||
@@ -257,7 +259,7 @@ Dsd2Pcm::TranslateS24(size_t samples,
|
||||
|
||||
void
|
||||
MultiDsd2Pcm::Translate(unsigned channels, size_t n_frames,
|
||||
const uint8_t *src, float *dest) noexcept
|
||||
const std::byte *src, float *dest) noexcept
|
||||
{
|
||||
assert(channels <= per_channel.max_size());
|
||||
|
||||
@@ -275,7 +277,7 @@ MultiDsd2Pcm::Translate(unsigned channels, size_t n_frames,
|
||||
|
||||
inline void
|
||||
MultiDsd2Pcm::TranslateStereo(size_t n_frames,
|
||||
const uint8_t *src, float *dest) noexcept
|
||||
const std::byte *src, float *dest) noexcept
|
||||
{
|
||||
size_t ffp = fifopos;
|
||||
while (n_frames-- > 0) {
|
||||
@@ -288,7 +290,7 @@ MultiDsd2Pcm::TranslateStereo(size_t n_frames,
|
||||
|
||||
void
|
||||
MultiDsd2Pcm::TranslateS24(unsigned channels, size_t n_frames,
|
||||
const uint8_t *src, int32_t *dest) noexcept
|
||||
const std::byte *src, int32_t *dest) noexcept
|
||||
{
|
||||
assert(channels <= per_channel.max_size());
|
||||
|
||||
@@ -306,7 +308,7 @@ MultiDsd2Pcm::TranslateS24(unsigned channels, size_t n_frames,
|
||||
|
||||
inline void
|
||||
MultiDsd2Pcm::TranslateStereoS24(size_t n_frames,
|
||||
const uint8_t *src, int32_t *dest) noexcept
|
||||
const std::byte *src, int32_t *dest) noexcept
|
||||
{
|
||||
size_t ffp = fifopos;
|
||||
while (n_frames-- > 0) {
|
||||
|
||||
+10
-10
@@ -51,7 +51,7 @@ private:
|
||||
/** bit mask for FIFO offsets */
|
||||
static constexpr size_t FIFOMASK = FIFOSIZE - 1;
|
||||
|
||||
std::array<uint8_t, FIFOSIZE> fifo;
|
||||
std::array<std::byte, FIFOSIZE> fifo;
|
||||
size_t fifopos;
|
||||
|
||||
public:
|
||||
@@ -75,20 +75,20 @@ public:
|
||||
* @param dst_stride -- dst pointer increment
|
||||
*/
|
||||
void Translate(size_t samples,
|
||||
const uint8_t *src, ptrdiff_t src_stride,
|
||||
const std::byte *src, ptrdiff_t src_stride,
|
||||
float *dst, ptrdiff_t dst_stride) noexcept;
|
||||
|
||||
void TranslateS24(size_t samples,
|
||||
const uint8_t *src, ptrdiff_t src_stride,
|
||||
const std::byte *src, ptrdiff_t src_stride,
|
||||
int32_t *dst, ptrdiff_t dst_stride) noexcept;
|
||||
|
||||
private:
|
||||
void ApplySample(size_t ffp, uint8_t src) noexcept;
|
||||
void ApplySample(size_t ffp, std::byte src) noexcept;
|
||||
float CalcOutputSample(size_t ffp) const noexcept;
|
||||
float TranslateSample(size_t ffp, uint8_t src) noexcept;
|
||||
float TranslateSample(size_t ffp, std::byte src) noexcept;
|
||||
|
||||
int32_t CalcOutputSampleS24(size_t ffp) const noexcept;
|
||||
int32_t TranslateSampleS24(size_t ffp, uint8_t src) noexcept;
|
||||
int32_t TranslateSampleS24(size_t ffp, std::byte src) noexcept;
|
||||
};
|
||||
|
||||
class MultiDsd2Pcm {
|
||||
@@ -104,20 +104,20 @@ public:
|
||||
}
|
||||
|
||||
void Translate(unsigned channels, size_t n_frames,
|
||||
const uint8_t *src, float *dest) noexcept;
|
||||
const std::byte *src, float *dest) noexcept;
|
||||
|
||||
void TranslateS24(unsigned channels, size_t n_frames,
|
||||
const uint8_t *src, int32_t *dest) noexcept;
|
||||
const std::byte *src, int32_t *dest) noexcept;
|
||||
|
||||
private:
|
||||
/**
|
||||
* Optimized implementation for the common case.
|
||||
*/
|
||||
void TranslateStereo(size_t n_frames,
|
||||
const uint8_t *src, float *dest) noexcept;
|
||||
const std::byte *src, float *dest) noexcept;
|
||||
|
||||
void TranslateStereoS24(size_t n_frames,
|
||||
const uint8_t *src, int32_t *dest) noexcept;
|
||||
const std::byte *src, int32_t *dest) noexcept;
|
||||
};
|
||||
|
||||
#endif /* include guard DSD2PCM_H_INCLUDED */
|
||||
|
||||
+4
-4
@@ -7,7 +7,7 @@
|
||||
* Construct a 32 bit integer from four bytes.
|
||||
*/
|
||||
static constexpr uint32_t
|
||||
Construct32(uint8_t a, uint8_t b, uint8_t c, uint8_t d) noexcept
|
||||
Construct32(std::byte a, std::byte b, std::byte c, std::byte d) noexcept
|
||||
{
|
||||
/* "a" is the oldest byte, which must be in the most
|
||||
significant byte */
|
||||
@@ -17,14 +17,14 @@ Construct32(uint8_t a, uint8_t b, uint8_t c, uint8_t d) noexcept
|
||||
}
|
||||
|
||||
static constexpr uint32_t
|
||||
Dsd8To32Sample(const uint8_t *src, unsigned channels) noexcept
|
||||
Dsd8To32Sample(const std::byte *src, unsigned channels) noexcept
|
||||
{
|
||||
return Construct32(src[0], src[channels],
|
||||
src[2 * channels], src[3 * channels]);
|
||||
}
|
||||
|
||||
static void
|
||||
Dsd8To32(uint32_t *dest, const uint8_t *src,
|
||||
Dsd8To32(uint32_t *dest, const std::byte *src,
|
||||
size_t out_frames, unsigned channels) noexcept
|
||||
{
|
||||
for (size_t i = 0; i < out_frames; ++i) {
|
||||
@@ -44,7 +44,7 @@ Dsd32Converter::Open(unsigned _channels) noexcept
|
||||
}
|
||||
|
||||
std::span<const uint32_t>
|
||||
Dsd32Converter::Convert(std::span<const uint8_t> src) noexcept
|
||||
Dsd32Converter::Convert(std::span<const std::byte> src) noexcept
|
||||
{
|
||||
return rest_buffer.Process<uint32_t>(buffer, src, channels,
|
||||
[this](auto && arg1, auto && arg2, auto && arg3) { return Dsd8To32(arg1, arg2, arg3, channels); });
|
||||
|
||||
+3
-6
@@ -1,8 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
// Copyright The Music Player Daemon Project
|
||||
|
||||
#ifndef MPD_PCM_DSD_32_HXX
|
||||
#define MPD_PCM_DSD_32_HXX
|
||||
#pragma once
|
||||
|
||||
#include "Buffer.hxx"
|
||||
#include "RestBuffer.hxx"
|
||||
@@ -18,7 +17,7 @@ class Dsd32Converter {
|
||||
|
||||
PcmBuffer buffer;
|
||||
|
||||
PcmRestBuffer<uint8_t, 4> rest_buffer;
|
||||
PcmRestBuffer<std::byte, 4> rest_buffer;
|
||||
|
||||
public:
|
||||
void Open(unsigned _channels) noexcept;
|
||||
@@ -41,7 +40,5 @@ public:
|
||||
return GetInputBlockSize();
|
||||
}
|
||||
|
||||
std::span<const uint32_t> Convert(std::span<const uint8_t> src) noexcept;
|
||||
std::span<const uint32_t> Convert(std::span<const std::byte> src) noexcept;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
+3
-3
@@ -258,15 +258,15 @@ PcmExport::Export(std::span<const std::byte> data) noexcept
|
||||
break;
|
||||
|
||||
case DsdMode::U16:
|
||||
data = std::as_bytes(dsd16_converter.Convert(FromBytesStrict<const uint8_t>(data)));
|
||||
data = std::as_bytes(dsd16_converter.Convert(data));
|
||||
break;
|
||||
|
||||
case DsdMode::U32:
|
||||
data = std::as_bytes(dsd32_converter.Convert(FromBytesStrict<const uint8_t>(data)));
|
||||
data = std::as_bytes(dsd32_converter.Convert(data));
|
||||
break;
|
||||
|
||||
case DsdMode::DOP:
|
||||
data = std::as_bytes(dop_converter.Convert(FromBytesStrict<const uint8_t>(data)));
|
||||
data = std::as_bytes(dop_converter.Convert(data));
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
+2
-2
@@ -7,7 +7,7 @@
|
||||
#include <cassert>
|
||||
|
||||
std::span<const float>
|
||||
PcmDsd::ToFloat(unsigned channels, std::span<const uint8_t> src) noexcept
|
||||
PcmDsd::ToFloat(unsigned channels, std::span<const std::byte> src) noexcept
|
||||
{
|
||||
assert(!src.empty());
|
||||
assert(src.size() % channels == 0);
|
||||
@@ -22,7 +22,7 @@ PcmDsd::ToFloat(unsigned channels, std::span<const uint8_t> src) noexcept
|
||||
}
|
||||
|
||||
std::span<const int32_t>
|
||||
PcmDsd::ToS24(unsigned channels, std::span<const uint8_t> src) noexcept
|
||||
PcmDsd::ToS24(unsigned channels, std::span<const std::byte> src) noexcept
|
||||
{
|
||||
assert(!src.empty());
|
||||
assert(src.size() % channels == 0);
|
||||
|
||||
+3
-6
@@ -1,8 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
// Copyright The Music Player Daemon Project
|
||||
|
||||
#ifndef MPD_PCM_DSD_HXX
|
||||
#define MPD_PCM_DSD_HXX
|
||||
#pragma once
|
||||
|
||||
#include "Buffer.hxx"
|
||||
#include "Dsd2Pcm.hxx"
|
||||
@@ -24,10 +23,8 @@ public:
|
||||
}
|
||||
|
||||
std::span<const float> ToFloat(unsigned channels,
|
||||
std::span<const uint8_t> src) noexcept;
|
||||
std::span<const std::byte> src) noexcept;
|
||||
|
||||
std::span<const int32_t> ToS24(unsigned channels,
|
||||
std::span<const uint8_t> src) noexcept;
|
||||
std::span<const std::byte> src) noexcept;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
+2
-2
@@ -143,7 +143,7 @@ struct SampleTraits<SampleFormat::FLOAT> {
|
||||
|
||||
template<>
|
||||
struct SampleTraits<SampleFormat::DSD> {
|
||||
typedef uint8_t value_type;
|
||||
typedef std::byte value_type;
|
||||
typedef value_type *pointer;
|
||||
typedef const value_type *const_pointer;
|
||||
|
||||
@@ -154,5 +154,5 @@ struct SampleTraits<SampleFormat::DSD> {
|
||||
* and a high energy 1.0584 MHz tone which should be filtered
|
||||
* out completely by any playback system --> silence
|
||||
*/
|
||||
static constexpr value_type SILENCE = 0x69;
|
||||
static constexpr value_type SILENCE{0x69};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user