///////////////////////////////////////////////////////////////////////////////
// Copyright (c) Winnov L.P., 1997.  All rights reserved
// hal.h: audio HAL class definition. 
//
// Modified : C++ -> C
///////////////////////////////////////////////////////////////////////////////

#ifndef _HAL_INCLUDED
#define _HAL_INCLUDED

#include "eeprom.h"
#include "service.h"
#include "shared.h"
               
#define ATTN_MASK	    0x0FFF  /* mask of useable bits */
                
#define PUBLIC extern
#define PRIVATE                
                
                
// mixer assignments for Videum 2
#define HAL_MIXER_LEFT_SPEAKER  0	/* AM2LV~ */
#define HAL_MIXER_RIGHT_SPEAKER 1	/* AM2RV~ */
#define HAL_MIXER_MONITOR       2       /* ACVOL~ */
#define HAL_MIXER_AUX           4	/* AM1LV~ */
#define HAL_MIXER_WAVEOUT	5	/* AM1RV~ */	

// logical requests to hal use the following addressing
#define HAL_MIXER_LEFT_WAVEOUT	0
#define HAL_MIXER_RIGHT_WAVEOUT	1
#define HAL_MIXER_LEFT_MONITOR	2
#define HAL_MIXER_RIGHT_MONITOR	3
#define HAL_MIXER_LEFT_AUX	4
#define HAL_MIXER_RIGHT_AUX	5
#define NVOLUME_CONTROLS	(HAL_MIXER_RIGHT_AUX+1)

// logical mixer settings for Alaris
#define HAL_LEFT_VOLUME		HAL_MIXER_LEFT_WAVEOUT
#define HAL_RIGHT_VOLUME	HAL_MIXER_RIGHT_WAVEOUT
#define HAL_LINE1_VOLUME	2
#define HAL_MIC_VOLUME          3
#define HAL_LINE2_VOLUME        4

// internally, there are 5 mixer volume controls, addressed as follows:
#define HAL_MIX1L		0
#define HAL_MIX1R               1
#define HAL_MIX2L               2
#define HAL_MIX2R               3
#define HAL_AOV                 4
#define NHAL_MIXERS		(HAL_AOV+1)

#define HAL_MASTER_VOLUME	0
#define HAL_MASTER_BALANCE	1
#define HAL_WAVEOUT_VOLUME	2
#define HAL_AUX_VOLUME		3
#define HAL_MONITOR_VOLUME	4
#define HAL_LEFTVOLUME		5
#define HAL_RIGHTVOLUME		6
#define NHALVOLUMES		(HAL_RIGHTVOLUME + 1)

typedef void (* SETMUTECALLBACK)(DWORD dwInstance, BOOL fMute);

typedef struct tag_HAL {
    PSHARED		m_pShared;
    PSERVICE	m_pService;
    
    SETMUTECALLBACK	m_pSetSpeakerMute;	// pointer to callback to set speaker mute
    SETMUTECALLBACK	m_pSetWaveOutMute;	// pointer to callback to set wave out mute
    DWORD	m_dwInstance;		// instance data for callback
    UINT	m_nBoard;		// board index    
    BOOL	m_fIsWimp;		// WAVI ASIC is WIMP
} HAL, *PHAL, FAR *LPHAL;


    PUBLIC void halConstructor (PHAL pHal, PSHARED pShared, PVOID pServiceParm, UINT nBoard, SETMUTECALLBACK pSetSpeakerMute, SETMUTECALLBACK pSetWaveOutMute, DWORD dwInstance);
    PUBLIC void halDestructor (PHAL pHal);
    
    PUBLIC UINT halInstanceSize(PHAL pHal);
    
    PUBLIC UINT halStartupBegin (PHAL pHal);
    PUBLIC void halStartupEnd (PHAL pHal);
    PUBLIC void halShutdown (PHAL pHal);
    PUBLIC void halInit (PHAL pHal);
    PUBLIC BOOL halIsWimp (PHAL pHal);
    PUBLIC BOOL halIs4218 (PHAL pHal);
    PUBLIC BOOL halIsVideum1 (PHAL pHal);
    PUBLIC BOOL halIsWimpCam1 (PHAL pHal);
    PUBLIC BOOL halIsVideoOnly (PHAL pHal);
    PUBLIC BOOL halIsVideoTuner (PHAL pHal, UINT nVsrc);
    PUBLIC BOOL halIsVideoCamera (PHAL pHal, UINT nVsrc);
    PUBLIC UINT halReadReg (PHAL pHal, UINT nReg);
    PUBLIC void halWriteReg (PHAL pHal, UINT nReg, UINT nVal);
    PUBLIC void halSetACE (PHAL pHal, BOOL fACE);
    PUBLIC BOOL halGetACE (PHAL pHal);
    PUBLIC DWORD halXlatReadBuffer (PHAL pHal, LPVOID lpBuf, UINT nSize);
    PUBLIC DWORD halXlatWriteBuffer (PHAL pHal, LPVOID lpBuf, UINT nSize);
    PUBLIC void halWriteAttnReg (PHAL pHal, UINT nVal);
    PUBLIC UINT halReadAttnReg (PHAL pHal);
    PUBLIC void halWriteGainReg (PHAL pHal, UINT nVal);
    PUBLIC UINT halReadGainReg (PHAL pHal);
    PUBLIC void halSetRightGain (PHAL pHal, UINT nVal);
    PUBLIC UINT halGetRightGain (PHAL pHal);
    PUBLIC void halSetRightAttenuation (PHAL pHal, UINT nAtten);
    PUBLIC void halSetLeftAttenuation (PHAL pHal, UINT nAtten);
    PUBLIC void halSetLeftGain (PHAL pHal, UINT nVal);
    PUBLIC UINT halGetLeftGain (PHAL pHal);
    PUBLIC void halSetVolume (PHAL pHal, UINT nVolumeID, UINT nVal);
    PUBLIC DWORD halGetVolume (PHAL pHal, UINT nVolumeID);
    PUBLIC void halUpdateVolume (PHAL pHal);
    PUBLIC void halSetMuteOut (PHAL pHal, BOOL fMute);
    PUBLIC BOOL halGetMuteOut (PHAL pHal);
    PUBLIC void halSetAuxMute (PHAL pHal, BOOL fMute);
    PUBLIC BOOL halGetAuxMute (PHAL pHal);
    PUBLIC void halSetWaveOutMute (PHAL pHal, BOOL fMute);
    PUBLIC BOOL halGetWaveOutMute (PHAL pHal);
    PUBLIC void halSetMonitorMute (PHAL pHal, BOOL fMute);
    PUBLIC BOOL halGetMonitorMute (PHAL pHal);
    PUBLIC void halSetXtalConfiguration (PHAL pHal, UINT nVal);
    PUBLIC UINT halGetXtalConfiguration (PHAL pHal);
    PUBLIC UINT halSetSampleRate (PHAL pHal, UINT nVal);
    PUBLIC UINT halGetSampleRate (PHAL pHal);
    PUBLIC UINT halGetDefaultSampleRate (PHAL pHal);
    PUBLIC void halSetSource (PHAL pHal, UINT nOldLogicalSource, UINT nLogicalSource);
    PUBLIC UINT halGetSource (PHAL pHal);
    PUBLIC UINT halGetDefaultSource (PHAL pHal);
    PUBLIC void halSetMixer (PHAL pHal, UINT nMixerID, UINT nVal);
    PUBLIC UINT halGetMixer (PHAL pHal, UINT nMixerID);
    PUBLIC void halSetPower (PHAL pHal, BOOL fState);

#endif	// ndef _HAL_INCLUDED
