aboutsummaryrefslogtreecommitdiff
path: root/src/messages.h
diff options
context:
space:
mode:
authorspl3g <spleefer6@yandex.ru>2025-10-10 17:56:48 +0300
committerspl3g <spleefer6@yandex.ru>2025-10-10 21:56:51 +0300
commit6e79fee0171f41a06389cfed19e050785fd33b93 (patch)
tree3b15ae776e02cb5061a1604738c0d4b3db3687e1 /src/messages.h
parent75427da62eb579374d4b139084cc48e042830f21 (diff)
Move out the message queue
Diffstat (limited to 'src/messages.h')
-rw-r--r--src/messages.h86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/messages.h b/src/messages.h
new file mode 100644
index 0000000..6dc0d44
--- /dev/null
+++ b/src/messages.h
@@ -0,0 +1,86 @@
+#ifndef MESSAGE_QUEUE_H_
+#define MESSAGE_QUEUE_H_
+
+#include <stddef.h>
+#include <pthread.h>
+
+#define MESSAGE_QUEUE_SIZE 128
+
+typedef enum {
+ PARAM_OSC,
+ PARAM_VOLUME,
+
+ PARAM_ATTACK,
+ PARAM_DECAY,
+ PARAM_SUSTAIN,
+ PARAM_RELEASE,
+} param_type;
+
+typedef enum {
+ OSC_SINE,
+ OSC_SAW,
+ OSC_SQUARE,
+ OSC_TRIANGLE,
+} oscilator_type;
+
+typedef enum {
+ MSG_NOTE_ON,
+ MSG_NOTE_OFF,
+ MSG_ALL_NOTES_OFF,
+ MSG_PARAM_CHANGE,
+ MSG_STOP,
+} synth_message_type;
+
+typedef struct {
+ synth_message_type type;
+
+ union {
+ // NOTE_ON / NOTE_OFF
+ struct {
+ size_t note_id;
+ } note;
+
+ // SET_PARAM;
+ struct {
+ param_type param_type;
+ float value;
+ } param_change;
+ };
+} synth_message;
+
+typedef struct {
+ synth_message buffer[MESSAGE_QUEUE_SIZE];
+ size_t head;
+ size_t tail;
+ pthread_mutex_t lock;
+} message_queue;
+
+int mqueue_get(message_queue *q, synth_message *msg);
+int mqueue_push(message_queue *q, synth_message msg);
+int mqueue_push_many(message_queue *q, synth_message *msg, size_t count);
+
+#define mqueue_init(q) \
+ do { \
+ (q)->head = (q)->tail = 0; \
+ pthread_mutex_init(&(q)->lock, NULL); \
+ } while (0)
+
+/* #define mqueue_get(q, msg, ok) \ */
+/* do { \ */
+/* pthread_mutex_lock(&(q)->lock); \ */
+/* if ((q)->tail == (q)->head) { \ */
+/* pthread_mutex_unlock(&(q)->lock); \ */
+/* *(ok) = false;\ */
+/* break; \ */
+/* } \ */
+/* \ */
+/* *(msg) = (q)->buffer[(q)->tail]; \ */
+/* (q)->tail = ((q)->tail + 1) % MESSAGE_QUEUE_SIZE; \ */
+/* \ */
+/* pthread_mutex_unlock(&(q)->lock); \ */
+/* *(ok) = true; \ */
+/* } while (0) */
+
+#define mqueue_empty(q) (q)->head == (q)->tail
+
+#endif // MESSAGE_QUEUE_H_