#ifndef PRIVATE_AUDIO_H
#define PRIVATE_AUDIO_H

#include "../audio.h"

#include <SDL2/SDL_audio.h>

#define STB_VORBIS_HEADER_ONLY
#include <stb_vorbis.c>
#include <xm.h>

#include <stdbool.h>
#include <stdint.h>


typedef enum audio_file_type {
    audio_file_type_ogg,
    audio_file_type_xm,
    audio_file_type_count,
    audio_file_type_unknown,
} t_audio_file_type;


union audio_context {
    struct {
        stb_vorbis *handle;
        unsigned char *data;
        int frequency;
        uint8_t channel_count;
    } vorbis;

    struct {
        xm_context_t *handle;
    } xm;
};


struct audio_channel {
    t_play_audio_args args;
    enum audio_file_type file_type;
    union audio_context context; /* interpreted by `file_type` value */
    const char *path;
    const char *name;
};


struct audio_channel_item {
    char *key;
    struct audio_channel value;
};


void audio_callback(void *userdata, uint8_t *stream, int len);

#endif
