Bläddra i källkod

Fixing Vorbis, FLAC and WAVE importers
Added support for extended WAVE format

BearishSun 9 år sedan
förälder
incheckning
8cfecdfd68

+ 2 - 0
Source/BansheeOpenAudio/Source/BsOAFLACReader.cpp

@@ -169,6 +169,8 @@ namespace BansheeEngine
 		if (stream == nullptr)
 		if (stream == nullptr)
 			return false;
 			return false;
 
 
+		stream->seek(0);
+
 		mDecoder = FLAC__stream_decoder_new();
 		mDecoder = FLAC__stream_decoder_new();
 		if (mDecoder == nullptr)
 		if (mDecoder == nullptr)
 		{
 		{

+ 2 - 1
Source/BansheeOpenAudio/Source/BsOAOggVorbisReader.cpp

@@ -67,6 +67,7 @@ namespace BansheeEngine
 		if (stream == nullptr)
 		if (stream == nullptr)
 			return false;
 			return false;
 
 
+		stream->seek(0);
 		mStream = stream;
 		mStream = stream;
 
 
 		int status = ov_open_callbacks(stream.get(), &mOggVorbisFile, nullptr, 0, callbacks);
 		int status = ov_open_callbacks(stream.get(), &mOggVorbisFile, nullptr, 0, callbacks);
@@ -102,7 +103,7 @@ namespace BansheeEngine
 			{
 			{
 				UINT32 samplesRead = bytesRead / sizeof(INT16);
 				UINT32 samplesRead = bytesRead / sizeof(INT16);
 				numReadSamples += samplesRead;
 				numReadSamples += samplesRead;
-				samples += samplesRead;
+				samples += samplesRead * sizeof(INT16);
 			}
 			}
 			else
 			else
 				break;
 				break;

+ 35 - 7
Source/BansheeOpenAudio/Source/BsOAWaveReader.cpp

@@ -5,6 +5,9 @@
 
 
 namespace BansheeEngine
 namespace BansheeEngine
 {
 {
+#define WAVE_FORMAT_PCM			0x0001
+#define WAVE_FORMAT_EXTENDED	0xFFFE
+
 	OAWaveReader::OAWaveReader()
 	OAWaveReader::OAWaveReader()
 		:mDataOffset(0), mBytesPerSample(0)
 		:mDataOffset(0), mBytesPerSample(0)
 	{ }
 	{ }
@@ -69,7 +72,7 @@ namespace BansheeEngine
 				if (mStream->read(&format, sizeof(format)) != sizeof(format))
 				if (mStream->read(&format, sizeof(format)) != sizeof(format))
 					return false;
 					return false;
 
 
-				if (format != 1) // It's not PCM
+				if (format != WAVE_FORMAT_PCM && format != WAVE_FORMAT_EXTENDED)
 				{
 				{
 					LOGWRN("Wave file doesn't contain raw PCM data. Not supported.");
 					LOGWRN("Wave file doesn't contain raw PCM data. Not supported.");
 					return false;
 					return false;
@@ -105,15 +108,40 @@ namespace BansheeEngine
 					return false;
 					return false;
 				}
 				}
 
 
-				mBytesPerSample = bitDepth / 8;
-
-				// Skip extra data, if any
-				if (subChunkSize > 16)
+				// Read extension data, and get the actual format
+				if(format == WAVE_FORMAT_EXTENDED)
 				{
 				{
-					mStream->skip(subChunkSize - 16);
-					if (mStream->eof())
+					UINT16 extensionSize = 0;
+					if (mStream->read(&extensionSize, sizeof(extensionSize)) != sizeof(extensionSize))
+						return false;
+
+					if(extensionSize != 22)
+					{
+						LOGWRN("Wave file doesn't contain raw PCM data. Not supported.");
+						return false;
+					}
+
+					UINT16 validBitDepth = 0;
+					if (mStream->read(&validBitDepth, sizeof(validBitDepth)) != sizeof(validBitDepth))
 						return false;
 						return false;
+
+					UINT32 channelMask = 0;
+					if (mStream->read(&channelMask, sizeof(channelMask)) != sizeof(channelMask))
+						return false;
+
+					UINT8 subFormat[16];
+					if (mStream->read(subFormat, sizeof(subFormat)) != sizeof(subFormat))
+						return false;
+
+					memcpy(&format, subFormat, sizeof(format));
+					if (format != WAVE_FORMAT_PCM)
+					{
+						LOGWRN("Wave file doesn't contain raw PCM data. Not supported.");
+						return false;
+					}
 				}
 				}
+
+				mBytesPerSample = bitDepth / 8;
 			}
 			}
 			// DATA chunk
 			// DATA chunk
 			else if (subChunkId[0] == 'd' && subChunkId[1] == 'a' && subChunkId[2] == 't' && subChunkId[3] == 'a')
 			else if (subChunkId[0] == 'd' && subChunkId[1] == 'a' && subChunkId[2] == 't' && subChunkId[3] == 'a')