#ifndef SF64_AUDIO_EXTERNAL_H
#define SF64_AUDIO_EXTERNAL_H

#include "sys.h"
#include "audioseq_cmd.h"
#include "sfx.h"
#include "bgm.h"

void Audio_PlayVoice(s32 msgId);
void Audio_PlayVoiceWithoutBGM(u32 msgId);
void Audio_ClearVoice(void);
s32 Audio_GetCurrentVoice(void);
s32 Audio_GetCurrentVoiceStatus(void);
void Audio_SetUnkVoiceParam(u8 unkVoiceParam);

u8* Audio_UpdateFrequencyAnalysis(void);
void Audio_SetVolume(u8 audioType, u8 volume);
void Audio_FadeOutAll(u8 fadeoutTime);
void Audio_SetAudioSpec(u8 unused, u16 specParam);

#define AUDIO_SET_SPEC(sfxLayout, spec) Audio_SetAudioSpec(0, ((sfxLayout) << 8) | (spec))
#define AUDIO_SET_SPEC_ALT(sfxLayout, spec) Audio_SetAudioSpec((sfxLayout), ((sfxLayout) << 8) | (spec))

// used by sys or related
void AudioLoad_Init(void);
void Audio_dummy_80016A50(void);
void Audio_InitSounds(void);
void Audio_Update(void);
SPTask* AudioThread_CreateTask(void);
void AudioThread_PreNMIReset(void);

typedef enum AudioType {
    /* 0 */ AUDIO_TYPE_MUSIC,
    /* 1 */ AUDIO_TYPE_VOICE,
    /* 2 */ AUDIO_TYPE_SFX,
    /* 3 */ AUDIO_TYPE_MAX,
} AudioType;

typedef enum {
    /* 0 */ SOUNDMODE_STEREO,
    /* 1 */ SOUNDMODE_HEADSET,
    /* 2 */ SOUNDMODE_SURROUND,
    /* 3 */ SOUNDMODE_MONO
} SoundMode;

typedef enum OptionSoundMode {
    /* 0 */ OPTIONSOUND_STEREO,
    /* 1 */ OPTIONSOUND_MONO,
    /* 2 */ OPTIONSOUND_HEADSET,
    /* 3 */ OPTIONSOUND_MAX,
} OptionSoundMode;

typedef enum {
    /* 0 */ SFXCHAN_0,
    /* 1 */ SFXCHAN_1,
    /* 2 */ SFXCHAN_2,
    /* 3 */ SFXCHAN_3
} SfxChannelLayout;

typedef enum {
    /*  0 */ AUDIOSPEC_CO,
    /*  1 */ AUDIOSPEC_ME,
    /*  2 */ AUDIOSPEC_TI,
    /*  3 */ AUDIOSPEC_SX,
    /*  4 */ AUDIOSPEC_ZO,
    /*  5 */ AUDIOSPEC_A6,
    /*  6 */ AUDIOSPEC_6,
    /*  7 */ AUDIOSPEC_SY,
    /*  8 */ AUDIOSPEC_FO,
    /*  9 */ AUDIOSPEC_SO,
    /* 10 */ AUDIOSPEC_BO,
    /* 11 */ AUDIOSPEC_KA,
    /* 12 */ AUDIOSPEC_AQ,
    /* 13 */ AUDIOSPEC_SZ,
    /* 14 */ AUDIOSPEC_MA,
    /* 15 */ AUDIOSPEC_15,
    /* 16 */ AUDIOSPEC_16,
    /* 17 */ AUDIOSPEC_17,
    /* 18 */ AUDIOSPEC_18,
    /* 19 */ AUDIOSPEC_19,
    /* 20 */ AUDIOSPEC_20,
    /* 21 */ AUDIOSPEC_21,
    /* 22 */ AUDIOSPEC_22,
    /* 23 */ AUDIOSPEC_23,
    /* 24 */ AUDIOSPEC_24,
    /* 25 */ AUDIOSPEC_25,
    /* 26 */ AUDIOSPEC_26,
    /* 27 */ AUDIOSPEC_27,
    /* 28 */ AUDIOSPEC_28,
} AudioSpecID;

#endif