#ifndef MIXER_H
#define MIXER_H

struct sound;

#define MIXER_FLAG_NONE         0x0
#define MIXER_FLAG_SPATIALIZE   0x1

#define MIXER_DESC(...) ((struct mixer_desc) { \
    .flags      = 0, \
\
    .volume     = 1.0, \
    .speed      = 1.0, \
    .looping    = false, \
\
    .pos        = V2(0, 0), \
\
    __VA_ARGS__ \
})
struct mixer_desc {
    u32 flags;
    f32 volume;     /* 0 -> 1.0+ */
    f32 speed;      /* 0 -> 1.0+ */
    b32 looping;

    /* MIXER_FLAG_SPATIALIZE */
    struct v2 pos;
};

struct mixer_track_handle {
    u64 gen;
    void *data;
};

/* Stereo mix of 32 bit float samples */
struct mixed_pcm_f32 {
    u64 count;
    f32 *samples;
};

struct mixer_startup_receipt { i32 _; };
struct mixer_startup_receipt mixer_startup(void);

/* Interface */
struct mixer_track_handle mixer_play(struct sound *sound);
struct mixer_track_handle mixer_play_ex(struct sound *sound, struct mixer_desc desc);
struct mixer_desc mixer_track_get(struct mixer_track_handle handle);
void mixer_track_set(struct mixer_track_handle handle, struct mixer_desc desc);
void mixer_set_listener(struct v2 pos, struct v2 dir);

/* Mixing */
struct mixed_pcm_f32 mixer_update(struct arena *arena, u64 frame_request_count);
void mixer_advance(u64 frames_written_count);

#endif
