/* Audio File Library Copyright (C) 2013 Michael Pruett 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 Lossless_h #define Lossless_h #include #include #include #include #include "TestUtilities.h" struct NaturalGenerator { NaturalGenerator() : m_n(0) { } int32_t operator() () { return ++m_n; } private: int32_t m_n; }; struct LinearCongruentialGenerator { LinearCongruentialGenerator() : m_n(0) { } int32_t operator() () { m_n = 1664525 * m_n + 1013904223; return static_cast(m_n); } private: uint32_t m_n; }; static inline int32_t trim(int32_t n, int sampleWidth) { unsigned shift = (((sampleWidth + 7) >> 3) << 3) - sampleWidth; unsigned maskShift = 32 - sampleWidth; n <<= shift; return (n << maskShift) >> maskShift; } template static void testLossless(const char *prefix, int fileFormat, int compressionFormat, int channelCount, int sampleWidth, int frameCount) { SCOPED_TRACE(channelCount); std::string testFileName; ASSERT_TRUE(createTemporaryFile(prefix, &testFileName)); AFfilesetup setup = afNewFileSetup(); afInitFileFormat(setup, fileFormat); afInitChannels(setup, AF_DEFAULT_TRACK, channelCount); afInitSampleFormat(setup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, sampleWidth); afInitCompression(setup, AF_DEFAULT_TRACK, compressionFormat); AFfilehandle file = afOpenFile(testFileName.c_str(), "w", setup); ASSERT_TRUE(file); afFreeFileSetup(setup); Generator g; SampleType *data = new SampleType[frameCount * channelCount]; for (int i=0; i static void testLossless(const char *prefix, int fileFormat, int compressionFormat, int channelCount, int sampleWidth, int frameCount) { { SCOPED_TRACE("Sequential"); testLossless(prefix, fileFormat, compressionFormat, channelCount, sampleWidth, frameCount); } { SCOPED_TRACE("Pseudo-random"); testLossless(prefix, fileFormat, compressionFormat, channelCount, sampleWidth, frameCount); } } #endif