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

📄 sacm_dvr1600_user_c.c

📁 用凌阳的十六位单片机SPCE061A做得语音开发板,可以录播WMA格式的音乐,外挂ST39VF040存储,可以存几十首歌,有音频编解码代码
💻 C
字号:
//========================================================
//	文件名称:	SACM_DVR1600_User_C.c
//	功能描述:	DVR1600用户函数(C语言版),用于保存或获取语音资源数据
//				包括:
//					void USER_DVR1600_GetResource_Init(unsigned int SoundIndex);
//					void USER_DVR1600_GetResource(unsigned int *p_Buf, unsigned int Words);
//					void USER_DVR1600_SaveResource_Init(unsigned int UserParam);
//					void USER_DVR1600_SaveResource(unsigned int *p_Buf, unsigned int Words);
//					void USER_DVR1600_SaveResource_End(void);
//				这些函数被语音库自动调用,可根据需要自行修改这些函数的内容
#include "SPCE061A.h"

extern void SACM_DVR1600_Stop(void);
extern void ERASE_ST39VF040_Sector(unsigned int m_addr);
extern void Write_ST39VF040_One_Word(unsigned long m_addr,unsigned int m_data);
extern unsigned int Read_ST39VF040_One_Word(unsigned long m_addr);

unsigned long ResAddr;
unsigned long RECORD_SA=0x00000000L; // 录音资源起始地址
unsigned long RECORD_EA=0x00005FFFL; // 录音资源结束地址
//========================================================================
//	语法格式:	void USER_DVR1600_GetResource_Init(unsigned int SoundIndex);
//	实现功能:	(被DVR1600函数库自动调用)获取语音资源数据,初始化操作
//	参数:		SoundIndex:		语音资源序号
//	返回值:	无
//========================================================================
void USER_DVR1600_GetResource_Init(unsigned int SoundIndex)
{
	RECORD_SA = SoundIndex*4+6;
	ResAddr = Read_ST39VF040_One_Word(RECORD_SA);
	ResAddr += 2;
    RECORD_EA = Read_ST39VF040_One_Word(RECORD_SA+2);
	RECORD_EA = RECORD_EA<<16;
	ResAddr = RECORD_EA+ResAddr;    	// 初始化语音资源的起始地址
}

//========================================================================
//	语法格式:	void USER_DVR1600_GetResource(unsigned int *p_Buf, unsigned int Words);
//	实现功能:	(被DVR1600函数库自动调用)获取语音资源数据,并填充到解码队列中
//	参数:		p_Buf:		待填充解码队列的起始地址(该参数由函数库自动产生)
//				Words:		待填充数据的数量,单位为Word(该参数由函数库自动产生)
//	返回值:	无
//========================================================================
void USER_DVR1600_GetResource(unsigned int *p_Buf, unsigned int Words)
{
	while(Words>0)
	{
		*p_Buf = Read_ST39VF040_One_Word(ResAddr);
		p_Buf++;
		ResAddr += 2;
		Words--;
	}
}

//========================================================================
//	语法格式:	void USER_DVR1600_SaveResource_Init(unsigned int UserParam);
//	实现功能:	(被DVR1600函数库自动调用)保存录制的语音资源编码,初始化操作
//	参数:		UserParam:	由SACM_DVR1600_Play函数传递的用户自定义参数
//	返回值:	无
//========================================================================
void USER_DVR1600_SaveResource_Init(unsigned int UserParam)
{
	unsigned int Sector;
	for(Sector=(RECORD_SA/0x1000); Sector<=(RECORD_EA/0x1000); Sector+=1)
	{
		ERASE_ST39VF040_Sector(Sector);
		*P_Watchdog_Clear = 0x01;
	}
	ResAddr = RECORD_SA + 4;				// 跳过前两个Word(用于录音结束时保存资源长度)
}

//========================================================================
//	语法格式:	void USER_DVR1600_SaveResource(unsigned int *p_Buf, unsigned int Words)
//	实现功能:	(被DVR1600函数库自动调用)获取已编码数据,并保存
//	参数:		p_Buf:		待获取的已编码数据的起始地址(该参数由函数库自动产生)
//				Words:		已编码数据的数量,单位为Word(该参数由函数库自动产生)
//	返回值:	无
//========================================================================
void USER_DVR1600_SaveResource(unsigned int *p_Buf, unsigned int Words)
{
	while(Words--)
	{
		Write_ST39VF040_One_Word(ResAddr,*p_Buf++);
		ResAddr += 2;
		if(ResAddr > RECORD_EA)				// 达到结束地址则停止录音
		{
			SACM_DVR1600_Stop();
			break;
		}
	}
}

//========================================================================
//	语法格式:	void USER_DVR1600_SaveResource_End(void)
//	实现功能:	(被DVR1600函数库自动调用)录音结束后,将录制资源的长度(单位为Byte)保存到该资源的前两个word
//	参数:		无
//	返回值:	无
//========================================================================
void USER_DVR1600_SaveResource_End(void)
{
	unsigned long ResSize;
	ResSize = ResAddr - RECORD_SA;				// 计算录音资源的长度,以Byte为单位
	Write_ST39VF040_One_Word(RECORD_SA,ResSize&0xffff);
	Write_ST39VF040_One_Word(RECORD_SA+2,ResSize>>16);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -