    /*********************************************************

      libmus.h : Nintendo 64 Music Tools Programmers Library
      (c) Copyright 1997/1998, Software Creations (Holdings) Ltd.

      Version 3.11

      Music library header file.

    **********************************************************/

    #ifndef _LIBMUS_H_
    #define _LIBMUS_H_

    #include <ultra64.h>

    #ifdef _LANGUAGE_C_PLUS_PLUS
    extern "C" {
    #endif

    /* --------- MUSIC PLAYER API TYPEDEFS --------- */

    /* configuration */
    typedef struct
    {
      unsigned long control_flag;

      int 		channels;
      void		*sched;
      int		thread_priority;
      unsigned char	*heap;
      int		heap_length;

      unsigned char	*ptr;
      unsigned char	*wbk;

      void		*default_fxbank;

      int		fifo_length;

      int		syn_updates;
      int		syn_output_rate;
      int		syn_rsp_cmds;
      int 		syn_retraceCount;
      int		syn_num_dma_bufs;
      int		syn_dma_buf_size;

    // Special Addition

      OSPiHandle	*diskrom_handle;
    } musConfig;

    /* enabled/disable flag */
    typedef enum
    {
      MUSBOOL_OFF,
      MUSBOOL_ON
    } musBool;

    /* task descriptor */
    typedef struct
    {
    	u64		*data;				/* address of Acmd list			*/
    	int		data_size;			/* size of Acmd list			*/
    	u64		*ucode;				/* address of microcode code	*/
    	u64		*ucode_data;		/* address of microcode data	*/
    } musTask;

    /* handle type */
    typedef unsigned long	musHandle;

    /* marker callback function */
    typedef void	(*LIBMUScb_marker)		(musHandle, int);

    /* scheduler support callback functions */
    typedef void	(*LIBMUScb_install)		(void);
    typedef void	(*LIBMUScb_waitframe)	(void);
    typedef void 	(*LIBMUScb_dotask)		(musTask *);

    /* scheduler support callback list */
    typedef struct
    {
    	LIBMUScb_install	install;		/* called when thread starts		*/
    	LIBMUScb_waitframe	waitframe;		/* called to wait for vsync message */
    	LIBMUScb_dotask		dotask;			/* called to process RSP task		*/
    } musSched;

    /* --------- MUSIC PLAYER API MACROS --------- */

    /* control flags */
    #define MUSCONTROL_RAM		(1<<0)

    /* channel types flags */
    #define MUSFLAG_EFFECTS	1
    #define MUSFLAG_SONGS	2

    /* --------- MUSIC PLAYER API FUNCTION PROTOTYPES --------- */

    /* initialise */
    extern int MusInitialize			(musConfig *config);

    /* audio configuration */
    extern int MusSetFxType			(int fxtype);
    extern int MusSetSongFxChange		(musBool onoff);

    /* set master volume levels */
    extern void MusSetMasterVolume		(unsigned long flags, int volume);

    /* start songs and sound effects */
    extern musHandle MusStartSong		(void *addr);
    extern musHandle MusStartSongFromMarker	(void *addr, int marker);
    extern musHandle MusStartEffect		(int number);
    extern musHandle MusStartEffect2		(int number, int volume, int pan , int restartflag, int priority);

    /* stop and query sound types */
    extern void MusStop				(unsigned long flags, int speed);
    extern int  MusAsk				(unsigned long flags);

    /* handle based processing */
    extern int MusHandleAsk			(musHandle handle);
    extern int MusHandleStop			(musHandle handle, int speed);
    extern int MusHandleSetVolume		(musHandle handle, int volume);
    extern int MusHandleSetPan			(musHandle handle, int pan);
    extern int MusHandleSetFreqOffset		(musHandle handle, float offset);
    extern int MusHandleSetTempo		(musHandle handle, int tempo);
    extern int MusHandleSetReverb		(musHandle handle, int reverb);
    extern int MusHandlePause			(musHandle handle);
    extern int MusHandleUnPause			(musHandle handle);
    extern void *MusHandleGetPtrBank		(musHandle handle);

    /* sample bank support */
    extern void MusPtrBankInitialize		(void *pbank, void *wbank);
    extern void *MusPtrBankSetSingle		(void *ipbank);
    extern void MusPtrBankSetCurrent		(void *ipbank);
    extern void *MusPtrBankGetCurrent		(void);

    /* sound effect bank support */
    extern void MusFxBankInitialize		(void *fxbank);
    extern void MusFxBankSetSingle		(void *ifxbank);
    extern void MusFxBankSetCurrent		(void *ifxbank);
    extern void *MusFxBankGetCurrent		(void);
    extern int  MusFxBankNumberOfEffects	(void *ifxbank);
    extern void MusFxBankSetPtrBank		(void *ifxbank, void *ipbank);
    extern void *MusFxBankGetPtrBank		(void *ifxbank);
    extern void MusFxBankSetSingle		(void *ifxbank);

    /* scheduler support */
    extern void MusSetScheduler			(musSched *sched_list);

    /* marker callback support */
    extern void MusSetMarkerCallback	(void *callback);

    /* wave list lookup in song header */
    extern int    			MusHandleWaveCount	(musHandle handle);
    extern unsigned short	*MusHandleWaveAddress(musHandle handle);

    /* macros to support previous sample bank functions - use is not recommended! */
    #define MusBankInitialize(pbank,wbank)	\
    	MusPtrBankInitialize(pbank,wbank)

    #define MusBankStartSong(ipbank, addr)	\
    	MusStartSong((addr)==(void *)MusPtrBankSetSingle(ipbank) ? (addr):(addr))

    #define MusBankStartEffect(ipbank, number) \
    	MusStartEffect((number)==(int)MusPtrBankSetSingle(ipbank) ? (number):(number))

    #define MusBankStartEffect2(ipbank, number, volume, pan, restartflag, priority) \
    	MusStartEffect2((number)==(int)MusPtrBankSetSingle(ipbank) ? (number):(number), \
    					volume, pan, restartflag, priority)

    /* --- DEVELOPEMENT API FUNCTION PROTOTYPES --- */

    #ifdef _LANGUAGE_C_PLUS_PLUS
    }
    #endif

    #endif /* _LIBMUS_H_ */