126 lines
2.5 KiB
C
126 lines
2.5 KiB
C
////////////////////////////////
|
|
//~ Track types
|
|
|
|
typedef u32 MIX_TrackFlag; enum
|
|
{
|
|
MIX_TrackFlag_None = 0,
|
|
MIX_TrackFlag_Spatialize = (1 << 0)
|
|
};
|
|
|
|
Struct(MIX_Handle)
|
|
{
|
|
u64 gen;
|
|
void *data;
|
|
};
|
|
|
|
Struct(MIX_TrackDesc)
|
|
{
|
|
MIX_TrackFlag flags;
|
|
f32 volume; /* 0 -> 1.0+ */
|
|
f32 speed; /* 0 -> 1.0+ */
|
|
b32 looping;
|
|
|
|
/* MIX_TrackFlag_Spatialize */
|
|
Vec2 pos;
|
|
};
|
|
#define M_TRACKDESC(...) ((MIX_TrackDesc) { \
|
|
.flags = 0, \
|
|
.volume = 1.0, \
|
|
.speed = 1.0, \
|
|
.looping = 0, \
|
|
.pos = VEC2(0, 0), \
|
|
__VA_ARGS__ \
|
|
})
|
|
|
|
////////////////////////////////
|
|
//~ Mix types
|
|
|
|
/* Stereo mix of 32 bit float samples */
|
|
Struct(MIX_PcmF32)
|
|
{
|
|
u64 count;
|
|
f32 *samples;
|
|
};
|
|
|
|
Struct(MIX_EffectData)
|
|
{
|
|
/* Spatialization */
|
|
f32 spatial_volume;
|
|
f32 spatial_pan;
|
|
};
|
|
|
|
Struct(MIX_MixData)
|
|
{
|
|
MIX_Handle track_handle;
|
|
b32 track_finished;
|
|
|
|
MIX_TrackDesc desc;
|
|
MIX_EffectData effect_data;
|
|
SND_Sound *source;
|
|
u64 source_pos;
|
|
};
|
|
|
|
Struct(MIX_Track){
|
|
u64 gen;
|
|
|
|
/* Controlled via interface */
|
|
SND_Sound *sound;
|
|
MIX_TrackDesc desc;
|
|
|
|
/* Internal */
|
|
MIX_MixData mix;
|
|
|
|
MIX_Track *next;
|
|
MIX_Track *prev;
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ Shared state
|
|
|
|
Struct(MIX_SharedState)
|
|
{
|
|
P_Mutex mutex;
|
|
|
|
/* Listener */
|
|
Vec2 listener_pos;
|
|
Vec2 listener_dir;
|
|
|
|
/* Track list */
|
|
Arena *track_arena;
|
|
MIX_Track *track_first_playing;
|
|
MIX_Track *track_last_playing;
|
|
u64 track_playing_count;
|
|
MIX_Track *track_first_free;
|
|
};
|
|
|
|
extern MIX_SharedState M_shared_state;
|
|
|
|
////////////////////////////////
|
|
//~ Startup
|
|
|
|
Struct(MIX_StartupReceipt) { i32 _; };
|
|
MIX_StartupReceipt MIX_Startup(void);
|
|
|
|
////////////////////////////////
|
|
//~ Track operations
|
|
|
|
MIX_Handle MIX_HandleFromTrack(MIX_Track *track);
|
|
MIX_Track *MIX_TrackFromHandle(MIX_Handle handle);
|
|
MIX_Track *MIX_AllocTrackLocked(P_Lock *lock, SND_Sound *sound);
|
|
void MIX_ReleaseTrackLocked(P_Lock *lock, MIX_Track *track);
|
|
|
|
////////////////////////////////
|
|
//~ Mixer state operations
|
|
|
|
MIX_Handle MIX_PlaySound(SND_Sound *sound);
|
|
MIX_Handle MIX_PlaySoundEx(SND_Sound *sound, MIX_TrackDesc desc);
|
|
MIX_TrackDesc MIX_TrackDescFromHandle(MIX_Handle handle);
|
|
void MIX_UpdateTrack(MIX_Handle handle, MIX_TrackDesc desc);
|
|
void MIX_UpdateListener(Vec2 pos, Vec2 dir);
|
|
|
|
////////////////////////////////
|
|
//~ Mixer update
|
|
|
|
i16 MIX_SampleSound(SND_Sound *sound, u64 sample_pos, b32 wrap);
|
|
MIX_PcmF32 MIX_MixAllTracks(Arena *arena, u64 frame_count);
|