summaryrefslogtreecommitdiff
path: root/synth.c
diff options
context:
space:
mode:
authorMitja Felicijan <mitja.felicijan@gmail.com>2024-10-09 03:12:15 +0200
committerMitja Felicijan <mitja.felicijan@gmail.com>2024-10-09 03:12:15 +0200
commitcf2cfcd8a96921dbe812647045dff71ab63989cd (patch)
treeab097af301e539254b42dd5a4c1faf42a321e6df /synth.c
parentc05e271a0507231eaf131930b5b9711ef85ae4a8 (diff)
downloadttdaw-cf2cfcd8a96921dbe812647045dff71ab63989cd.tar.gz
Added synth thread that plays a simple note
Diffstat (limited to 'synth.c')
-rw-r--r--synth.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/synth.c b/synth.c
new file mode 100644
index 0000000..d391056
--- /dev/null
+++ b/synth.c
@@ -0,0 +1,67 @@
+#include <stdio.h>
+#include <unistd.h>
+
+#include "synth.h"
+#include "minisdl_audio.h"
+
+#define TSF_IMPLEMENTATION
+#include "tsf.h"
+
+static tsf* g_TinySoundFont;
+static SDL_mutex* g_Mutex;
+
+// Render the audio samples in float format.
+static void AudioCallback(void* data, Uint8 *stream, int len) {
+ int SampleCount = (len / (2 * sizeof(float))); // 2 output channels.
+ SDL_LockMutex(g_Mutex); // Get exclusive lock.
+ tsf_render_float(g_TinySoundFont, (float*)stream, SampleCount, 0);
+ SDL_UnlockMutex(g_Mutex);
+}
+
+void *synth(void *arg) {
+ SynthArgs* args = (SynthArgs*)arg;
+
+ SDL_AudioSpec OutputAudioSpec;
+ OutputAudioSpec.freq = 44100;
+ OutputAudioSpec.format = AUDIO_F32;
+ OutputAudioSpec.channels = 2;
+ OutputAudioSpec.samples = 4096;
+ OutputAudioSpec.callback = AudioCallback;
+
+ // Initialize the audio system.
+ if (SDL_AudioInit(TSF_NULL) < 0) {
+ fprintf(stderr, "Could not initialize audio hardware or driver\n");
+ exit(1);
+ }
+
+ // Load the SoundFont from a file.
+ g_TinySoundFont = tsf_load_filename(args->soundfont_file);
+ if (!g_TinySoundFont) {
+ fprintf(stderr, "Could not load SoundFont\n");
+ exit(1);
+ }
+
+ // Set the SoundFont rendering output mode.
+ tsf_set_output(g_TinySoundFont, TSF_STEREO_INTERLEAVED, OutputAudioSpec.freq, 0);
+
+ // Create the mutex.
+ g_Mutex = SDL_CreateMutex();
+
+ // Request the desired audio output format.
+ if (SDL_OpenAudio(&OutputAudioSpec, TSF_NULL) < 0) {
+ fprintf(stderr, "Could not open the audio hardware or the desired audio output format\n");
+ exit(1);
+ }
+
+ SDL_PauseAudio(0);
+
+ while (1) {
+ sleep(1);
+
+ SDL_LockMutex(g_Mutex);
+ tsf_note_off(g_TinySoundFont, 1, 50);
+ tsf_note_on(g_TinySoundFont, 1, 50, 1.0f);
+ SDL_UnlockMutex(g_Mutex);
+ }
+}
+