diff --git a/Makefile.am b/Makefile.am index 73f817626..4b23bfe9d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -542,6 +542,7 @@ libpcm_a_SOURCES = \ src/CheckAudioFormat.cxx src/CheckAudioFormat.hxx \ src/AudioFormat.cxx src/AudioFormat.hxx \ src/AudioParser.cxx src/AudioParser.hxx \ + src/pcm/SampleFormat.cxx src/pcm/SampleFormat.hxx \ src/pcm/Traits.hxx \ src/pcm/Interleave.cxx src/pcm/Interleave.hxx \ src/pcm/PcmBuffer.cxx src/pcm/PcmBuffer.hxx \ diff --git a/src/AudioFormat.cxx b/src/AudioFormat.cxx index dace5b314..a374bc02e 100644 --- a/src/AudioFormat.cxx +++ b/src/AudioFormat.cxx @@ -40,37 +40,6 @@ AudioFormat::ApplyMask(AudioFormat mask) assert(IsValid()); } -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(); -} - const char * audio_format_to_string(const AudioFormat af, struct audio_format_string *s) diff --git a/src/AudioFormat.hxx b/src/AudioFormat.hxx index 905dd5229..f39dc21e7 100644 --- a/src/AudioFormat.hxx +++ b/src/AudioFormat.hxx @@ -20,48 +20,12 @@ #ifndef MPD_AUDIO_FORMAT_HXX #define MPD_AUDIO_FORMAT_HXX +#include "pcm/SampleFormat.hxx" #include "Compiler.h" #include #include -#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 - static constexpr unsigned MAX_CHANNELS = 8; /** @@ -201,28 +165,6 @@ audio_valid_sample_rate(unsigned sample_rate) return sample_rate > 0 && sample_rate < (1 << 30); } -/** - * 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; -} - /** * Checks whether the number of channels is valid. */ @@ -258,34 +200,6 @@ AudioFormat::IsMaskValid() const (channels == 0 || audio_valid_channel_count(channels)); } -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(); -} - inline unsigned AudioFormat::GetSampleSize() const { @@ -304,17 +218,6 @@ AudioFormat::GetTimeToSize() const return sample_rate * GetFrameSize(); } -/** - * 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); - /** * Renders the #AudioFormat object into a string, e.g. for printing * it in a log file. 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 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 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 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 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 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 +#include + +#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 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 #include 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" diff --git a/test/read_tags.cxx b/test/read_tags.cxx index c605b7488..05e2c60e0 100644 --- a/test/read_tags.cxx +++ b/test/read_tags.cxx @@ -23,7 +23,6 @@ #include "decoder/DecoderPlugin.hxx" #include "input/Init.hxx" #include "input/InputStream.hxx" -#include "AudioFormat.hxx" #include "tag/TagHandler.hxx" #include "tag/Generic.hxx" #include "fs/Path.hxx" diff --git a/test/test_pcm_format.cxx b/test/test_pcm_format.cxx index adb449498..728e3c1f2 100644 --- a/test/test_pcm_format.cxx +++ b/test/test_pcm_format.cxx @@ -24,7 +24,7 @@ #include "pcm/PcmDither.hxx" #include "pcm/PcmUtils.hxx" #include "pcm/PcmBuffer.hxx" -#include "AudioFormat.hxx" +#include "pcm/SampleFormat.hxx" void PcmFormatTest::TestFormat8to16()