📄 audiorw.c
字号:
/********************************************************************************
Copyright (c) 2002 Sunplus Technology Co., Ltd.
Module Name: audiorw.c
Function : Audio record/playback functions
Environment: Keil C51 Compiler
Creation : 2002/04/23 yichang
***********************************************************************************/
//version4.0@yichang@0513 for wav format file recording and playback
//=============================================================================
//Header file
//=============================================================================
#include "general.h"
#include "main.h"
#include "dosusr.h"
#include "doslink.h"
#include "doserr.h"
#include "image.h"
#include "cardlink.h"
#include "cffunc.h"
#include "ui.h"
#include "sdramhw.h"
#include "quantdef.h"
#include "dosusr.h"
#include "initio.h"
//#include "avioption.h"
#include "dosfunc.h"
#include "uiflow.h"
#if (SMC_OPTION || NANDF_OPTION)
#include "smcfunc.h"
#endif
#if (CFC_OPTION)
#include "cffunc.h"
#endif
#if (SDF_OPTION)
#include "sdfunc.h"
#endif
//patch4.2@richie@ds0511 begin
#if (DOSRAM_OPTION)
#include "dramfunc.h"
#endif
//patch4.2@richie@ds0511 end
//patch3.2@ada@0401 For DPOF
#include "dpof.h"
//patch3.2@ada@0401 For Multi-Frame Play Back
#include "initio.h"
//Joe@2003.3.3 19:47 add begin
#include "JoeToevb.h"
sbit PWR_DET = P3^4;
//Joe@2003.3.3 19:47 add end
//=============================================================================
//Symbol
//=============================================================================
extern void FillDramLong(ULONG address, ULONG value);
extern ULONG ReadSramLong(ULONG addr);
//-----------------------------------------------------------------------------
//Constant
//-----------------------------------------------------------------------------
#if (Audio)
code BYTE G_IMA_WAVE_Header[] =
{
// compressed IMA WAVE file
/*0x0000*/ 0x52, 0x49, 0x46, 0x46, // "RIFF"
/*0x0004*/ 0x8C, 0x15, 0x00, 0x00, // "RIFF" size
/*0x0008*/ 0x57, 0x41, 0x56, 0x45, // "WAVE"
/*0x000c*/ 0x66, 0x6D, 0x74, 0x20, // "fmt "
/*0x0010*/ 0x14, 0x00, 0x00, 0x00, // "fmt " size
/*0x0014*/ 0x11, 0x00, // Compression code (see Table Selected WAVE Format Codes)
/*0x0016*/ 0x01, 0x00, // Number of channels, nChannel
/*0x0018*/ 0x40, 0x1F, 0x00, 0x00, // Samples per second, same to sample rate
///*0x001c*/ 0x80, 0x3E, 0x00, 0x00, // Average number of bytes per second, sample rate*nChannel*bits/8
/*0x001c*/ 0xA0, 0x0F, 0x00, 0x00, // Average number of bytes per second, sample rate*nChannel*bits/8
/*0x0020*/ 0x00, 0x02, // Block alignment is nBlockAlign, nChannel*bits/8
/*0x0022*/ 0x04, 0x00, // Significant bits per sample
/*0x0024*/ 0x02, 0x00, // cbSize
/*0x0026*/ 0xF9, 0x03, // wSamplesPerBlock
/*0x0028*/ 0x66, 0x61, 0x63, 0x74, // "fact"
/*0x002c*/ 0x04, 0x00, 0x00, 0x00, // "fact" chunk size
/*0x0030*/ 0x40, 0x1F, 0x00, 0x00, // nSamplesPerSec
/*0x0034*/ 0x64, 0x61, 0x74, 0x61, // "data"
/*0x0038*/ 0x68, 0x15, 0x00, 0x00 // data size
};
//-----------------------------------------------------------------------------
//void PlayWaveChunck(USHORT fHandle, ULONG ChunckNo, ULONG HeaderOffset, ULONG audioBufferAddr) USING_0
//-----------------------------------------------------------------------------
void PlayWaveChunck(USHORT fHandle, ULONG ChunckNo, ULONG HeaderOffset, ULONG audioBufferAddr) USING_0
{
ULONG pbAudioChunkAddr;
ULONG AudBufCnt;
//patch4.3@yichang@0612 to correct audio playing buffer address
//herb for TVoutput debug @03/04/18 start
// pbAudioChunkAddr = K_SDRAM_AviPbAudioChunkBufAddr;
pbAudioChunkAddr = K_SDRAM_AviPbAudioChunkBufAddr+K_SDRAM_ImagePlaybackBufSize;
//herb for TVoutput debug @03/04/18 end
M_Card_File_Read(fHandle, K_DOS_DstDram, 1024, pbAudioChunkAddr, (ULONG)(ChunckNo<<9));
L2_SetSRAMDMA(0x0C00);
L2_SetDRAMDMA(pbAudioChunkAddr+HeaderOffset/2);
L2_DoDMA(0,1,512,0,0);
L2_SetSRAMDMA(0x0C00);
L2_SetDRAMDMA(audioBufferAddr);
do
{
L2_ReadDRAMAudBufCnt(&AudBufCnt);
}
while (AudBufCnt>600);
L2_SetDRAMAudDMACnt(1);
L2_DoDMA(1,0,512,0,0);
L2_SetDRAMAudDMACnt(0);
}
//-----------------------------------------------------------------------------
//UCHAR PlayWave(USHORT ID) USING_0
//-----------------------------------------------------------------------------
UCHAR PlayWave(USHORT ID) USING_0
{
USHORT startCluster;
BYTE name[12];
UCHAR sts ;
USHORT fHandle;
ULONG AudBufIdx;
ULONG AudBufCnt;
ULONG AudChunckCnt;
ULONG PBAudioChunkBufAddr;
ULONG i;
UCHAR headerSize;
ULONG time;
ULONG AudioAddr;
//version4.0@ada@0513 for DCF
UCHAR FileType;
//herb for TVoutput debug @03/04/18 start
// PBAudioChunkBufAddr = K_SDRAM_AviPbAudioChunkBufAddr;
// AudioAddr = K_SDRAM_AviPbAudioBufAddr;
PBAudioChunkBufAddr = K_SDRAM_AviPbAudioChunkBufAddr+K_SDRAM_ImagePlaybackBufSize;
AudioAddr = K_SDRAM_AviPbAudioBufAddr+K_SDRAM_ImagePlaybackBufSize;
//herb for TVoutput debug @03/04/18 end
// patch3.2@yichang@0426 prebuild smc banking table into sdram
Card_Specific( 1, 0xff );
USR_SetWaveName(name, (USHORT)ID);
//ada@0401 For Multi-Frame Play Back
//startCluster = USR_ReadDramFdbParameter(K_SDRAM_WAV_FdbParameterBufAddr + (((ULONG)ID - 1)) * 3);
//version4.0@ada@0513 for DCF
//patch4.5@ada@Record DCF file name begin
startCluster = USR_ReadDramFdbParameter(K_SDRAM_WAV_FdbParameterBufAddr + (((ULONG)ID - 1)) * 10,&FileType);
//startCluster = USR_ReadDramFdbParameter(K_SDRAM_WAV_FdbParameterBufAddr + (((ULONG)ID - 1)) * 8,&FileType);
//patch4.5@ada@Record DCF file name end
//ada@0401
fHandle = File_Open(name, K_DOS_ReadFile, startCluster);
if (!fHandle)
{
DbgPrint("Cannot open WAV file\n");
return L1K_ERROR_GENERAL;
}
//Davis:patch5.0.0.3_2005/Jun/30 L2_SetGPIOBit(40,1); //AUDIO_CTRL
sts = M_Card_File_Read(fHandle, K_DOS_DstDram, 512, PBAudioChunkBufAddr, 0);
if(!sts)
{
DbgPrint("Cannot read WAV header\n");
return L1K_ERROR_GENERAL;
}
L2_SetSRAMDMA(0x0C00);
L2_SetDRAMDMA(PBAudioChunkBufAddr);
L2_DoDMA(0,1,512,0,0);
AudChunckCnt = ReadSramLong(0x1C38);
AudChunckCnt = AudChunckCnt / 512;
//DbgPrint("AudChunckCnt=%ld\n", AudChunckCnt);
headerSize = sizeof(G_IMA_WAVE_Header);
//patch4.4@yichang@OSD begin
L2_ConfigGTimer(5); //up count and timebase 1 ms
L2_WriteGTimer(0);
L2_StartGTimer();
UI_PrintOSDString(" ", 0, 0, 0x00);
//patch4.4@yichang@OSD end
//Audio playback initial
L2_PlayAud(AudioAddr, 0x03, 0x40, 0x02);
L2_SetEmbAudCodecVol(0x03);
L2_SetDRAMAudDMACnt(0);
AudBufIdx = AudioAddr;
for(i=0;i<AudChunckCnt;i++)
{
//patch4.4@yichang@OSD, begin
L2_ReadGTimer(&time);
UI_UpdateFOSDTime(0,0,UI_MENU_DEHIGHLIGHT_COLOR,time);
//patch4.4@yichang@OSD, end
UI_PowerOnOffDetect(0);//wendy@2004/9/9
UI_Keypad_Scan(); //yichang@0424 to stop playing
if((G_KeyState == K_UI_BUTTON_DISPLAY)||(G_KeyState == K_UI_BUTTON_PCCAM_SWITCH)||(G_KeyState == K_UI_BUTTON_PREVIEW_SWITCH)||(G_KeyState == K_UI_BUTTON_PLAY_SWITCH)||(G_KeyState == K_UI_BUTTON_VIDEO_SWITCH))//wendy@2004/9/7
{
//Joe@2003.3.4 20:04 add begin
UI_Buzzer();
//Joe@2003.3.4 20:05 add end
break;
}
PlayWaveChunck(fHandle,i, (ULONG)headerSize, AudBufIdx);
AudBufIdx = AudBufIdx+256;
if(AudBufIdx == (AudioAddr + 4096))
AudBufIdx = AudioAddr;
}
L2_SetDRAMAudDMACnt(1);
L2_ReadDRAMAudBufCnt(&AudBufCnt);
L2_SetDRAMAudDMACnt(0);
while (AudBufCnt > 0)
{
L2_SetDRAMAudDMACnt(1);
L2_ReadDRAMAudBufCnt(&AudBufCnt);
L2_SetDRAMAudDMACnt(0);
};
//patch4.4@yichang@OSD, begin
L2_StopGTimer();
//patch4.4@yichang@OSD, end
//wait 1/4 sec
L2_ConfigGTimer(5);
L2_WriteGTimer(0);
L2_StartGTimer();
L2_ReadGTimer(&time);
while(time < 250)
{
L2_ReadGTimer(&time);
}
L2_StopGTimer();
L2_StopAud();
//patch4.3@yichang@0612 for closing file handle
File_Close(fHandle, name, K_DOS_ReadFile, 0);
//Davis:patch5.0.0.3_2005/Jun/30 L2_SetGPIOBit(40,0); //AUDIO_CTRLi
return L1K_SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -