You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
1.5 KiB
C++
76 lines
1.5 KiB
C++
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
// Copyright The Music Player Daemon Project
|
|
|
|
#pragma once
|
|
|
|
#include "FormatConverter.hxx"
|
|
#include "ChannelsConverter.hxx"
|
|
#include "GlueResampler.hxx"
|
|
#include "AudioFormat.hxx"
|
|
#include "pcm/Features.h" // for ENABLE_DSD
|
|
|
|
#ifdef ENABLE_DSD
|
|
#include "PcmDsd.hxx"
|
|
#endif
|
|
|
|
#include <cstddef>
|
|
#include <span>
|
|
|
|
struct ConfigData;
|
|
|
|
/**
|
|
* This object is statically allocated (within another struct), and
|
|
* holds buffer allocations and the state for all kinds of PCM
|
|
* conversions.
|
|
*/
|
|
class PcmConvert {
|
|
#ifdef ENABLE_DSD
|
|
PcmDsd dsd;
|
|
#endif
|
|
|
|
GluePcmResampler resampler;
|
|
PcmFormatConverter format_converter;
|
|
PcmChannelsConverter channels_converter;
|
|
|
|
const AudioFormat src_format;
|
|
|
|
bool enable_resampler, enable_format, enable_channels;
|
|
|
|
#ifdef ENABLE_DSD
|
|
bool dsd2pcm_float;
|
|
#endif
|
|
|
|
public:
|
|
|
|
/**
|
|
* Throws on error.
|
|
*/
|
|
PcmConvert(AudioFormat _src_format, AudioFormat _dest_format);
|
|
|
|
~PcmConvert() noexcept;
|
|
|
|
/**
|
|
* Reset the filter's state, e.g. drop/flush buffers.
|
|
*/
|
|
void Reset() noexcept;
|
|
|
|
/**
|
|
* Converts PCM data between two audio formats.
|
|
*
|
|
* Throws std::runtime_error on error.
|
|
*
|
|
* @param src the source PCM buffer
|
|
* @return the destination buffer
|
|
*/
|
|
std::span<const std::byte> Convert(std::span<const std::byte> src);
|
|
|
|
/**
|
|
* Flush pending data and return it. This should be called
|
|
* repepatedly until it returns nullptr.
|
|
*/
|
|
std::span<const std::byte> Flush();
|
|
};
|
|
|
|
void
|
|
pcm_convert_global_init(const ConfigData &config);
|