/* fmod.c */
/* Copyright (c) Taylor Daley, 2023. */
/* NetHack may be freely redistributed.  See license for details. */

#ifdef SND_LIB_FMOD

#include "hack.h"
#include "fmod.h"

static FMOD_SYSTEM *systemvar;
static FMOD_SOUND *soundvar;
static FMOD_CHANNEL *channel1;
static FMOD_CHANNEL *channelMus;

static void fmod_init_nhsound(void);
static void fmod_exit_nhsound(const char *);
static void fmod_achievement(schar, schar, int32_t);
static void fmod_soundeffect(char *, int32_t, int32_t);
static void fmod_hero_playnotes(int32_t instrument, const char *str, int32_t volume);
static void fmod_play_usersound(const char *, int32_t, int32_t);
static void fmod_ambience(int32_t, int32_t, int32_t);
static void fmod_verbal(char *, int32_t, int32_t, int32_t, int32_t);

struct sound_procs fmod_procs = {
    SOUNDID(fmod),
    SOUND_TRIGGER_USERSOUNDS | 0,
    fmod_init_nhsound,
    fmod_exit_nhsound,
    fmod_achievement,
    fmod_soundeffect,
    fmod_hero_playnotes,
    fmod_play_usersound,
    fmod_ambience,
    fmod_verbal
};

static void
fmod_init_nhsound(void)
{
    /* Initialize external sound library */
    FMOD_System_Create(&systemvar, FMOD_VERSION);
    FMOD_System_Init(systemvar, 32, FMOD_INIT_NORMAL, 0);
}

static void
fmod_exit_nhsound(const char *reason)
{
    /* Close / Terminate external sound library */
    FMOD_System_Close(systemvar);
    FMOD_System_Release(systemvar);
}

/* fulfill SNDCAP_ACHIEVEMENTS */
static void
fmod_achievement(schar ach1, schar ach2, int32_t repeat)
{
    //  to be added in future
}

/* fulfill SNDCAP_SOUNDEFFECTS */
static void
fmod_soundeffect(char *desc, int32_t seid, int32_t volume)
{
    //  to be added in future
}

/* fulfill SNDCAP_HEROMUSIC */
static void fmod_hero_playnotes(int32_t instrument, const char *str, int32_t volume)
{
    //  to be added in future
}

/* fulfill  SOUND_TRIGGER_USERSOUNDS */
static void
fmod_play_usersound(const char *filename, int32_t volume UNUSED, int32_t idx UNUSED)
{
    FMOD_System_CreateSound(systemvar, filename, FMOD_CREATESAMPLE, 0,
                            &soundvar);
    if (strstr(filename, "music_") != NULL) {
        FMOD_Channel_Stop(channelMus);
        FMOD_System_PlaySound(systemvar, soundvar, 0, 0, &channelMus);
        FMOD_Channel_SetMode(channelMus, FMOD_LOOP_NORMAL);
    } else {
        FMOD_Channel_Stop(channel1);
        FMOD_System_PlaySound(systemvar, soundvar, 0, 0, &channel1);
    }
}

static void
fmod_ambience(int32_t ambienceid, int32_t ambience_action,
              int32_t hero_proximity)
{
    //  to be added in future
}

static void
fmod_verbal(char *text, int32_t gender, int32_t tone,
            int32_t vol, int32_t moreinfo)
{
    //  to be added in future
}

#endif /* SND_LIB_FMOD  */
       /* end of fmod.c */
