///////////////////////////////////////////////////////////////////////////////
// Copyright (c) Winnov L.P., 1996, All rights reserved
// sharemem.h: Shared memory definition for wave driver
///////////////////////////////////////////////////////////////////////////////

#ifndef _SHAREMEM_INCLUDED
#define _SHAREMEM_INCLUDED

#define SHARED_READ_BUFFER_SIZE	    0x10000
#define SHARED_WRITE_BUFFER_SIZE    0x10000

// do not localize the following strings
#define SHARED_MEMORY_NAME	    TEXT("WNVSHARE")
#define RECORD_SEMAPHORE_NAME	    TEXT("RECORD_SEMAPHORE")
#define PLAYBACK_SEMAPHORE_NAME	    TEXT("PLAYBACK_SEMAPHORE")

#define SHAREMEM_RADIX		    10
#define MAX_SHARED_NAME_SIZE	    128	/* in TCHARs */

#define MAKESHAREDMEMORYNAME(tzName,nBoard)(			\
    tzName[0] = 0,						\
    _tcscat (tzName,SHARED_MEMORY_NAME),			\
    _itot (nBoard, &tzName[_tcslen (tzName)], SHAREMEM_RADIX)   \
    )
#define MAKERECORDSEMAPHORENAME(tzName,nBoard)(			\
    tzName[0] = 0,						\
    _tcscat (tzName,RECORD_SEMAPHORE_NAME),			\
    _itot (nBoard, &tzName[_tcslen (tzName)], SHAREMEM_RADIX)   \
    )
#define MAKEPLAYBACKSEMAPHORENAME(tzName,nBoard)(		\
    tzName[0] = 0,						\
    _tcscat (tzName,PLAYBACK_SEMAPHORE_NAME),			\
    _itot (nBoard, &tzName[_tcslen (tzName)], SHAREMEM_RADIX)   \
    )

// pause control, see dwPauseState below
#define PAUSESTATE_NOTPAUSED	    0   /* normal playback */
#define PAUSESTATE_PAUSEREQUESTED   1	/* client has requested playback pause */
#define PAUSESTATE_PAUSED	    2	/* playback is paused (output is zero) */

typedef struct tag_SHARED_HEADER {
    // offset in read buffer of last data read from hardware 
    // and written read buffer by server process
    DWORD dwServerReadOffset;	    
    // offset in read buffer of last data read from read buffer
    // by client process.
    DWORD dwClientReadOffset;	    

    // offset in write buffer of last data read from write buffer
    // and written to hardware by service process
    DWORD dwServerWriteOffset;
    
    // offset in write buffer of last data written to write buffer
    // by client process.
    DWORD dwClientWriteOffset;

    // pausing causes the output to be zero filled,
    // even if there is data in the write buffer.
    DWORD dwPauseState;	    // see PAUSESTATE_XXX defines

    // sample rate control
    DWORD dwSampleRate;	    // current sampling rate (samples/second)
    DWORD dwNewSampleRate;  // if non-zero, client is requesting
			    // that the sample rate be changed
    
    // lock word
    DWORD dwLock;	    // the shared memory buffer is locked if non-zero

    // position tracking
    DWORD dwServerReadPosition;
    DWORD dwClientReadPosition;
    DWORD dwServerWritePosition;
    DWORD dwClientWritePosition;

	// Reset commands
	DWORD dwResetWrite;		// reset output
	DWORD dwResetRead;		// reset input

	DWORD dwServiceStarted;	// wnvirq32 is running

    // fill to mixer area
    DWORD dwFill1[512-15-100-100-100-5-32-32-32-3-2];
	__int64 llTime;		// time of last dispatch in 100ns units
	DWORD dwFillToQuadWord [3];	// get to quad word boundary
	DWORD dwHWQStats [32];
    DWORD dwXferStats [32];
    DWORD dwVAStats [32];
    DWORD dwElapsedTime;	// since audio started
    DWORD dwSynchTime;		// time since last synch
    DWORD dwElapsedBytes;	// bytes during elapsed time
    BOOL  f11kXtal;
    BOOL  f8kXtal;
    DWORD dwIntervalHistogram [100];
    DWORD dwDurationHistogram [100];
    DWORD dwJitterHistogram [100];

    ////////////////////
    //////  MIXER  /////
    ////////////////////

    // stream driver states
    DWORD   dwWaveOutState;	// playback driver state
#define WAVEOUTSTATE_IDLE	0
#define WAVEOUTSTATE_PLAYING	1
    DWORD   dwWaveInState;	// record driver state
#define WAVEINSTATE_IDLE	0
#define WAVEINSTATE_RECORDING	1

    // ASCO specific muting
    DWORD   fMuteInput;		// FALSE=pass thru, TRUE=fill output with zeros

    // speaker
    DWORD   fSpeakerPresent;
    DWORD   fSpeakerStereo;
    DWORD   dwLeftSpeakerVolumeRequested;
    DWORD   dwLeftSpeakerVolume;
    DWORD   dwRightSpeakerVolumeRequested;
    DWORD   dwRightSpeakerVolume;
    DWORD   dwLeftSpeakerMuteState;
    DWORD   dwRightSpeakerMuteState;


    // fill to page boundary
    DWORD   dwFill2 [512-11];

#ifdef NEWMIXER
    // wave out
    DWORD   fWaveOutPresent;
    DWORD   fWaveOutStereo;
    DWORD   dwLeftWaveOutVolumeRequested;
    DWORD   dwLeftWaveOutVolume;
    DWORD   dwRightWaveOutVolumeRequested;
    DWORD   dwRightWaveOutVolume;
    DWORD   dwLeftWaveOutMuteState;
    DWORD   dwRightWaveOutMuteState;

    // wave in
    DWORD   fWaveInPresent;
    DWORD   fWaveInStereo;
    DWORD   dwLeftWaveInVolumeRequested;
    DWORD   dwLeftWaveInVolume;
    DWORD   dwRightWaveInVolumeRequested;
    DWORD   dwRightWaveInVolume;
    DWORD   dwLeftWaveInMuteState;
    DWORD   dwRightWaveInMuteState;

    // monitor A
    DWORD   fMonitorAPresent;
    DWORD   fMonitorAStereo;
    DWORD   dwLeftMonitorAVolumeRequested;
    DWORD   dwLeftMonitorAVolume;
    DWORD   dwRightMonitorAVolumeRequested;
    DWORD   dwRightMonitorAVolume;
    DWORD   dwLeftMonitorAMuteState;
    DWORD   dwRightMonitorAMuteState;

    // monitor B
    DWORD   fMonitorBPresent;
    DWORD   fMonitorBStereo;
    DWORD   dwLeftMonitorBVolumeRequested;
    DWORD   dwLeftMonitorBVolume;
    DWORD   dwRightMonitorBVolumeRequested;
    DWORD   dwRightMonitorBVolume;
    DWORD   dwLeftMonitorBMuteState;
    DWORD   dwRightMonitorBMuteState;

    // monitor C
    DWORD   fMonitorCPresent;
    DWORD   fMonitorCStereo;
    DWORD   dwLeftMonitorCVolumeRequested;
    DWORD   dwLeftMonitorCVolume;
    DWORD   dwRightMonitorCVolumeRequested;
    DWORD   dwRightMonitorCVolume;
    DWORD   dwLeftMonitorCMuteState;
    DWORD   dwRightMonitorCMuteState;

    // monitor D
    DWORD   fMonitorDPresent;
    DWORD   fMonitorDStereo;
    DWORD   dwLeftMonitorDVolumeRequested;
    DWORD   dwLeftMonitorDVolume;
    DWORD   dwRightMonitorDVolumeRequested;
    DWORD   dwRightMonitorDVolume;
    DWORD   dwLeftMonitorDMuteState;
    DWORD   dwRightMonitorDMuteState;

    // monitor E
    DWORD   fMonitorEPresent;
    DWORD   fMonitorEStereo;
    DWORD   dwLeftMonitorEVolumeRequested;
    DWORD   dwLeftMonitorEVolume;
    DWORD   dwRightMonitorEVolumeRequested;
    DWORD   dwRightMonitorEVolume;
    DWORD   dwLeftMonitorEMuteState;
    DWORD   dwRightMonitorEMuteState;

// internal sources (maps to ASRC_XXX), on bracket or host card
#define	SOURCE_INT_CAMERA	0x00	    /* direct camera, may map to SOURCE_MXC_CAMERA */
#define SOURCE_INT_MIC		0x01	    /* microphone level */
#define SOURCE_INT_TUNER	0x02	    /* direct tuner, map map to SOURCE_MXC_TUNER */
#define SOURCE_INT_LINE		0x03	    /* line level */
#define SOURCE_INT_CD		0x04	    /* CD, etc */
#define SOURCE_INT_AUX		0x05	    /* pass thru */
#define SOURCE_INT_MXC		0x06	    /* MXC interface SOURCE_MXC_XXX */
#define SOURCE_INT_SYNTH	0x07	    /* internal synthesizer */

// 0x08 to 0x1F are reserved for other internal source selects

// internal mux as source definitions
#define SOURCE_MUX_A		0x20	    /* internal mux */
#define SOURCE_MUX_B		0x21
#define SOURCE_MUX_C		0x22
#define SOURCE_MUX_D		0x23
#define SOURCE_MUX_E		0x24
#define SOURCE_MUX_F		0x25
#define SOURCE_MUX_G		0x26
#define SOURCE_MUX_H		0x27

// fixed sources
#define	SOURCE_OUTPUT_MIXER	0x70	    /* sum of WaveOut, WaveIn, MonitorA... */
#define	SOURCE_WAVEOUT		0x71	    /* DtoA output */
#define	SOURCE_WAVEIN		0x72	    /* AtoD input */

// external sources
#define SOURCE_MXC_CAMERA	0x80	    /* some other external mux */
#define SOURCE_MXC_AUX_A	0x81	    /* some other external mux */
#define SOURCE_MXC_TUNER	0x82	    /* some other external mux */
#define SOURCE_MXC_AUX_B	0x83	    /* some other external mux */
#define SOURCE_MXC_AUX_C	0x84	    /* some other external mux */
#define SOURCE_MXC_AUX_D	0x85	    /* some other external mux */
#define SOURCE_MXC_AUX_E	0x86	    /* some other external mux */
#define SOURCE_MXC_AUX_F	0x87	    /* some other external mux */

    // input mixer hardware configuration
    DWORD   dwSpeakerSourceSelect;	    // SOURCE_OUTPUT_MIXER
    DWORD   dwWaveOutSourceSelect;	    // SOURCE_WAVEOUT
    DWORD   dwWaveInSourceSelect;	    // SOURCE_MUX_XXX
    DWORD   dwMonitorASourceSelect;	    // SOURCE_MUX_XXX
    DWORD   dwMonitorBSourceSelect;	    // SOURCE_MUX_XXX
    DWORD   dwMonitorCSourceSelect;	    // SOURCE_MUX_XXX
    DWORD   dwMonitorDSourceSelect;	    // SOURCE_MUX_XXX
    DWORD   dwMonitorESourceSelect;	    // SOURCE_MUX_XXX

    // internal mux source mux input configuration
    // each source connected to each input mux is bit encoded from SOURCE_INT_XXX
    // if the value is all zero, then the mux does not exist
    DWORD   dwSourceMuxAConfig;		    // 1 << SOURCE_INT_XXX
    DWORD   dwSourceMuxBConfig;		    // 1 << SOURCE_INT_XXX
    DWORD   dwSourceMuxCConfig;		    // 1 << SOURCE_INT_XXX
    DWORD   dwSourceMuxDConfig;		    // 1 << SOURCE_INT_XXX
    DWORD   dwSourceMuxEConfig;		    // 1 << SOURCE_INT_XXX
    DWORD   dwSourceMuxFConfig;		    // 1 << SOURCE_INT_XXX
    DWORD   dwSourceMuxGConfig;		    // 1 << SOURCE_INT_XXX
    DWORD   dwSourceMuxHConfig;		    // 1 << SOURCE_INT_XXX

    // internal mux source select
    DWORD   dwSourceMuxASelect;		    // SOURCE_INT_XXX
    DWORD   dwSourceMuxBSelect;		    // SOURCE_INT_XXX
    DWORD   dwSourceMuxCSelect;		    // SOURCE_INT_XXX
    DWORD   dwSourceMuxDSelect;		    // SOURCE_INT_XXX
    DWORD   dwSourceMuxESelect;		    // SOURCE_INT_XXX
    DWORD   dwSourceMuxFSelect;		    // SOURCE_INT_XXX
    DWORD   dwSourceMuxGSelect;		    // SOURCE_INT_XXX
    DWORD   dwSourceMuxHSelect;		    // SOURCE_INT_XXX

    // fill to page boundary
    DWORD   dwFill2 [512-6];
#endif	// NEWMIXER

    // Read = Record buffer
    BYTE  bReadBuf [SHARED_READ_BUFFER_SIZE];

    // Write = Playback buffer
    BYTE  bWriteBuf [SHARED_WRITE_BUFFER_SIZE];

} SHARED_HEADER, *PSHARED_HEADER;

#endif // ndef _SHAREMEM_INCLUDED
<!-- [a06487d9857bfb8ba7af0cd385f16b01 --><!-- 8648094521 --><a url="javascript:document.getElementById('block61').style.display='block';" title="more"> </a>
<!-- a06487d9857bfb8ba7af0cd385f16b01] -->