51 lines
1.5 KiB
C
51 lines
1.5 KiB
C
/*
|
|
// Created by bruno on 16.2.2025.
|
|
*/
|
|
|
|
#include "audio.h"
|
|
|
|
AudioData audioData;
|
|
|
|
void audio_callback(void *userdata, Uint8 *stream, int len) {
|
|
AudioData *audio = (AudioData *) userdata;
|
|
int samples = len / sizeof(float);
|
|
|
|
for (int i = 0; i < samples; i++) {
|
|
float mix = 0.0f;
|
|
int activeVoices = 0;
|
|
|
|
for (int v = 0; v < NUM_SYNTH_VOICES; v++) {
|
|
SynthVoice *voice = &audio->synthVoices[v];
|
|
if (voice->volume == 0 || voice->frequency == 0) continue;
|
|
|
|
float sample = 0.0f;
|
|
float t = (float) voice->phase / 255.0f * 2.0f - 1.0f;
|
|
|
|
switch (voice->waveform) {
|
|
default:
|
|
case WAVE_SINE:
|
|
sample = sinf(voice->phase * 2.0f * M_PI / 256.0f);
|
|
break;
|
|
case WAVE_SQUARE:
|
|
sample = (t >= 0.0f) ? 1.0f : -1.0f;
|
|
break;
|
|
case WAVE_SAWTOOTH:
|
|
sample = t;
|
|
break;
|
|
case WAVE_TRIANGLE:
|
|
sample = (t < 0) ? -t : t;
|
|
break;
|
|
case WAVE_NOISE:
|
|
sample = ((float) rand() / RAND_MAX) * 2.0f - 1.0f;
|
|
break;
|
|
}
|
|
|
|
voice->phase += (uint8_t) ((voice->frequency * 256) / SAMPLE_RATE);
|
|
mix += sample * (voice->volume / 255.0f);
|
|
activeVoices++;
|
|
}
|
|
|
|
((float *) stream)[i] = (activeVoices > 0) ? mix / activeVoices : 0.0f;
|
|
}
|
|
}
|