2
0
Эх сурвалжийг харах

Make all 8-bit samples unsigned, due to OpenAL convention

BearishSun 9 жил өмнө
parent
commit
b2c51bee78

+ 2 - 0
Source/BansheeOpenAudio/Include/BsOAFileReader.h

@@ -40,6 +40,8 @@ namespace BansheeEngine
 		 * @param[in]	numSamples	Number of samples to read.
 		 * @return					Number of samples that were actually read (can be less than requested if the more data
 		 *							in the stream).
+		 *
+		 * @note 8-bit sample data is returned as unsigned values, while higher bit-depth all use signed values.
 		 */
 		virtual UINT32 read(UINT8* samples, UINT32 numSamples) = 0;
 

+ 1 - 1
Source/BansheeOpenAudio/Include/BsOAOggVorbisWriter.h

@@ -20,7 +20,7 @@ namespace BansheeEngine
 
 		bool open(std::function<void(UINT8*, UINT32)> writeCallback, UINT32 sampleRate, UINT32 bitDepth, UINT32 numChannels);
 
-		void write(UINT8* samples, UINT32 numSamples); // Assumes 16-bit samples
+		void write(UINT8* samples, UINT32 numSamples); // 8-bit samples should be unsigned, but higher bit depths signed
 		void flush();
 		void close();
 

+ 7 - 1
Source/BansheeOpenAudio/Source/BsOAFLACReader.cpp

@@ -91,8 +91,11 @@ namespace BansheeEngine
 				if (data->samplesToRead > 0)
 				{
 					memcpy(data->output, &buffer[j][i], bytesPerSample);
-					data->output += bytesPerSample;
+					
+					if (bytesPerSample == 1) // Due to convention, convert 8-bit samples to unsigned
+						*data->output = (UINT8)(*(INT8*)data->output + 128);
 
+						data->output += bytesPerSample;
 					data->samplesToRead--;
 				}
 				else
@@ -100,6 +103,9 @@ namespace BansheeEngine
 					UINT8 sample[4];
 					memcpy(sample, &buffer[j][i], bytesPerSample);
 
+					if (bytesPerSample == 1) // Due to convention, convert 8-bit samples to unsigned
+						sample[0] = (UINT8)(*(INT8*)&sample[0] + 128);
+
 					for(UINT32 k = 0; k < bytesPerSample; k++)
 						data->overflow.push_back(sample[k]);
 				}

+ 6 - 6
Source/BansheeOpenAudio/Source/BsOAOggVorbisWriter.cpp

@@ -88,8 +88,8 @@ namespace BansheeEngine
 			{
 				for (UINT32 j = 0; j < mNumChannels; j++)
 				{
-					INT8 sample = *(INT8*)samples;
-					float encodedSample = sample / 127.0f;
+					UINT8 sample = *(UINT8*)samples;
+					float encodedSample = sample / 255.0f;
 					buffer[j][i] = encodedSample;
 
 					samples++;
@@ -106,7 +106,7 @@ namespace BansheeEngine
 					float encodedSample = sample / 32767.0f;
 					buffer[j][i] = encodedSample;
 
-					samples++;
+					samples += 2;
 				}
 			}
 		}
@@ -116,11 +116,11 @@ namespace BansheeEngine
 			{
 				for (UINT32 j = 0; j < mNumChannels; j++)
 				{
-					INT32 sample = (*(INT32*)samples) & 0x00FFFFFF;
+					INT32 sample = (INT32)(samples[2] << 16 | samples[1] << 8 | samples[0]);
 					float encodedSample = sample / 8388607.0f;
 					buffer[j][i] = encodedSample;
 
-					samples++;
+					samples += 3;
 				}
 			}
 		}
@@ -134,7 +134,7 @@ namespace BansheeEngine
 					float encodedSample = sample / 2147483647.0f;
 					buffer[j][i] = encodedSample;
 
-					samples++;
+					samples += 4;
 				}
 			}
 		}