diff options
Diffstat (limited to 'src/pcm')
-rw-r--r-- | src/pcm/ChannelsConverter.hxx | 2 | ||||
-rw-r--r-- | src/pcm/FormatConverter.hxx | 2 | ||||
-rw-r--r-- | src/pcm/Order.hxx | 2 | ||||
-rw-r--r-- | src/pcm/PcmConvert.cxx | 1 | ||||
-rw-r--r-- | src/pcm/PcmExport.cxx | 1 | ||||
-rw-r--r-- | src/pcm/PcmExport.hxx | 3 | ||||
-rw-r--r-- | src/pcm/PcmFormat.hxx | 2 | ||||
-rw-r--r-- | src/pcm/PcmMix.cxx | 1 | ||||
-rw-r--r-- | src/pcm/PcmMix.hxx | 2 | ||||
-rw-r--r-- | src/pcm/SampleFormat.cxx | 51 | ||||
-rw-r--r-- | src/pcm/SampleFormat.hxx | 126 | ||||
-rw-r--r-- | src/pcm/Silence.cxx | 2 | ||||
-rw-r--r-- | src/pcm/Traits.hxx | 2 | ||||
-rw-r--r-- | src/pcm/Volume.hxx | 2 |
14 files changed, 188 insertions, 11 deletions
diff --git a/src/pcm/ChannelsConverter.hxx b/src/pcm/ChannelsConverter.hxx index be45ef71e..4cba279af 100644 --- a/src/pcm/ChannelsConverter.hxx +++ b/src/pcm/ChannelsConverter.hxx @@ -21,7 +21,7 @@ #define MPD_PCM_CHANNELS_CONVERTER_HXX #include "check.h" -#include "AudioFormat.hxx" +#include "SampleFormat.hxx" #include "PcmBuffer.hxx" #ifndef NDEBUG diff --git a/src/pcm/FormatConverter.hxx b/src/pcm/FormatConverter.hxx index 1faa5c1a2..e0381bf39 100644 --- a/src/pcm/FormatConverter.hxx +++ b/src/pcm/FormatConverter.hxx @@ -21,7 +21,7 @@ #define MPD_PCM_FORMAT_CONVERTER_HXX #include "check.h" -#include "AudioFormat.hxx" +#include "SampleFormat.hxx" #include "PcmBuffer.hxx" #include "PcmDither.hxx" diff --git a/src/pcm/Order.hxx b/src/pcm/Order.hxx index d5a1af820..ab32c3d63 100644 --- a/src/pcm/Order.hxx +++ b/src/pcm/Order.hxx @@ -21,7 +21,7 @@ #define MPD_PCM_ORDER_HXX #include "check.h" -#include "AudioFormat.hxx" +#include "SampleFormat.hxx" class PcmBuffer; template<typename T> struct ConstBuffer; diff --git a/src/pcm/PcmConvert.cxx b/src/pcm/PcmConvert.cxx index 6658a48c6..0752b1db8 100644 --- a/src/pcm/PcmConvert.cxx +++ b/src/pcm/PcmConvert.cxx @@ -20,7 +20,6 @@ #include "config.h" #include "PcmConvert.hxx" #include "ConfiguredResampler.hxx" -#include "AudioFormat.hxx" #include "util/ConstBuffer.hxx" #include <assert.h> diff --git a/src/pcm/PcmExport.cxx b/src/pcm/PcmExport.cxx index 6738ebada..fce50a4f3 100644 --- a/src/pcm/PcmExport.cxx +++ b/src/pcm/PcmExport.cxx @@ -19,6 +19,7 @@ #include "config.h" #include "PcmExport.hxx" +#include "AudioFormat.hxx" #include "Order.hxx" #include "PcmPack.hxx" #include "util/ByteReverse.hxx" diff --git a/src/pcm/PcmExport.hxx b/src/pcm/PcmExport.hxx index 3e801a150..1639520d8 100644 --- a/src/pcm/PcmExport.hxx +++ b/src/pcm/PcmExport.hxx @@ -21,10 +21,11 @@ #define PCM_EXPORT_HXX #include "check.h" +#include "SampleFormat.hxx" #include "PcmBuffer.hxx" -#include "AudioFormat.hxx" template<typename T> struct ConstBuffer; +struct AudioFormat; /** * An object that handles export of PCM samples to some instance diff --git a/src/pcm/PcmFormat.hxx b/src/pcm/PcmFormat.hxx index 437e90e96..9faa1a003 100644 --- a/src/pcm/PcmFormat.hxx +++ b/src/pcm/PcmFormat.hxx @@ -20,7 +20,7 @@ #ifndef MPD_PCM_FORMAT_HXX #define MPD_PCM_FORMAT_HXX -#include "AudioFormat.hxx" +#include "SampleFormat.hxx" #include <stdint.h> diff --git a/src/pcm/PcmMix.cxx b/src/pcm/PcmMix.cxx index 5c19fa313..ae859dbf4 100644 --- a/src/pcm/PcmMix.cxx +++ b/src/pcm/PcmMix.cxx @@ -21,7 +21,6 @@ #include "PcmMix.hxx" #include "Volume.hxx" #include "PcmUtils.hxx" -#include "AudioFormat.hxx" #include "Traits.hxx" #include "util/Clamp.hxx" diff --git a/src/pcm/PcmMix.hxx b/src/pcm/PcmMix.hxx index b12abd49a..9906d8920 100644 --- a/src/pcm/PcmMix.hxx +++ b/src/pcm/PcmMix.hxx @@ -20,7 +20,7 @@ #ifndef MPD_PCM_MIX_HXX #define MPD_PCM_MIX_HXX -#include "AudioFormat.hxx" +#include "SampleFormat.hxx" #include "Compiler.h" #include <stddef.h> diff --git a/src/pcm/SampleFormat.cxx b/src/pcm/SampleFormat.cxx new file mode 100644 index 000000000..7968e69b7 --- /dev/null +++ b/src/pcm/SampleFormat.cxx @@ -0,0 +1,51 @@ +/* + * Copyright 2003-2017 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "SampleFormat.hxx" + +const char * +sample_format_to_string(SampleFormat format) +{ + switch (format) { + case SampleFormat::UNDEFINED: + return "?"; + + case SampleFormat::S8: + return "8"; + + case SampleFormat::S16: + return "16"; + + case SampleFormat::S24_P32: + return "24"; + + case SampleFormat::S32: + return "32"; + + case SampleFormat::FLOAT: + return "f"; + + case SampleFormat::DSD: + return "dsd"; + } + + /* unreachable */ + assert(false); + gcc_unreachable(); +} diff --git a/src/pcm/SampleFormat.hxx b/src/pcm/SampleFormat.hxx new file mode 100644 index 000000000..e5b4c5985 --- /dev/null +++ b/src/pcm/SampleFormat.hxx @@ -0,0 +1,126 @@ +/* + * Copyright 2003-2017 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef MPD_PCM_SAMPLE_FORMAT_HXX +#define MPD_PCM_SAMPLE_FORMAT_HXX + +#include "Compiler.h" + +#include <assert.h> +#include <stdint.h> + +#if defined(WIN32) && GCC_CHECK_VERSION(4,6) +/* on WIN32, "FLOAT" is already defined, and this triggers -Wshadow */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshadow" +#endif + +enum class SampleFormat : uint8_t { + UNDEFINED = 0, + + S8, + S16, + + /** + * Signed 24 bit integer samples, packed in 32 bit integers + * (the most significant byte is filled with the sign bit). + */ + S24_P32, + + S32, + + /** + * 32 bit floating point samples in the host's format. The + * range is -1.0f to +1.0f. + */ + FLOAT, + + /** + * Direct Stream Digital. 1-bit samples; each frame has one + * byte (8 samples) per channel. + */ + DSD, +}; + +#if defined(WIN32) && GCC_CHECK_VERSION(4,6) +#pragma GCC diagnostic pop +#endif + +/** + * Checks whether the sample format is valid. + */ +static inline bool +audio_valid_sample_format(SampleFormat format) +{ + switch (format) { + case SampleFormat::S8: + case SampleFormat::S16: + case SampleFormat::S24_P32: + case SampleFormat::S32: + case SampleFormat::FLOAT: + case SampleFormat::DSD: + return true; + + case SampleFormat::UNDEFINED: + break; + } + + return false; +} + +gcc_const +static inline unsigned +sample_format_size(SampleFormat format) +{ + switch (format) { + case SampleFormat::S8: + return 1; + + case SampleFormat::S16: + return 2; + + case SampleFormat::S24_P32: + case SampleFormat::S32: + case SampleFormat::FLOAT: + return 4; + + case SampleFormat::DSD: + /* each frame has 8 samples per channel */ + return 1; + + case SampleFormat::UNDEFINED: + return 0; + } + + assert(false); + gcc_unreachable(); +} + +/** + * Renders a #SampleFormat enum into a string, e.g. for printing it + * in a log file. + * + * @param format a #SampleFormat enum value + * @return the string + */ +gcc_pure gcc_malloc +const char * +sample_format_to_string(SampleFormat format); + +#endif diff --git a/src/pcm/Silence.cxx b/src/pcm/Silence.cxx index 150539e8e..b1883ab61 100644 --- a/src/pcm/Silence.cxx +++ b/src/pcm/Silence.cxx @@ -19,7 +19,7 @@ #include "config.h" #include "Silence.hxx" -#include "AudioFormat.hxx" +#include "SampleFormat.hxx" #include "util/WritableBuffer.hxx" #include <string.h> diff --git a/src/pcm/Traits.hxx b/src/pcm/Traits.hxx index 90be1e19a..c0ef32388 100644 --- a/src/pcm/Traits.hxx +++ b/src/pcm/Traits.hxx @@ -21,7 +21,7 @@ #define MPD_PCM_TRAITS_HXX #include "check.h" -#include "AudioFormat.hxx" +#include "SampleFormat.hxx" #include <stdint.h> #include <stddef.h> diff --git a/src/pcm/Volume.hxx b/src/pcm/Volume.hxx index b989ba12b..fde00b0f4 100644 --- a/src/pcm/Volume.hxx +++ b/src/pcm/Volume.hxx @@ -20,7 +20,7 @@ #ifndef MPD_PCM_VOLUME_HXX #define MPD_PCM_VOLUME_HXX -#include "AudioFormat.hxx" +#include "SampleFormat.hxx" #include "PcmBuffer.hxx" #include "PcmDither.hxx" |