Fix to reading multi-channel wav files
diff --git a/wave.c b/wave.c
index 1d1c61e..1b5cd00 100644
--- a/wave.c
+++ b/wave.c
@@ -99,29 +99,34 @@
int maxSamples)
{
SNDFILE *soundFile = file->soundFile;
- float value;
+ int value;
short *values;
int samplesRead;
int numChannels = file->numChannels;
int i, j;
- if(maxSamples > file->numValues) {
- file->numValues = maxSamples;
- file->values = (short *)realloc(file->values, maxSamples*sizeof(short));
+ if(maxSamples*numChannels > file->numValues) {
+ file->numValues = maxSamples*numChannels;
+ file->values = (short *)realloc(file->values, file->numValues*sizeof(short));
}
values = file->values;
- samplesRead = sf_read_short(soundFile, values, maxSamples);
+ samplesRead = sf_read_short(soundFile, values, maxSamples*numChannels);
if(samplesRead <= 0) {
return 0;
}
samplesRead /= numChannels;
if(numChannels > 1) {
for(i = 0; i < samplesRead; i++) {
- value = 0.0f;
+ value = 0;
for(j = 0; j < numChannels; j++) {
value += values[i*numChannels + j];
}
- buffer[i] = (short)(value/(numChannels*32768.0f) + 0.5);
+ if(value >= 0) {
+ buffer[i] = value/numChannels;
+ } else {
+ /* On some OSes, dividing a negative number rounds the wrong way */
+ buffer[i] = -(-value/numChannels);
+ }
}
} else {
memcpy(buffer, values, samplesRead*sizeof(short));