diff --git a/src/pcm/Dop.hxx b/src/pcm/Dop.hxx index c6b6d2947..92fa0ae72 100644 --- a/src/pcm/Dop.hxx +++ b/src/pcm/Dop.hxx @@ -46,6 +46,20 @@ public: rest_buffer.Reset(); } + /** + * @return the size of one input block in bytes + */ + size_t GetInputBlockSize() const noexcept { + return rest_buffer.GetInputBlockSize(); + } + + /** + * @return the size of one output block in bytes + */ + size_t GetOutputBlockSize() const noexcept { + return 2 * GetInputBlockSize(); + } + ConstBuffer Convert(ConstBuffer src) noexcept; }; diff --git a/src/pcm/Dsd16.hxx b/src/pcm/Dsd16.hxx index 18b31b83a..6e00f4039 100644 --- a/src/pcm/Dsd16.hxx +++ b/src/pcm/Dsd16.hxx @@ -44,6 +44,20 @@ public: rest_buffer.Reset(); } + /** + * @return the size of one input block in bytes + */ + size_t GetInputBlockSize() const noexcept { + return rest_buffer.GetInputBlockSize(); + } + + /** + * @return the size of one output block in bytes + */ + size_t GetOutputBlockSize() const noexcept { + return GetInputBlockSize(); + } + ConstBuffer Convert(ConstBuffer src) noexcept; }; diff --git a/src/pcm/Dsd32.hxx b/src/pcm/Dsd32.hxx index f6036c527..6a9afb5d4 100644 --- a/src/pcm/Dsd32.hxx +++ b/src/pcm/Dsd32.hxx @@ -44,6 +44,20 @@ public: rest_buffer.Reset(); } + /** + * @return the size of one input block in bytes + */ + size_t GetInputBlockSize() const noexcept { + return rest_buffer.GetInputBlockSize(); + } + + /** + * @return the size of one output block in bytes + */ + size_t GetOutputBlockSize() const noexcept { + return GetInputBlockSize(); + } + ConstBuffer Convert(ConstBuffer src) noexcept; }; diff --git a/src/pcm/Export.cxx b/src/pcm/Export.cxx index f70fe8064..ad087d0d8 100644 --- a/src/pcm/Export.cxx +++ b/src/pcm/Export.cxx @@ -144,6 +144,52 @@ PcmExport::GetOutputFrameSize() const noexcept return GetInputFrameSize(); } +size_t +PcmExport::GetInputBlockSize() const noexcept +{ +#ifdef ENABLE_DSD + switch (dsd_mode) { + case DsdMode::NONE: + break; + + case DsdMode::U16: + return dsd16_converter.GetInputBlockSize(); + + case DsdMode::U32: + return dsd32_converter.GetInputBlockSize(); + break; + + case DsdMode::DOP: + return dop_converter.GetInputBlockSize(); + } +#endif + + return GetInputFrameSize(); +} + +size_t +PcmExport::GetOutputBlockSize() const noexcept +{ +#ifdef ENABLE_DSD + switch (dsd_mode) { + case DsdMode::NONE: + break; + + case DsdMode::U16: + return dsd16_converter.GetOutputBlockSize(); + + case DsdMode::U32: + return dsd32_converter.GetOutputBlockSize(); + break; + + case DsdMode::DOP: + return dop_converter.GetOutputBlockSize(); + } +#endif + + return GetOutputFrameSize(); +} + unsigned PcmExport::Params::CalcOutputSampleRate(unsigned sample_rate) const noexcept { diff --git a/src/pcm/Export.hxx b/src/pcm/Export.hxx index 251576e60..b4a8ae9b9 100644 --- a/src/pcm/Export.hxx +++ b/src/pcm/Export.hxx @@ -198,6 +198,18 @@ public: gcc_pure size_t GetOutputFrameSize() const noexcept; + /** + * @return the size of one input block in bytes + */ + gcc_pure + size_t GetInputBlockSize() const noexcept; + + /** + * @return the size of one output block in bytes + */ + gcc_pure + size_t GetOutputBlockSize() const noexcept; + /** * Export a PCM buffer. * diff --git a/src/pcm/RestBuffer.hxx b/src/pcm/RestBuffer.hxx index ddcfdfcf8..47ce87903 100644 --- a/src/pcm/RestBuffer.hxx +++ b/src/pcm/RestBuffer.hxx @@ -48,6 +48,13 @@ public: size = 0; } + /** + * @return the size of one input block in #T samples + */ + size_t GetInputBlockSize() const noexcept { + return capacity; + } + unsigned GetChannelCount() const noexcept { return capacity / n_frames; }