📄 waveinpdd.c
字号:
/****************************************************************************
* End of Modification done by Naresh Gupta
****************************************************************************/
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
WRITE_REGISTER_ULONG((PULONG)pDAR1, (ULONG)(dma_pagePhysicalAddress[0]));
WRITE_REGISTER_ULONG((PULONG)pSAR1, (ULONG)CC_CODEC_PCML );
WRITE_REGISTER_ULONG((PULONG)pDMATCR1, (ULONG)( AUDIO_DMA_PAGE_REC_SIZE / 4 )); // set data count
// Debug: DMA, Status Report
WRITE_REGISTER_ULONG((PULONG)pCODEC_ACR, (ULONG)0x007fffff );
/****************************************************************************
* Modification done by Maneesh Gupta
*
* Change bit names for SH4.
****************************************************************************/
#if ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
WRITE_REGISTER_USHORT((PUSHORT)pDMAOR, DMAC_DMAOR_DME );
#else // ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
WRITE_REGISTER_USHORT((PUSHORT)pDMAOR, SH3_DMAC_DMAOR_DME );
#endif // ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
/****************************************************************************
* End of Modification done by Maneesh Gupta
****************************************************************************/
// Begin Play of First Buffer
READ_REGISTER_ULONG((PULONG)pCHCR1 );
/****************************************************************************
* Modification done by Maneesh Gupta
*
* Change bit names for SH4.
****************************************************************************/
#if ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
WRITE_REGISTER_ULONG((PULONG)pCHCR1,
DMAC_CHCR_RL_ACTIVE_HIGH |
DMAC_CHCR_DM_INCREMENTED |
DMAC_CHCR_TS_32 |
DMAC_CHCR_IE_NOT_GENARATED |
DMAC_CHCR_DE_ENABLED );
READ_REGISTER_ULONG((PULONG)pCHCR1 );
WRITE_REGISTER_ULONG((PULONG)pCHCR1,
DMAC_CHCR_RL_ACTIVE_HIGH |
DMAC_CHCR_DM_INCREMENTED |
DMAC_CHCR_TS_32 |
DMAC_CHCR_IE_GENERATED |
DMAC_CHCR_DE_ENABLED );
#else // ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
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_ENABLED );
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_GENERATED |
SH3_DMAC_CHCR_DE_ENABLED );
#endif // ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
/****************************************************************************
* End of Modification done by Maneesh Gupta
****************************************************************************/
WRITE_REGISTER_ULONG((PULONG)pCODEC_ACR, (ULONG)0x007fffff ); // rec start
v_recPage = 1 - v_recPage;
// WriteAudioRecAddress(dma_pagePhysicalAddress[v_recPage]);//[macro]
pDriverGlobals->aud.rec_address = dma_pagePhysicalAddress[v_recPage];
pDriverGlobals->aud.inInt = (USHORT)NULL;
FUNC_WPDD("-PDD_WaveInStart");
}
/*****************************************************************************
* FUNCTION : private_AudioInContinue
* DESCRIPTION : continuerecording a sound - occurs at audio in interrupt
* INPUTS : pwh: wave header to insert sound into
* OUTPUTS : None
* DESIGN NOTES :
* CAUTIONS : pwh can be null for no buffers available
*****************************************************************************/
VOID
private_WaveInContinue(
PWAVEHDR pwh
)
{
int i;
long double SkipCount;
int mic_data_read_count;
int wave_data_write_count;
char write_flag = 0;
LONG samplingRate;
FUNC_VERBOSE("+PDD_WaveInContinue");
if (lpFormat2)
{
samplingRate = lpFormat2->nSamplesPerSec;
}
switch( (ULONG)samplingRate )
{
case 11025:
SkipCount = 8.707482993L;
break;
case 22050:
SkipCount = 4.353741497L;
break;
case 44100:
SkipCount = 2.176870748L;
break;
default:
SkipCount = 8.707482993L;
break;
}
// process raw audio samples
// copy processed audio sample into WAVEHDR
mic_data_read_count = 0;
wave_data_write_count = 0;
write_flag = 0;
for( i=0; i<AUDIO_DMA_PAGE_REC_SIZE; i=i+4)
{
PPCM_SAMPLE pSample; // where to store the audio record data
INT32 raw_sample; // 32 bit signed sample from AC97PCML
try
{
raw_sample = READ_REGISTER_ULONG((pAudioBufferBase + ((1 - v_recPage) * AUDIO_DMA_PAGE_REC_SIZE) + i));
}
except ( 1 )
{
DUMPEXCEPTION();
}
mic_data_read_count = mic_data_read_count + 1;
if ((( wave_data_write_count + 1 ) * SkipCount ) < mic_data_read_count )
write_flag = 1;
if (write_flag == 1 )
{
try
{
if( pwh == 0 ) break;
if( pwh->dwBytesRecorded >= pwh->dwBufferLength )
{
DEBUGMSG(ZONE_TEST,(TEXT("WAVE RECORD: NEXT BUFFER\r\n")));
pwh = pwh->lpNext;
if( pwh == 0 )
{
DEBUGMSG(ZONE_TEST,(TEXT("WAVE RECORD: NO BUFFERS\r\n")));
break;
}
}
}
except ( 1 )
{
DUMPEXCEPTION();
}
try
{
// this is safe, since odd alignment should only occur for 8 bit sound
// however, it is assumed that the WAVEHDR buffer is in multiples
// of the sample size (1,2, 2, or 4), otherwise the buffer
// could be overrun by a few bytes!
pSample = (PPCM_SAMPLE) (pwh->lpData + pwh->dwBytesRecorded);
switch( g_pcmtype[WAPI_IN] )
{
case PCM_TYPE_M8: // 8 bit mono
pSample->m8.sample = raw_sample >> 12;
pSample->m8.sample = pSample->m8.sample + 128;
pwh->dwBytesRecorded += 1;
break;
case PCM_TYPE_S8: // 8 bit stereo
pSample->s8.sample_left =
pSample->s8.sample_right = fromPCM16toPCM8( raw_sample );
pwh->dwBytesRecorded += 2;
break;
case PCM_TYPE_M16: // 16 bit mono
pSample->m16.sample = raw_sample >> 4;
pwh->dwBytesRecorded += 2;
break;
case PCM_TYPE_S16: // 16 bit stereo
pSample->s16.sample_left = pSample->s16.sample_right = raw_sample;
pwh->dwBytesRecorded += 4;
break;
default: // really screwed up if we're here!
DEBUGMSG(ZONE_ERROR,(TEXT("WAVE RECORD: invalid pcm type %d\r\n"),
g_pcmtype[WAPI_IN] ));
break;
} //end switch
write_flag = 0;
wave_data_write_count = wave_data_write_count + 1;
}
except ( 1 )
{
DUMPEXCEPTION();
} // end try
} // end if
} // end for
v_recPage = 1 - v_recPage;
// WriteAudioRecAddress(dma_pagePhysicalAddress[v_recPage]);//[macro]
pDriverGlobals->aud.rec_address = dma_pagePhysicalAddress[v_recPage];
//pDriverGlobals->aud.inInt = (USHORT)NULL;
FUNC_VERBOSE("-PDD_WaveInContinue");
}
/*****************************************************************************
* FUNCTION : private_AudioInStop
* DESCRIPTION : stop recording a sound
* INPUTS :
* OUTPUTS : None
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
VOID
private_WaveInStop()
{
FUNC_WPDD("+PDD_WaveInStop");
FUNC_WPDD("-PDD_WaveInStop");
}
/*****************************************************************************
* FUNCTION : private_AudioInStandby
* DESCRIPTION : stop recording a sound
* INPUTS :
* OUTPUTS : None
* DESIGN NOTES : what is the difference between this and Stop?
* CAUTIONS :
*****************************************************************************/
VOID
private_WaveInStandby()
{
FUNC_WPDD("+PDD_WaveInStandby");
FUNC_WPDD("-PDD_WaveInStandby");
}
/*****************************************************************************
* FUNCTION : private_AudioInClose
* DESCRIPTION : close recording device, powers off
* INPUTS :
* OUTPUTS : None
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
VOID
private_WaveInClose()
{
FUNC_WPDD("PDD_WaveInClose");
lpFormat2=0;
pDriverGlobals->aud.rec_address = (ULONG)NULL;
pDriverGlobals->aud.inInt = (USHORT)NULL;
}
/*****************************************************************************
* FUNCTION : private_AudioInOpen
* DESCRIPTION : opens recording sound device, powers on
* INPUTS : lpFormat = what recording parameters to use
* OUTPUTS : MMRESULT - ok if params ok, else a error code
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
MMRESULT
private_WaveInOpen(
LPWAVEFORMATEX lpFormat,
BOOL fQueryFormatOnly
)
{
MMRESULT mmRet = MMSYSERR_NOERROR;
FUNC_WPDD("+PDD_WaveInOpen");
//Stop DMA
READ_REGISTER_ULONG((PULONG)pCHCR1 );
/****************************************************************************
* Modification done by Maneesh Gupta
*
* Change bit names for SH4.
****************************************************************************/
#if ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
WRITE_REGISTER_ULONG((PULONG)pCHCR1,
DMAC_CHCR_RL_ACTIVE_HIGH |
DMAC_CHCR_DM_INCREMENTED |
DMAC_CHCR_TS_32 |
DMAC_CHCR_IE_NOT_GENARATED |
DMAC_CHCR_DE_DISABLED );
#else // ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
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 );
#endif // ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
/****************************************************************************
* End of Modification done by Maneesh Gupta
****************************************************************************/
lpFormat2=lpFormat; // for WaveInContinue
// Allow PCM, mono or stereo, 8 or 16 bit at 11, 22, or 44 KHz
if ((lpFormat->wFormatTag != WAVE_FORMAT_PCM) ||
(lpFormat->nChannels != Monaural && lpFormat->nChannels != Stereo) ||
(lpFormat->nSamplesPerSec != Hz11025 && lpFormat->nSamplesPerSec != Hz22050 && lpFormat->nSamplesPerSec != Hz44100) ||
(lpFormat->wBitsPerSample != SixteenBits && lpFormat->wBitsPerSample != EightBits))
{
mmRet = WAVERR_BADFORMAT;
}
if (fQueryFormatOnly || mmRet != MMSYSERR_NOERROR)
{
goto EXIT;
}
// Open with the given format. Choose a playback rate from this.
g_pwfx[WAPI_IN] = lpFormat;
if (g_pwfx[WAPI_IN]->wBitsPerSample == EightBits)
{
if (g_pwfx[WAPI_IN]->nChannels == Monaural)
g_pcmtype[WAPI_IN] = PCM_TYPE_M8;
else
g_pcmtype[WAPI_IN] = PCM_TYPE_S8;
}
else
{
if (g_pwfx[WAPI_IN]->nChannels == Monaural)
g_pcmtype[WAPI_IN] = PCM_TYPE_M16;
else
g_pcmtype[WAPI_IN] = PCM_TYPE_S16;
}
// Power on and initialize the AFE
private_AudioInPowerHandler( FALSE, FALSE );
// clear stats
g_dwOverruns = 0;
g_dwFrames = 0;
EXIT:
FUNC_WPDD("-PDD_WaveInOpen");
return(mmRet);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -