Browse Source

WavAudioImporter: have an enum for WAV audio formats.

Together with debug output it allowed me to reduce the amount of error
branches.
pull/176/head
Vladimír Vondruš 10 years ago
parent
commit
b0d6b2b14a
  1. 18
      src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp
  2. 16
      src/MagnumPlugins/WavAudioImporter/WavHeader.cpp
  3. 16
      src/MagnumPlugins/WavAudioImporter/WavHeader.h
  4. 23
      src/MagnumPlugins/WavAudioImporter/WavImporter.cpp

18
src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp

@ -30,6 +30,7 @@
#include <Corrade/Utility/Directory.h> #include <Corrade/Utility/Directory.h>
#include "MagnumPlugins/WavAudioImporter/WavImporter.h" #include "MagnumPlugins/WavAudioImporter/WavImporter.h"
#include "MagnumPlugins/WavAudioImporter/WavHeader.h"
#include "configure.h" #include "configure.h"
@ -60,6 +61,8 @@ class WavImporterTest: public TestSuite::Tester {
void stereo64f(); void stereo64f();
void surround616(); void surround616();
void debugAudioFormat();
}; };
WavImporterTest::WavImporterTest() { WavImporterTest::WavImporterTest() {
@ -82,7 +85,9 @@ WavImporterTest::WavImporterTest() {
&WavImporterTest::mono32f, &WavImporterTest::mono32f,
&WavImporterTest::stereo32f, &WavImporterTest::stereo32f,
&WavImporterTest::stereo64f, &WavImporterTest::stereo64f,
&WavImporterTest::surround616}); &WavImporterTest::surround616,
&WavImporterTest::debugAudioFormat});
} }
void WavImporterTest::wrongSize() { void WavImporterTest::wrongSize() {
@ -109,7 +114,7 @@ void WavImporterTest::unsupportedFormat() {
WavImporter importer; WavImporter importer;
CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "unsupportedFormat.wav"))); CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "unsupportedFormat.wav")));
CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported audio format 2\n"); CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported format Audio::WavAudioFormat(0x2)\n");
} }
void WavImporterTest::unsupportedChannelCount() { void WavImporterTest::unsupportedChannelCount() {
@ -231,7 +236,14 @@ void WavImporterTest::surround616() {
WavImporter importer; WavImporter importer;
CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "surround616.wav"))); CORRADE_VERIFY(!importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "surround616.wav")));
CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported audio format: extensible not implememented 65534\n"); CORRADE_COMPARE(out.str(), "Audio::WavImporter::openData(): unsupported format Audio::WavAudioFormat::Extensible\n");
}
void WavImporterTest::debugAudioFormat() {
std::ostringstream out;
Debug{&out} << WavAudioFormat::IeeeFloat << WavAudioFormat(0xdead);
CORRADE_COMPARE(out.str(), "Audio::WavAudioFormat::IeeeFloat Audio::WavAudioFormat(0xdead)\n");
} }
}}} }}}

16
src/MagnumPlugins/WavAudioImporter/WavHeader.cpp

@ -35,4 +35,20 @@ static_assert(sizeof(RiffChunk) == 8, "RiffChunk size is not 8 bytes");
static_assert(sizeof(WavHeaderChunk) == 12, "WavHeaderChunk size is not 12 bytes"); static_assert(sizeof(WavHeaderChunk) == 12, "WavHeaderChunk size is not 12 bytes");
static_assert(sizeof(WavFormatChunk) == 24, "WavFormatChunk size is not 18 bytes"); static_assert(sizeof(WavFormatChunk) == 24, "WavFormatChunk size is not 18 bytes");
Debug& operator<<(Debug& debug, const WavAudioFormat value) {
switch(value) {
/* LCOV_EXCL_START */
#define _c(value) case WavAudioFormat::value: return debug << "Audio::WavAudioFormat::" #value;
_c(Pcm)
_c(IeeeFloat)
_c(ALaw)
_c(MuLaw)
_c(Extensible)
#undef _c
/* LCOV_EXCL_STOP */
}
return debug << "Audio::WavAudioFormat(" << Debug::nospace << reinterpret_cast<void*>(UnsignedShort(value)) << Debug::nospace << ")";
}
}} }}

16
src/MagnumPlugins/WavAudioImporter/WavHeader.h

@ -29,10 +29,19 @@
* @brief Struct @ref Magnum::Audio::RiffChunk, @ref Magnum::Audio::WavHeaderChunk, @ref Magnum::Audio::WavFormatChunk, enum @ref Magnum::Audio::WavAudioFormat * @brief Struct @ref Magnum::Audio::RiffChunk, @ref Magnum::Audio::WavHeaderChunk, @ref Magnum::Audio::WavFormatChunk, enum @ref Magnum::Audio::WavAudioFormat
*/ */
#include "Magnum/Types.h" #include "MagnumPlugins/WavAudioImporter/WavImporter.h"
namespace Magnum { namespace Audio { namespace Magnum { namespace Audio {
/** @brief WAV audio format */
enum class WavAudioFormat: UnsignedShort {
Pcm = 0x0001, /**< PCM */
IeeeFloat = 0x0003, /**< IEEE Float */
ALaw = 0x0006, /**< A-Law */
MuLaw = 0x0007, /**< μ-Law */
Extensible = 0xfffe /**< Extensible */
};
#pragma pack(1) #pragma pack(1)
/** @brief RIFF chunk */ /** @brief RIFF chunk */
struct RiffChunk { struct RiffChunk {
@ -53,7 +62,7 @@ struct WavHeaderChunk {
/** @brief WAV 'fmt' header */ /** @brief WAV 'fmt' header */
struct WavFormatChunk { struct WavFormatChunk {
RiffChunk chunk; /**< @brief Starting RIFF chunk */ RiffChunk chunk; /**< @brief Starting RIFF chunk */
UnsignedShort audioFormat; /**< @brief 1 = PCM */ WavAudioFormat audioFormat; /**< @brief Audio format */
UnsignedShort numChannels; /**< @brief 1 = Mono, 2 = Stereo */ UnsignedShort numChannels; /**< @brief 1 = Mono, 2 = Stereo */
UnsignedInt sampleRate; /**< @brief Sample rate in Hz */ UnsignedInt sampleRate; /**< @brief Sample rate in Hz */
UnsignedInt byteRate; /**< @brief Bytes per second */ UnsignedInt byteRate; /**< @brief Bytes per second */
@ -62,6 +71,9 @@ struct WavFormatChunk {
}; };
#pragma pack() #pragma pack()
/** @debugoperatorenum{WavAudioFormat} */
MAGNUM_WAVAUDIOIMPORTER_EXPORT Debug& operator<<(Debug& debug, WavAudioFormat value);
}} }}
#endif #endif

23
src/MagnumPlugins/WavAudioImporter/WavImporter.cpp

@ -31,12 +31,6 @@
#include "MagnumPlugins/WavAudioImporter/WavHeader.h" #include "MagnumPlugins/WavAudioImporter/WavHeader.h"
#define WAVE_FORMAT_PCM 0x0001
#define WAVE_FORMAT_IEEE_FLOAT 0x0003
#define WAVE_FORMAT_ALAW 0x0006
#define WAVE_FORMAT_MULAW 0x0007
#define WAVE_FORMAT_EXTENSIBLE 0xFFFE
namespace Magnum { namespace Audio { namespace Magnum { namespace Audio {
WavImporter::WavImporter() = default; WavImporter::WavImporter() = default;
@ -125,7 +119,7 @@ void WavImporter::doOpenData(Containers::ArrayView<const char> data) {
formatChunk->bitsPerSample); formatChunk->bitsPerSample);
/* Check PCM format */ /* Check PCM format */
if(formatChunk->audioFormat == WAVE_FORMAT_PCM) { if(formatChunk->audioFormat == WavAudioFormat::Pcm) {
/* Decide about format */ /* Decide about format */
if(formatChunk->numChannels == 1 && formatChunk->bitsPerSample == 8) if(formatChunk->numChannels == 1 && formatChunk->bitsPerSample == 8)
_format = Buffer::Format::Mono8; _format = Buffer::Format::Mono8;
@ -143,7 +137,7 @@ void WavImporter::doOpenData(Containers::ArrayView<const char> data) {
} }
/* Check IEEE Float format */ /* Check IEEE Float format */
} else if(formatChunk->audioFormat == WAVE_FORMAT_IEEE_FLOAT) { } else if(formatChunk->audioFormat == WavAudioFormat::IeeeFloat) {
if(formatChunk->numChannels == 1 && formatChunk->bitsPerSample == 32) if(formatChunk->numChannels == 1 && formatChunk->bitsPerSample == 32)
_format = Buffer::Format::MonoFloat; _format = Buffer::Format::MonoFloat;
else if(formatChunk->numChannels == 2 && formatChunk->bitsPerSample == 32) else if(formatChunk->numChannels == 2 && formatChunk->bitsPerSample == 32)
@ -160,7 +154,7 @@ void WavImporter::doOpenData(Containers::ArrayView<const char> data) {
} }
/* Check ALAW format */ /* Check ALAW format */
} else if(formatChunk->audioFormat == WAVE_FORMAT_ALAW) { } else if(formatChunk->audioFormat == WavAudioFormat::ALaw) {
if(formatChunk->numChannels == 1) if(formatChunk->numChannels == 1)
_format = Buffer::Format::MonoALaw; _format = Buffer::Format::MonoALaw;
else if(formatChunk->numChannels == 2) else if(formatChunk->numChannels == 2)
@ -173,7 +167,7 @@ void WavImporter::doOpenData(Containers::ArrayView<const char> data) {
} }
/* Check MULAW format */ /* Check MULAW format */
} else if(formatChunk->audioFormat == WAVE_FORMAT_MULAW) { } else if(formatChunk->audioFormat == WavAudioFormat::MuLaw) {
if(formatChunk->numChannels == 1) if(formatChunk->numChannels == 1)
_format = Buffer::Format::MonoMuLaw; _format = Buffer::Format::MonoMuLaw;
else if(formatChunk->numChannels == 2) else if(formatChunk->numChannels == 2)
@ -184,13 +178,10 @@ void WavImporter::doOpenData(Containers::ArrayView<const char> data) {
<< "bits per sample"; << "bits per sample";
return; return;
} }
/* We do not currently support EXTENSIBLE formats */
} else if(formatChunk->audioFormat == WAVE_FORMAT_EXTENSIBLE) { /* Unknown/unimplemented format */
Error() << "Audio::WavImporter::openData(): unsupported audio format: extensible not implememented" << formatChunk->audioFormat;
return;
/* Unknown format */
} else { } else {
Error() << "Audio::WavImporter::openData(): unsupported audio format" << formatChunk->audioFormat; Error() << "Audio::WavImporter::openData(): unsupported format" << formatChunk->audioFormat;
return; return;
} }

Loading…
Cancel
Save