diff --git a/src/Magnum/Audio/Buffer.h b/src/Magnum/Audio/Buffer.h index 8194caa5e..09062e18d 100644 --- a/src/Magnum/Audio/Buffer.h +++ b/src/Magnum/Audio/Buffer.h @@ -57,10 +57,32 @@ class Buffer { Stereo8 = AL_FORMAT_STEREO8, /**< 8-bit interleaved unsigned stereo */ Stereo16 = AL_FORMAT_STEREO16, /**< 16-bit interleaved signed stereo */ + /** + * @brief 8-bit unsigned mono A-Law Compressed Sound Format + * + * @requires_al_extension Extension @al_extension{EXT,ALAW} + */ MonoALaw = AL_FORMAT_MONO_ALAW_EXT, + + /** + * @brief 16-bit signed stereo A-Law Compressed Sound Format + * + * @requires_al_extension Extension @al_extension{EXT,ALAW} + */ StereoALaw = AL_FORMAT_STEREO_ALAW_EXT, + /** + * @brief 8-bit unsigned mono Mu-Law Compressed Sound Format + * + * @requires_al_extension Extension @al_extension{EXT,MULAW} + */ MonoMuLaw = AL_FORMAT_MONO_MULAW_EXT, + + /** + * @brief 16-bit signed Mu-Law Compressed Sound Format + * + * @requires_al_extension Extension @al_extension{EXT,MULAW} + */ StereoMuLaw = AL_FORMAT_STEREO_MULAW_EXT, /** @@ -91,25 +113,93 @@ class Buffer { */ StereoDouble = AL_FORMAT_STEREO_DOUBLE_EXT, + /** + * @brief 8-bit unsigned quadrophonic + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ Quad8 = AL_FORMAT_QUAD8, + + /** + * @brief 16-bit signed quadrophonic + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ Quad16 = AL_FORMAT_QUAD16, + + /** + * @brief 32-bit interleaved floating-point quadrophonic + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ Quad32 = AL_FORMAT_QUAD32, Rear8 = AL_FORMAT_REAR8, Rear16 = AL_FORMAT_REAR16, Rear32 = AL_FORMAT_REAR32, - Five_1Chnl8 = AL_FORMAT_51CHN8, - Five_1Chnl16 = AL_FORMAT_51CHN16, - Five_1Chnl32 = AL_FORMAT_51CHN32, + /** + * @brief 8-bit unsigned 5.1 surround + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Surround51Channel8 = AL_FORMAT_51CHN8, + + /** + * @brief 16-bit signed 5.1 surround + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Surround51Channel16 = AL_FORMAT_51CHN16, - Six_1Chnl8 = AL_FORMAT_61CHN8, - Six_1Chnl16 = AL_FORMAT_61CHN16, - Six_1Chnl32 = AL_FORMAT_61CHN32, + /** + * @brief 32-bit interleaved floating-point 5.1 surround + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Surround51Channel32 = AL_FORMAT_51CHN32, - Seven_1Chnl8 = AL_FORMAT_71CHN8, - Seven_1Chnl16 = AL_FORMAT_71CHN16, - Seven_1Chnl32 = AL_FORMAT_71CHN32 + /** + * @brief 8-bit unsigned 6.1 surround + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Surround61Channel8 = AL_FORMAT_61CHN8, + + /** + * @brief 16-bit signed 6.1 surround + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Surround61Channel16 = AL_FORMAT_61CHN16, + + /** + * @brief 32-bit interleaved floating-point 6.1 surround + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Surround61Channel32 = AL_FORMAT_61CHN32, + + /** + * @brief 8-bit unsigned 7.1 surround + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Surround71Channel8 = AL_FORMAT_71CHN8, + + /** + * @brief 16-bit signed 7.1 surround + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Surround71Channel16 = AL_FORMAT_71CHN16, + + /** + * @brief 32-bit interleaved floating-point 7.1 surround + * + * @requires_al_extension Extension @al_extension{EXT,MCFORMATS} + */ + Surround71Channel32 = AL_FORMAT_71CHN32 }; /** diff --git a/src/Magnum/Audio/Context.cpp b/src/Magnum/Audio/Context.cpp index 7ccb27479..df7d58779 100644 --- a/src/Magnum/Audio/Context.cpp +++ b/src/Magnum/Audio/Context.cpp @@ -44,6 +44,9 @@ const std::vector& Extension::extensions() { static const std::vector extensions{ _extension(AL,EXT,FLOAT32), _extension(AL,EXT,DOUBLE), + _extension(AL,EXT,ALAW), + _extension(AL,EXT,MULAW), + _extension(AL,EXT,MCFORMATS), _extension(ALC,EXT,ENUMERATION), _extension(ALC,SOFTX,HRTF), _extension(ALC,SOFT,HRTF) diff --git a/src/Magnum/Audio/Extensions.h b/src/Magnum/Audio/Extensions.h index 478903e56..b9993d6d0 100644 --- a/src/Magnum/Audio/Extensions.h +++ b/src/Magnum/Audio/Extensions.h @@ -79,6 +79,9 @@ namespace AL { namespace EXT { _extension(AL,EXT,FLOAT32) // #??? _extension(AL,EXT,DOUBLE) // #??? + _extension(AL,EXT,ALAW) // #??? + _extension(AL,EXT,MULAW) // #??? + _extension(AL,EXT,MCFORMATS) // #??? } } namespace ALC { namespace EXT { diff --git a/src/MagnumExternal/OpenAL/extensions.h b/src/MagnumExternal/OpenAL/extensions.h index 4e003a2a2..5beb8bb39 100644 --- a/src/MagnumExternal/OpenAL/extensions.h +++ b/src/MagnumExternal/OpenAL/extensions.h @@ -66,6 +66,7 @@ extern "C" { #define AL_FORMAT_STEREO_ALAW_EXT 0x10017 #endif +/* AL_EXT_MCFORMATS */ #ifndef AL_EXT_MCFORMATS #define AL_EXT_MCFORMATS 1 #define AL_FORMAT_QUAD8 0x1204 diff --git a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt index ef97f300e..75aa77178 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt @@ -38,6 +38,8 @@ target_include_directories(WavAudioImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_D if(CORRADE_TARGET_EMSCRIPTEN) emscripten_embed_file(WavAudioImporterTest mono8.wav "/mono8.wav") + emscripten_embed_file(WavAudioImporterTest mono8.wav "/mono8junk.wav") + emscripten_embed_file(WavAudioImporterTest mono8ALaw.wav "/mono8ALaw.wav") emscripten_embed_file(WavAudioImporterTest mono8MuLaw.wav "/mono8MuLaw.wav") emscripten_embed_file(WavAudioImporterTest mono16.wav "/mono16.wav") diff --git a/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp b/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp index 8324b6c32..28c783bac 100644 --- a/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp +++ b/src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp @@ -45,6 +45,7 @@ class WavImporterTest: public TestSuite::Tester { void unsupportedChannelCount(); void mono8(); + void mono8junk(); void mono8ALaw(); void mono8MuLaw(); void mono16(); @@ -67,6 +68,7 @@ WavImporterTest::WavImporterTest() { &WavImporterTest::unsupportedFormat, &WavImporterTest::unsupportedChannelCount, &WavImporterTest::mono8, +// &WavImporterTest::mono8junk, &WavImporterTest::mono8ALaw, &WavImporterTest::mono8MuLaw, &WavImporterTest::mono16, @@ -124,6 +126,14 @@ void WavImporterTest::mono8() { CORRADE_COMPARE(importer.frequency(), 22050); } +void WavImporterTest::mono8junk() { + WavImporter importer; + CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono8junk.wav"))); + + CORRADE_COMPARE(importer.format(), Buffer::Format::Mono8); + CORRADE_COMPARE(importer.frequency(), 22050); +} + void WavImporterTest::mono8ALaw() { WavImporter importer; CORRADE_VERIFY(importer.openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "mono8ALaw.wav"))); diff --git a/src/MagnumPlugins/WavAudioImporter/Test/mono8junk.wav b/src/MagnumPlugins/WavAudioImporter/Test/mono8junk.wav new file mode 100644 index 000000000..32480cbaa Binary files /dev/null and b/src/MagnumPlugins/WavAudioImporter/Test/mono8junk.wav differ diff --git a/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp b/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp index 3c0ba24c7..a02ea2498 100644 --- a/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp +++ b/src/MagnumPlugins/WavAudioImporter/WavImporter.cpp @@ -99,9 +99,8 @@ void WavImporter::doOpenData(Containers::ArrayView data) { << "bits per sample"; return; } - } /* Check IEEE Float format */ - else if(formatChunk.audioFormat == WAVE_FORMAT_IEEE_FLOAT) { + } else if(formatChunk.audioFormat == WAVE_FORMAT_IEEE_FLOAT) { if(formatChunk.numChannels == 1 && formatChunk.bitsPerSample == 32) _format = Buffer::Format::MonoFloat; else if(formatChunk.numChannels == 2 && formatChunk.bitsPerSample == 32) @@ -116,8 +115,8 @@ void WavImporter::doOpenData(Containers::ArrayView data) { << "bits per sample"; return; } - } - else if(formatChunk.audioFormat == WAVE_FORMAT_ALAW) { + /* Check ALAW format */ + } else if(formatChunk.audioFormat == WAVE_FORMAT_ALAW) { if(formatChunk.numChannels == 1) _format = Buffer::Format::MonoALaw; else if(formatChunk.numChannels == 2) @@ -128,8 +127,8 @@ void WavImporter::doOpenData(Containers::ArrayView data) { << "bits per sample"; return; } - } - else if(formatChunk.audioFormat == WAVE_FORMAT_MULAW) { + /* Check MULAW format */ + } else if(formatChunk.audioFormat == WAVE_FORMAT_MULAW) { if(formatChunk.numChannels == 1) _format = Buffer::Format::MonoMuLaw; else if(formatChunk.numChannels == 2) @@ -140,12 +139,12 @@ void WavImporter::doOpenData(Containers::ArrayView data) { << "bits per sample"; return; } - } - else if(formatChunk.audioFormat == WAVE_FORMAT_EXTENSIBLE) { + /* We do not currently support EXTENSIBLE formats */ + } else if(formatChunk.audioFormat == WAVE_FORMAT_EXTENSIBLE) { Error() << "Audio::WavImporter::openData(): unsupported audio format: extensible not implememented" << formatChunk.audioFormat; return; - } - else { + /* Unknown format */ + } else { Error() << "Audio::WavImporter::openData(): unsupported audio format" << formatChunk.audioFormat; return; } @@ -195,7 +194,7 @@ void WavImporter::doOpenData(Containers::ArrayView data) { CORRADE_INTERNAL_ASSERT(!Utility::Endianness::isBigEndian()); /* Copy the data */ - const char* dataChunkPtr = reinterpret_cast(++dataChunk); + const char* dataChunkPtr = reinterpret_cast(dataChunk + 1); _data = Containers::Array(dataChunkSize); std::copy(dataChunkPtr, dataChunkPtr+dataChunkSize, _data.begin()); return;