⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audiorw.c

📁 台湾凌阳方案300万数码相机源代码
💻 C
📖 第 1 页 / 共 2 页
字号:

/********************************************************************************
  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 + -