📄 waveinpdd.cpp
字号:
/*
Copyright(c) 1998,1999 SIC/Hitachi,Ltd.
Module Name:
waveInpdd.c
Revision History:
26th April 1999 Released
30th June 1999 Modified audio in buffer address
Added AudioInInterrupt Flag
26th October 1999 Modified WaveData length thin out
29-Nov-1999 cea Changed for SH3 (7709A) DMA control
*/
#include <windows.h>
#include <types.h>
#include <memory.h>
#include <excpt.h>
#include <waveddsi.h>
#include <wavedbg.h>
#include <mmsystem.h>
#include <Excpt.h>
#include "wavepdd.h"
#include "waveInpdd.h"
#include "cc.h"
#include "macros.h"
#include "wavecpud.h"
extern "C" PUCHAR GetVirtualAddressOfUncachedMemory( PVOID base, ULONG sz, char* cID );
extern PWAVEFORMATEX g_pwfx[2];
extern PCM_TYPE g_pcmtype[2];
// audio in globals
// pointer to the physical memory addresses
DmaObject * pDmaInObject=NULL;
extern DWORD dwCCCodecRegBase;//CC_CODEC_REGBASE
extern DWORD dwCCSysSMCR;//CC_SYS_SMSCR
//PVBYTE *pAudioRecAddress;
// Double Buffer for Audio Playback
//
static ULONG v_recPage;
static PBYTE pCC_CODEC_RegBase; // Companion chip SERIAL CODEC register offsets
static PBYTE pCC_SYS_RegBase; // Companion chip SMSCR
static PBYTE pAudioBufferBase; // Audio buffer
// Companion Chip Registers
static PVUSHORT pCODEC_CR; // virtual addrs of C.C. registers
static PVULONG pCODEC_ACR, pCODEC_CAR, pCODEC_CDR;
static PVULONG pCODEC_ATAGR;
static PVULONG pCODEC_PCML;
static PVULONG pSMSCR;
static PVUSHORT pCODEC_FSR;
// statistics
DWORD g_dwOverruns; // # of overrun errors
DWORD g_dwFrames; // # of 48 word frames filled
LPWAVEFORMATEX lpFormat2 = 0;
#define DUMPEXCEPTION() \
DEBUGMSG(ZONE_ERROR,(TEXT("Exception %d @ %s:%d\r\n"), GetExceptionCode(), __FILE__, __LINE__ ))
/*****************************************************************************
* FUNCTION : private_AudioInGetInterruptType
* DESCRIPTION : decodes type of audio interrupt
* INPUTS : None
* OUTPUTS : interrupt type
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
AUDIO_STATE
private_AudioInGetInterruptType(
VOID
)
{
//if ( pDriverGlobals->aud.inInt == (USHORT)NULL )
if (pDmaInObject->GetGlobalInInt()==NULL)
{
return AUDIO_STATE_IGNORE;
}
else
{
pDmaInObject->ResetGlobalInInt(TRUE);//decrement the count
return AUDIO_STATE_IN_RECORDING;
}
}
/*****************************************************************************
* FUNCTION : private_AudioInInitialize
* DESCRIPTION : sets up register access for audio-in
* sets delay time for audio-in start-up
* INPUTS : TRUE iff successful
* OUTPUTS : None
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
BOOL
private_AudioInInitialize(
VOID
)
{
//ULONG SizeOfBuffer;
char here[] = "PDD_AudioInInitialize";
FUNC_WPDD("+PDD_AudioInInitialize");
RETAILMSG( 1, (TEXT("WaveInpdd.c private_AudioInInitialize: START\r\n")));
// Set pointers to virtual addresses of playback registers
/*
pDMAC_RegBase =(PBYTE)GetVirtualAddressOfUncachedMemory(
(PBYTE)DMAC_REGBASE,
(DWORD)DMAC_REGSIZE,
"PDD_AudioInitialize, pDMAC_RegBase");
if (pDMAC_RegBase == NULL) return FALSE;
pDMAOR = (PVUSHORT)(pDMAC_RegBase + DMAC_DMAOR_OFFSET );
pSAR1 = (PVULONG)(pDMAC_RegBase + DMAC_SAR1_OFFSET );
pDAR1 = (PVULONG)(pDMAC_RegBase + DMAC_DAR1_OFFSET );
pDMATCR1 = (PVULONG)(pDMAC_RegBase + DMAC_DMATCR1_OFFSET);
pCHCR1 = (PVULONG)(pDMAC_RegBase + DMAC_CHCR1_OFFSET );
pCHCR0 = (PVULONG)(pDMAC_RegBase + DMAC_CHCR0_OFFSET );
pCHCR2 = (PVULONG)(pDMAC_RegBase + DMAC_CHCR2_OFFSET );
pCHCR3 = (PVULONG)(pDMAC_RegBase + DMAC_CHCR3_OFFSET );
*/
/*
pINTC_Area_1_RegBase =(PBYTE)GetVirtualAddressOfUncachedMemory(
(PBYTE)INTC_AREA_1_REGBASE,
(DWORD)INTC_AREA_1_REGSIZE,
"PDD_AudioInitialize, pINTC_Area_1_RegBase");
if (pINTC_Area_1_RegBase == NULL) return FALSE;
pINTC_Area_7_RegBase =(PBYTE)GetVirtualAddressOfUncachedMemory(
(PBYTE)INTC_AREA_7_REGBASE,
(DWORD)INTC_AREA_7_REGSIZE,
"PDD_AudioInitialize, pINTC_Area_7_RegBase");
if (pINTC_Area_7_RegBase == NULL) return FALSE;
*/
pCC_CODEC_RegBase =(PBYTE)GetVirtualAddressOfUncachedMemory(
(PBYTE)dwCCCodecRegBase,//CC_CODEC_REGBASE,
(DWORD)CC_CODEC_REGSIZE,
"PDD_AudioInitialize, pCC_CODEC_RegBase");
if (pCC_CODEC_RegBase == NULL) return FALSE;
pCODEC_CR = (PVUSHORT) (pCC_CODEC_RegBase + CC_CODEC_CR_OFFSET );
pCODEC_CAR = (PVULONG ) (pCC_CODEC_RegBase + CC_CODEC_CAR_OFFSET );
pCODEC_CDR = (PVULONG ) (pCC_CODEC_RegBase + CC_CODEC_CDR_OFFSET );
pCODEC_ACR = (PVULONG ) (pCC_CODEC_RegBase + CC_CODEC_ACR_OFFSET );
pCODEC_ATAGR = (PVULONG ) (pCC_CODEC_RegBase + CC_CODEC_ATAGR_OFFSET );
pCODEC_PCML = (PVULONG ) (pCC_CODEC_RegBase + CC_CODEC_PCML_OFFSET );
pCODEC_FSR = (PVUSHORT) (pCC_CODEC_RegBase + CC_CODEC_FSR_OFFSET );
pCC_SYS_RegBase =(PBYTE)GetVirtualAddressOfUncachedMemory(
(PBYTE)dwCCSysSMCR,//CC_SYS_SMSCR,
(DWORD)CC_SYS_REGSIZE,
"PDD_AudioInitialize, pCC_SYS_RegBase");
if (pCC_SYS_RegBase == NULL) return FALSE;
pSMSCR = (PVULONG ) (pCC_SYS_RegBase );
// Set pointers to virtual addresses of audio buffers
/*
SizeOfBuffer = (AUDIO_DMA_PAGE_REC_SIZE * 2);
pAudioBufferBase = VirtualAlloc(
NULL,
SizeOfBuffer,
MEM_RESERVE,
PAGE_NOACCESS);
if (pAudioBufferBase == NULL) return FALSE;
if (!VirtualCopy((PVOID)pAudioBufferBase,
(PVOID)dma_pagePhysicalAddress[0],
(DWORD)SizeOfBuffer,
PAGE_READWRITE | PAGE_NOCACHE))
{
VirtualFree((PVOID)pAudioBufferBase, 0, MEM_RELEASE);
return FALSE;
}
*/
if (pDmaInObject==NULL) {
pDmaInObject= CreateDmaObject(TRUE); // True for record dma buffer
ASSERT(pDmaInObject);
};
pAudioBufferBase=(PBYTE)pDmaInObject->GetDmaVirtualAddr();
if (pAudioBufferBase == NULL)
{
RETAILMSG( 1, (TEXT("pAudioBufferBase ---error---\r\n")));
return FALSE;
}
// Setup a Access to AudioPlayingAddress and AudioInInterrupt
/* pDriverGlobals = VirtualAlloc(
NULL,
DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE,
MEM_RESERVE,
PAGE_NOACCESS);
if (pDriverGlobals == NULL) return FALSE;
if (!VirtualCopy((PVOID)pDriverGlobals,
(PVOID)DRIVER_GLOBALS_PHYSICAL_MEMORY_START,
(DWORD)DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE,
PAGE_READWRITE | PAGE_NOCACHE))
{
VirtualFree((PVOID)pDriverGlobals, 0, MEM_RELEASE);
return FALSE;
}
*/
// Initialize AudioInInterrupt Flag
// pAudioRecAddress = pDriverGlobals->aud.play;
/* pDriverGlobals->aud.rec_address = (ULONG)NULL;
pDriverGlobals->aud.inInt = (USHORT)NULL;
*/ pDmaInObject->SetGlobalRecAddress(NULL);
pDmaInObject->ResetGlobalInInt(FALSE);
RETAILMSG(1, (TEXT("PDD_AudioInInitialize: Successful Init\r\n")));
RETAILMSG(1, (TEXT("WaveInpdd.c private_AudioInInitialize: END\r\n")));
FUNC("-PDD_AudioInInitialize");
return TRUE;
}
/*****************************************************************************
* FUNCTION : private_AudioInPowerHandler
* DESCRIPTION : performs power on/off, this also happens at open/close!
* INPUTS : bPowerDown 1=power off, 0=power on
* bInKernel 1=in kernel (don't call OS), 0=in IST
* OUTPUTS : None
* DESIGN NOTES :
* CAUTIONS : Don't call OS when in kernel mode
*****************************************************************************/
VOID
private_AudioInPowerHandler(
BOOL bPowerDown,
BOOL bInKernel
)
{
}
VOID
AudioOutPowerHandler(
BOOL bPowerDown
)
{
return; // Power Handling Not Yet Implemented
}
/*****************************************************************************
* FUNCTION : private_AudioInDeinitialize
* DESCRIPTION : Free memory required by driver
* INPUTS : None
* OUTPUTS : None
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
VOID
private_AudioInDeinitialize(
VOID
)
{
FUNC("+PDD_AudioInDeinitialize");
FUNC("-PDD_AudioInDisable");
}
/*****************************************************************************
* FUNCTION : private_AudioInStart
* DESCRIPTION : start recording a sound
* INPUTS : pwh: wave header to insert sound into
* OUTPUTS : None
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
VOID
private_WaveInStart(
PWAVEHDR pwh
)
{
FUNC_WPDD("+PDD_WaveInStart");
v_recPage = 0;
//Stop DMA
/* READ_REGISTER_ULONG((PULONG)pCHCR1 );
WRITE_REGISTER_ULONG((PULONG)pCHCR1,
SH3_DMAC_CHCR_RL_ACTIVE_HIGH |
SH3_DMAC_CHCR_DM_INCREMENTED |
SH3_DMAC_CHCR_TS_32 |
SH3_DMAC_CHCR_IE_NOT_GENARATED |
SH3_DMAC_CHCR_DE_DISABLED );
*/ pDmaInObject->StopDma();
WRITE_REGISTER_ULONG((PULONG)pCODEC_ACR, (ULONG)0x000effff ); //adjust L and R data
WRITE_REGISTER_ULONG((PULONG)pCODEC_ACR, (ULONG)0x007fffff ); //adjust L and R data
// Rig DMA for Transfer of First Buffer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -