Browse Source

WavAudioImporter: a file with zero samples is not an error.

pull/343/head
Vladimír Vondruš 7 years ago
parent
commit
ffd04e96eb
  1. 2
      src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt
  2. 14
      src/MagnumPlugins/WavAudioImporter/Test/WavImporterTest.cpp
  3. BIN
      src/MagnumPlugins/WavAudioImporter/Test/zeroSamples.wav
  4. 10
      src/MagnumPlugins/WavAudioImporter/WavImporter.cpp
  5. 3
      src/MagnumPlugins/WavAudioImporter/WavImporter.h

2
src/MagnumPlugins/WavAudioImporter/Test/CMakeLists.txt

@ -58,6 +58,8 @@ corrade_add_test(WavAudioImporterTest WavImporterTest.cpp
invalidDataChunk.wav invalidDataChunk.wav
invalidFactChunk.wav invalidFactChunk.wav
zeroSamples.wav
mono4.wav mono4.wav
mono8.wav mono8.wav
mono8junk.wav mono8junk.wav

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

@ -50,6 +50,8 @@ struct WavImporterTest: TestSuite::Tester {
void invalidDataChunk(); void invalidDataChunk();
void invalidFactChunk(); void invalidFactChunk();
void zeroSamples();
void mono4(); void mono4();
void mono8(); void mono8();
void mono8junk(); void mono8junk();
@ -88,6 +90,8 @@ WavImporterTest::WavImporterTest() {
&WavImporterTest::invalidDataChunk, &WavImporterTest::invalidDataChunk,
&WavImporterTest::invalidFactChunk, &WavImporterTest::invalidFactChunk,
&WavImporterTest::zeroSamples,
&WavImporterTest::mono4, &WavImporterTest::mono4,
&WavImporterTest::mono8, &WavImporterTest::mono8,
&WavImporterTest::mono8junk, &WavImporterTest::mono8junk,
@ -195,6 +199,16 @@ void WavImporterTest::invalidFactChunk() {
TestSuite::Compare::Container<Containers::ArrayView<const char>>); TestSuite::Compare::Container<Containers::ArrayView<const char>>);
} }
void WavImporterTest::zeroSamples() {
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("WavAudioImporter");
/* No error should happen, it should just give an empty buffer back */
CORRADE_VERIFY(importer->openFile(Utility::Directory::join(WAVAUDIOIMPORTER_TEST_DIR, "zeroSamples.wav")));
CORRADE_COMPARE(importer->format(), BufferFormat::Mono16);
CORRADE_COMPARE(importer->frequency(), 22050);
CORRADE_VERIFY(importer->data().empty());
}
void WavImporterTest::mono4() { void WavImporterTest::mono4() {
std::ostringstream out; std::ostringstream out;
Error redirectError{&out}; Error redirectError{&out};

BIN
src/MagnumPlugins/WavAudioImporter/Test/zeroSamples.wav

Binary file not shown.

10
src/MagnumPlugins/WavAudioImporter/WavImporter.cpp

@ -45,7 +45,7 @@ WavImporter::WavImporter(PluginManager::AbstractManager& manager, const std::str
auto WavImporter::doFeatures() const -> Features { return Feature::OpenData; } auto WavImporter::doFeatures() const -> Features { return Feature::OpenData; }
bool WavImporter::doIsOpened() const { return _data; } bool WavImporter::doIsOpened() const { return !!_data; }
void WavImporter::doOpenData(Containers::ArrayView<const char> data) { void WavImporter::doOpenData(Containers::ArrayView<const char> data) {
/* Check file size */ /* Check file size */
@ -213,19 +213,19 @@ void WavImporter::doOpenData(Containers::ArrayView<const char> data) {
/* Copy the data */ /* Copy the data */
const char* dataChunkPtr = reinterpret_cast<const char*>(dataChunk + 1); const char* dataChunkPtr = reinterpret_cast<const char*>(dataChunk + 1);
_data = Containers::Array<char>(dataChunkSize); _data = Containers::Array<char>(dataChunkSize);
std::copy(dataChunkPtr, dataChunkPtr+dataChunkSize, _data.begin()); std::copy(dataChunkPtr, dataChunkPtr+dataChunkSize, _data->begin());
return; return;
} }
void WavImporter::doClose() { _data = nullptr; } void WavImporter::doClose() { _data = Containers::NullOpt; }
BufferFormat WavImporter::doFormat() const { return _format; } BufferFormat WavImporter::doFormat() const { return _format; }
UnsignedInt WavImporter::doFrequency() const { return _frequency; } UnsignedInt WavImporter::doFrequency() const { return _frequency; }
Containers::Array<char> WavImporter::doData() { Containers::Array<char> WavImporter::doData() {
Containers::Array<char> copy(_data.size()); Containers::Array<char> copy(_data->size());
std::copy(_data.begin(), _data.end(), copy.begin()); std::copy(_data->begin(), _data->end(), copy.begin());
return copy; return copy;
} }

3
src/MagnumPlugins/WavAudioImporter/WavImporter.h

@ -31,6 +31,7 @@
*/ */
#include <Corrade/Containers/Array.h> #include <Corrade/Containers/Array.h>
#include <Corrade/Containers/Optional.h>
#include "Magnum/Audio/AbstractImporter.h" #include "Magnum/Audio/AbstractImporter.h"
@ -102,7 +103,7 @@ class MAGNUM_WAVAUDIOIMPORTER_EXPORT WavImporter: public AbstractImporter {
MAGNUM_WAVAUDIOIMPORTER_LOCAL UnsignedInt doFrequency() const override; MAGNUM_WAVAUDIOIMPORTER_LOCAL UnsignedInt doFrequency() const override;
MAGNUM_WAVAUDIOIMPORTER_LOCAL Containers::Array<char> doData() override; MAGNUM_WAVAUDIOIMPORTER_LOCAL Containers::Array<char> doData() override;
Containers::Array<char> _data; Containers::Optional<Containers::Array<char>> _data;
BufferFormat _format; BufferFormat _format;
UnsignedInt _frequency; UnsignedInt _frequency;
}; };

Loading…
Cancel
Save