//__________________________________________________________________________________________________
// Common dsp plugin spec, version #1.0 maintained by F|RES
//

#ifndef _DSP_H_INCLUDED__
#define _DSP_H_INCLUDED__

#include "PluginSpecs.h"
#include "ExportProlog.h"

typedef unsigned char   (*TARAM_Read_U8)(const unsigned int _uAddress);
typedef unsigned char*  (*TGetMemoryPointer)(const unsigned int  _uAddress);
typedef unsigned char* 	(*TGetARAMPointer)(void);
typedef void            (*TLogv)(const char* _szMessage, int _v);
typedef const char*     (*TName)(void);
typedef void            (*TDebuggerBreak)(void);
typedef void            (*TGenerateDSPInt)(void);
typedef unsigned int    (*TAudioGetStreaming)(short* _pDestBuffer, unsigned int _numSamples);

typedef struct
{
	void* hWnd;
	TARAM_Read_U8			pARAM_Read_U8;
	TGetMemoryPointer		pGetMemoryPointer;
	TGetARAMPointer			pGetARAMPointer;
	TLogv					pLog;	
	TName					pName;
	TDebuggerBreak			pDebuggerBreak;
	TGenerateDSPInt			pGenerateDSPInterrupt;
	TAudioGetStreaming		pGetAudioStreaming;
} DSPInitialize;

// __________________________________________________________________________________________________
// Function: GetDllInfo
// Purpose:  This function allows the emulator to gather information
//           about the DLL by filling in the PluginInfo structure.
// input:    a pointer to a PLUGIN_INFO structure that needs to be
//           filled by the function. (see def above)
// output:   none
//
EXPORT void CALL GetDllInfo(PLUGIN_INFO* _pPluginInfo);

// __________________________________________________________________________________________________
// Function: DllConfig
// Purpose:  This function is optional function that is provided
//           to allow the user to configure the DLL
// input:    a handle to the window that calls this function
// output:   none
//
EXPORT void CALL DllConfig(HWND _hParent);

// __________________________________________________________________________________________________
// Function: DllDebugger
// Purpose:  Open the debugger
// input:    a handle to the window that calls this function
// output:   none
//
EXPORT void CALL DllDebugger(HWND _hParent, bool Show);

// __________________________________________________________________________________________________
// Function: DSP_Initialize
// Purpose:  
// input:    DSPInitialize
// output:   none
//
EXPORT void CALL DSP_Initialize(DSPInitialize _dspInitialize);

// __________________________________________________________________________________________________
// Function: DSP_Shutdown
// Purpose:  This function is called when the emulator is shutting down
//           a game allowing the dll to de-initialise.
// input:    none
// output:   none
//
EXPORT void CALL DSP_Shutdown(void);

// __________________________________________________________________________________________________
// Function: DSP_ReadMailboxHigh
// Purpose:  Send mail to high DSP Mailbox
// input:    none
// output:   none
//
EXPORT unsigned short CALL DSP_ReadMailboxHigh(bool _CPUMailbox);

// __________________________________________________________________________________________________
// Function: DSP_ReadMailboxLow
// Purpose:  Send mail to low DSP Mailbox
// input:    none
// output:   none
//
EXPORT unsigned short CALL DSP_ReadMailboxLow(bool _CPUMailbox);

// __________________________________________________________________________________________________
// Function: DSP_WriteMailboxHigh
// Purpose:  Send mail to high CPU Mailbox
// input:    none
// output:   none
//
EXPORT void CALL DSP_WriteMailboxHigh(bool _CPUMailbox, unsigned short _uHighMail);

// __________________________________________________________________________________________________
// Function: DSP_WriteMailboxLow
// Purpose:  Send mail to low CPU Mailbox
// input:    none
// output:   none
//
EXPORT void CALL DSP_WriteMailboxLow(bool _CPUMailbox, unsigned short _uLowMail);

// __________________________________________________________________________________________________
// Function: DSP_WriteControlRegister
// Purpose:  This function is called if the core reads from the DSP control register
// input:    Value to be written
// output:   value of the control register
// 
EXPORT unsigned short CALL DSP_WriteControlRegister(unsigned short _Value);

// __________________________________________________________________________________________________
// Function: DSP_ReadControlRegister
// Purpose:  This function is called if the core reads from the DSP control register
// output:   value of the control register
// 
EXPORT unsigned short CALL DSP_ReadControlRegister(void);

// __________________________________________________________________________________________________
// Function: DSP_Update
// Purpose:  This function is called from time to time from the core. 
// input:    cycles - run this number of DSP clock cycles.
// output:   TRUE if the flag is set, else FALSE
// 
EXPORT void CALL DSP_Update(int cycles);

// __________________________________________________________________________________________________
// Function: DSP_SendAIBuffer
// Purpose:  This function sends the current AI Buffer to the DSP plugin
// input:    _Address : Memory-Address
// input:    _Size : Size of the Buffer (always 32)
// 
EXPORT void CALL DSP_SendAIBuffer(unsigned int address, int sample_rate);

// __________________________________________________________________________________________________
// Function: DSP_DoState
// Purpose:  Saves/load state
// input/output: ptr
// input: mode
//
EXPORT void CALL DSP_DoState(unsigned char **ptr, int mode);

#include "ExportEpilog.h"
#endif