/*
* melisma - extensible and scriptable audio engine
* Copyright (C) 2026 Ludvig Gunne Lindström
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifndef MELISMA_H_INCLUDED
#define MELISMA_H_INCLUDED
#include
#include
#include
#define MELISMA_VERSION "0.1.0"
#define ml_check_version() ml__check_version(MELISMA_VERSION)
void ml__check_version(const char *s);
/* Lua metatable tags for builtin types */
#define MELISMA_NODE_TYPENAME "node"
#define MELISMA_INPUT_CHANNEL_TYPENAME "input channel"
#define MELISMA_OUTPUT_CHANNEL_TYPENAME "output channel"
/* Structure passed to each nodes processing function */
struct ml_proc_args
{
/* Implementation specific data */
void *userp;
/* Number of frames to process */
size_t nframes;
/* Number of input buffers */
size_t icnt;
/* Number of output buffers */
size_t ocnt;
/* List of input buffers */
float *const *in;
/* List of output buffers */
float **out;
};
typedef struct ml_proc_args ml_proc_args;
/* A node in the audio graph */
typedef struct ml_node ml_node;
/* An input/output channel of a node */
typedef struct ml_channel ml_channel;
/* Processing function called for each active node */
typedef void (*ml_proc_fn)(const ml_proc_args*);
/* Handler for pending IO operations */
typedef void (*ml_io_handler)(int,int,void*);
/* Create a new node */
ml_node *ml_create_node(ml_proc_fn proc, void *userp);
/* Add a label to a node */
#ifdef __GNUC__
__attribute__((format(printf,2,3)))
#endif
void ml_label_node(ml_node *node, const char *fmt, ...);
/* Get a pointer to the root node in the audio graph */
ml_node *ml_get_root_node(void);
/* Get the user data pointer from a node */
void *ml_get_userp(ml_node *node);
/* Add an input channel to a node */
ml_channel *ml_add_input(ml_node *node);
/* Add an output channel to a node */
ml_channel *ml_add_output(ml_node *node);
/* Get a node input channel by index */
ml_channel *ml_get_input(ml_node *node, size_t i);
/* Get a node output channel by index */
ml_channel *ml_get_output(ml_node *node, size_t i);
/* Get the number of input channels for a node */
size_t ml_num_inputs(ml_node *node);
/* Get the number of output channels for a node */
size_t ml_num_outputs(ml_node *node);
/* Connect two channels */
void ml_connect(ml_channel *src, ml_channel *dst);
/* Get the current sample rate */
unsigned long ml_sample_rate(void);
/* Install a new IO handler for the given file descriptor.
* Flags are a combination of POLLIN, POLLOUT etc. */
void ml_add_io_handler(int fd, int flags, ml_io_handler hdl, void *args);
/* Remove a previously installed IO handler */
void ml_remove_io_handler(int fd);
typedef long ml_event_id;
typedef struct
{
ml_event_id id;
unsigned long seq;
} ml_event_handle;
/* Schedule an event from a Lua C function, t samples from the end
* of the current processing window. */
ml_event_handle ml_schedule_event(unsigned long t, int fn, int arg);
/* Cancel a scheduled event from a Lua C function. */
void ml_cancel_event(const ml_event_handle *hdl);
#endif