aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRay <raysan5@gmail.com>2016-09-09 01:34:30 +0200
committerRay <raysan5@gmail.com>2016-09-09 01:34:30 +0200
commit94142ecce53d2eae42fa60bc609c2d8f6248160e (patch)
treef25a19fc60a64eef51addd596d45a116a7ba90e2 /src
parent0c58c1198f51c8c8799490bbb6f1b224a43278b2 (diff)
downloadraylib-94142ecce53d2eae42fa60bc609c2d8f6248160e.tar.gz
raylib-94142ecce53d2eae42fa60bc609c2d8f6248160e.zip
Some more work on audio...
Diffstat (limited to 'src')
-rw-r--r--src/audio.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/src/audio.c b/src/audio.c
index 7ef5afe1..fa18f7c8 100644
--- a/src/audio.c
+++ b/src/audio.c
@@ -535,6 +535,7 @@ void SetSoundPitch(Sound sound, float pitch)
}
// Convert wave data to desired format
+// TODO: Consider channels (mono - stereo)
void WaveFormat(Wave *wave, int sampleRate, int sampleSize, int channels)
{
if (wave->sampleSize != sampleSize)
@@ -542,8 +543,12 @@ void WaveFormat(Wave *wave, int sampleRate, int sampleSize, int channels)
float *samples = GetWaveData(*wave); //Color *pixels = GetImageData(*image);
free(wave->data);
+
+ wave->sampleSize = sampleSize;
- //image->format = newFormat;
+ //sample *= 4.0f; // Arbitrary gain to get reasonable output volume...
+ //if (sample > 1.0f) sample = 1.0f;
+ //if (sample < -1.0f) sample = -1.0f;
if (sampleSize == 8)
{
@@ -551,7 +556,7 @@ void WaveFormat(Wave *wave, int sampleRate, int sampleSize, int channels)
for (int i = 0; i < wave->sampleCount; i++)
{
- ((unsigned char *)wave->data)[i] = (unsigned char)((float)samples[i]); // TODO: review conversion
+ ((unsigned char *)wave->data)[i] = (unsigned char)((float)samples[i]*127 + 128);
}
}
else if (sampleSize == 16)
@@ -560,7 +565,7 @@ void WaveFormat(Wave *wave, int sampleRate, int sampleSize, int channels)
for (int i = 0; i < wave->sampleCount; i++)
{
- ((short *)wave->data)[i] = (short)((float)samples[i]); // TODO: review conversion
+ ((short *)wave->data)[i] = (short)((float)samples[i]*32000); // SHRT_MAX = 32767
}
}
else if (sampleSize == 32)
@@ -569,13 +574,17 @@ void WaveFormat(Wave *wave, int sampleRate, int sampleSize, int channels)
for (int i = 0; i < wave->sampleCount; i++)
{
- ((float *)wave->data)[i] = (float)samples[i]; // TODO: review conversion
+ ((float *)wave->data)[i] = (float)samples[i];
}
}
else TraceLog(WARNING, "Wave formatting: Sample size not supported");
}
- // TODO: Consider channels (mono vs stereo)
+ // NOTE: Only supported 1 or 2 channels (mono or stereo)
+ if ((channels > 0) && (channels < 3) && (wave->channels != channels))
+ {
+ // TODO: Add/remove channels interlaced data if required...
+ }
}
// Copy a wave to a new wave
@@ -626,15 +635,16 @@ void WaveCrop(Wave *wave, int initSample, int finalSample)
}
// Get samples data from wave as a floats array
+// NOTE: Returned sample values are normalized to range [-1..1]
float *GetWaveData(Wave wave)
{
float *samples = (float *)malloc(wave.sampleCount*sizeof(float));
for (int i = 0; i < wave.sampleCount; i++)
{
- if (wave.sampleSize == 8) samples[i] = (float)((unsigned char *)wave.data)[i]; // TODO: review conversion
- else if (wave.sampleSize == 16) samples[i] = (float)((short *)wave.data)[i]; // TODO: review conversion
- else if (wave.sampleSize == 32) samples[i] = ((float *)wave.data)[i]; // TODO: review conversion
+ if (wave.sampleSize == 8) samples[i] = (float)(((unsigned char *)wave.data)[i] - 127)/256.0f;
+ else if (wave.sampleSize == 16) samples[i] = (float)((short *)wave.data)[i]/32767.0f;
+ else if (wave.sampleSize == 32) samples[i] = ((float *)wave.data)[i];
}
return samples;