#ifndef S3_TYPES_H
#define S3_TYPES_H
#include "s3/s3.h"
#include <miniaudio/miniaudio.h>
#include <stdint.h>
// extern int PDGetTotalTime();
// extern void dr_dprintf(char* fmt_string, ...);
#define MIN(a, b) ((a) < (b) ? a : b)
#define MAX(a, b) ((a) > (b) ? a : b)
// Internal typedefs
typedef float tF32;
typedef tS3_sound_source* tS3_sound_source_ptr;
typedef int tS3_sound_tag;
typedef int tS3_sound_id;
typedef int tS3_type;
typedef int tS3_repeats;
typedef int tS3_volume;
typedef int tS3_effect_tag;
typedef long tS3_priority;
typedef long tS3_pitch;
typedef long tS3_speed;
typedef struct tS3_outlet tS3_outlet;
typedef struct tS3_descriptor tS3_descriptor;
typedef struct tS3_channel tS3_channel;
typedef struct tS3_sound_source tS3_sound_source;
typedef tS3_outlet* tS3_outlet_ptr;
typedef enum tS3_error_codes {
eS3_error_none = 0,
eS3_error_digi_init = 1,
eS3_error_midi_init = 2,
eS3_error_memory = 3,
eS3_error_readfile = 4,
eS3_error_soundbank = 5,
eS3_error_bad_id = 6,
eS3_error_bad_stag = 7,
eS3_error_load_sound = 8,
eS3_error_start_sound = 9,
eS3_error_channel_alloc = 10,
eS3_error_not_spatial = 11,
eS3_error_function_failed = 12,
eS3_error_load_song = 13,
eS3_error_song_not_loaded = 14,
eS3_error_start_song = 15,
eS3_error_start_cda = 16,
eS3_error_cda_not_init = 17,
eS3_error_already_started_cda = 18,
eS3_error_nonexistant_source = 19
} tS3_error_codes;
typedef enum tS3_termination_reason {
eS3_tr_natural = 0,
eS3_tr_stopped = 1,
eS3_tr_overridden = 2
} tS3_termination_reason;
typedef enum tS3_filter_type {
eS3_filter_none = 0,
eS3_filter_reversed = 1,
eS3_filter_echo = 2
} tS3_filter_type;
typedef enum tS3_sound_type {
eS3_ST_sample = 0,
eS3_ST_midi = 1,
eS3_ST_cda = 2
} tS3_sound_type;
typedef void tS3_outlet_callback(tS3_outlet*, tS3_sound_tag, tS3_termination_reason);
typedef void tS3_sample_filter(tS3_effect_tag, tS3_sound_tag);
typedef struct tS3_channel {
int active;
int termination_reason;
int needs_service;
int repetitions;
int rate;
int spatial_sound;
unsigned int song_handle;
tS3_sound_tag tag;
tS3_type type;
tS3_volume left_volume;
tS3_volume right_volume;
float volume_multiplier;
tS3_vector3 position;
tS3_vector3 velocity;
tS3_vector3 lastpos;
tS3_volume initial_volume;
tS3_pitch initial_pitch;
float pMax_distance_squared;
tS3_outlet* owner_outlet;
tS3_descriptor* descriptor;
tS3_channel* next;
char* type_struct_sample;
char* type_struct_midi;
char* type_struct_cda;
tS3_sound_source* sound_source_ptr;
} tS3_channel;
typedef struct tS3_outlet {
int id;
int max_channels;
int independent_pitch;
tS3_channel* channel_list;
tS3_outlet* prev;
tS3_outlet* next;
tS3_outlet_callback* callback;
} tS3_outlet;
typedef struct tS3_descriptor {
tS3_sound_id id;
tS3_type type;
tS3_priority priority;
tS3_repeats repeats;
tS3_volume min_volume;
tS3_volume max_volume;
tS3_pitch min_pitch;
tS3_pitch max_pitch;
tS3_speed min_speed;
tS3_speed max_speed;
tS3_descriptor* prev;
tS3_descriptor* next;
int flags;
int midi_song_handle;
int special_fx;
int memory_proxy;
char* sound_data;
char* filename;
// win95 only
// LPDIRECTSOUNDBUFFER sound_buffer;
} tS3_descriptor;
typedef struct tS3_sound_source {
tS3_channel* channel;
int brender_vector;
void* position_ptr;
void* velocity_ptr;
tS3_outlet* bound_outlet;
tS3_sound_source* prev;
tS3_sound_source* next;
int ambient;
tS3_repeats ambient_repeats;
int time_since_last_played;
tS3_sound_id sound_id;
float max_distance_sq;
int period;
tS3_volume volume;
tS3_pitch pitch;
tS3_speed speed;
tS3_sound_tag tag;
} tS3_sound_source;
typedef struct tS3_sample {
int size;
int rate;
int resolution;
int channels;
char* dataptr;
void* freeptr;
} tS3_sample;
typedef struct tS3_hardware_info {
int device_installed;
int timer_installed;
int num_channels;
int max_resolution;
int stereo_flag;
int max_sample_rate;
int min_sample_rate;
int independent_pitch;
} tS3_hardware_info;
// Everything below added by dethrace
typedef struct tS3_soundbank_read_ctx {
int data_len;
int unk1;
int nlines;
char* data;
} tS3_soundbank_read_ctx;
#pragma pack(push, 1)
typedef struct tWAVEFORMATEX_ {
int16_t wFormatTag;
int16_t nChannels;
int32_t nSamplesPerSec;
int32_t nAvgBytesPerSec;
int16_t nBlockAlign;
int16_t wBitsPerSample;
int16_t cbSize;
} tWAVEFORMATEX_;
#pragma pack(pop)
#pragma pack(push, 1)
typedef struct wav_header {
// RIFF Header
char riff_header[4]; // Contains "RIFF"
int32_t wav_size; // Size of the wav portion of the file, which follows the first 8 bytes. File size - 8
char wave_header[4]; // Contains "WAVE"
// Format Header
char fmt_header[4]; // Contains "fmt " (includes trailing space)
int32_t fmt_chunk_size; // Should be 16 for PCM
int16_t audio_format; // Should be 1 for PCM. 3 for IEEE Float
int16_t num_channels;
int32_t sample_rate;
int32_t byte_rate; // Number of bytes per second. sample_rate * num_channels * Bytes Per Sample
int16_t sample_alignment; // num_channels * Bytes Per Sample
int16_t bit_depth; // Number of bits per sample
// Data
char data_header[4]; // Contains "data"
int32_t data_bytes; // Number of bytes in data. Number of samples * num_channels * sample byte size
} wav_header;
#pragma pack(pop)
#endif