// ampler.h #include #include #include #include typedef int8_t s8; typedef int16_t s16; typedef int32_t s32; typedef uint8_t u8; typedef uint16_t u16; typedef uint32_t u32; typedef float f32; typedef double f64; #define if if( #define while while( #define for for( #define do ) #define or || #define arraylen(a) (sizeof (a) / sizeof ((a)[0])) #define foreach_ptr(TYPE, N, ARRAY) \ for int N##_i = 0; N##_i == 0; N##_i = 1 do \ for TYPE *N = &((ARRAY)[N##_i]); N != NULL; N = NULL do \ for ; N##_i < arraylen(ARRAY); N##_i += 1, N = &((ARRAY)[N##_i]) do #define SAMPLE_RATE (44100) #define CHANNELS (2) #define FRAME_SAMPLES (SAMPLE_RATE / 60) typedef struct Sound_src Sound_src; struct Sound_src { s8 *tracks[CHANNELS]; s32 len; // in samples f32 pos; // position in samples f32 speed; // in samples, per sample, can be negative enum { SND_FREE = 0, SND_STOPPED, SND_PLAYING, SND_LOOPING, } state; }; typedef struct Udp_msg Udp_msg; struct Udp_msg { s8 text[32]; // includes null terminator enum { MSG_FREE = 0, MSG_TRIGGER, } state; }; typedef struct Ampler_state Ampler_state; struct Ampler_state { u32 size; // in bytes, off this struct SDL_AudioDeviceID playdev; Sound_src sounds[64]; s32 played_audio_last_frame; Udp_msg messages[64]; }; void udp_init(Ampler_state *); void udp_frame(Ampler_state *); void udp_quit(Ampler_state *);