Browse Source

Fixed 8-bit SoundData samples when used in a love.audio Source

Alex Szpakowski 11 years ago
parent
commit
9e6a3b8d5e
2 changed files with 11 additions and 7 deletions
  1. 10 6
      src/modules/sound/SoundData.cpp
  2. 1 1
      src/modules/sound/SoundData.h

+ 10 - 6
src/modules/sound/SoundData.cpp

@@ -52,7 +52,7 @@ SoundData::SoundData(Decoder *decoder)
 		{
 		{
 			while (bufferSize < (size_t) size + decoded)
 			while (bufferSize < (size_t) size + decoded)
 				bufferSize <<= 1;
 				bufferSize <<= 1;
-			data = (int8 *) realloc(data, bufferSize);
+			data = (uint8 *) realloc(data, bufferSize);
 		}
 		}
 
 
 		if (!data)
 		if (!data)
@@ -76,7 +76,7 @@ SoundData::SoundData(Decoder *decoder)
 
 
 	// Shrink buffer if necessary.
 	// Shrink buffer if necessary.
 	if (data && bufferSize > (size_t) size)
 	if (data && bufferSize > (size_t) size)
-		data = (int8 *) realloc(data, size);
+		data = (uint8 *) realloc(data, size);
 
 
 	channels = decoder->getChannels();
 	channels = decoder->getChannels();
 	bitDepth = decoder->getBitDepth();
 	bitDepth = decoder->getBitDepth();
@@ -139,14 +139,14 @@ void SoundData::load(int samples, int sampleRate, int bitDepth, int channels, vo
 	if (realsize > INT_MAX)
 	if (realsize > INT_MAX)
 		throw love::Exception("Data is too big!");
 		throw love::Exception("Data is too big!");
 
 
-	data = (int8 *) malloc(size);
+	data = (uint8 *) malloc(size);
 	if (!data)
 	if (!data)
 		throw love::Exception("Not enough memory.");
 		throw love::Exception("Not enough memory.");
 
 
 	if (newData)
 	if (newData)
 		memcpy(data, newData, size);
 		memcpy(data, newData, size);
 	else
 	else
-		memset(data, 0, size);
+		memset(data, bitDepth == 8 ? 128 : 0, size);
 }
 }
 
 
 void *SoundData::getData() const
 void *SoundData::getData() const
@@ -192,12 +192,14 @@ void SoundData::setSample(int i, float sample)
 
 
 	if (bitDepth == 16)
 	if (bitDepth == 16)
 	{
 	{
+		// 16-bit sample values are signed.
 		int16 *s = (int16 *) data;
 		int16 *s = (int16 *) data;
 		s[i] = (int16) (sample * (float) LOVE_INT16_MAX);
 		s[i] = (int16) (sample * (float) LOVE_INT16_MAX);
 	}
 	}
 	else
 	else
 	{
 	{
-		data[i] = (int8) (sample * (float) LOVE_INT8_MAX);
+		// 8-bit sample values are unsigned internally.
+		data[i] = (uint8) ((sample * 127.0f) + 128.0f);
 	}
 	}
 }
 }
 
 
@@ -209,12 +211,14 @@ float SoundData::getSample(int i) const
 
 
 	if (bitDepth == 16)
 	if (bitDepth == 16)
 	{
 	{
+		// 16-bit sample values are signed.
 		int16 *s = (int16 *) data;
 		int16 *s = (int16 *) data;
 		return (float) s[i] / (float) LOVE_INT16_MAX;
 		return (float) s[i] / (float) LOVE_INT16_MAX;
 	}
 	}
 	else
 	else
 	{
 	{
-		return (float) data[i] / (float) LOVE_INT8_MAX;
+		// 8-bit sample values are unsigned internally.
+		return ((float) data[i] - 128.0f) / 127.0f;
 	}
 	}
 }
 }
 
 

+ 1 - 1
src/modules/sound/SoundData.h

@@ -59,7 +59,7 @@ private:
 
 
 	void load(int samples, int sampleRate, int bitDepth, int channels, void *newData = 0);
 	void load(int samples, int sampleRate, int bitDepth, int channels, void *newData = 0);
 
 
-	int8 *data;
+	uint8 *data;
 	int size;
 	int size;
 
 
 	int sampleRate;
 	int sampleRate;