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

📄 pmp_key_sound.c

📁 嵌入式系统下的文件管理处理,和基本图片jpg格式处理原代码
💻 C
字号:
/*-------------------------------------------------*
* $RCSfile: pmp_key_sound.c,v $
* $Date: 2007/01/27 10:02:14 $
* $Author: lanzhu $
* $Log: pmp_key_sound.c,v $
* Revision 1.2  2007/01/27 10:02:14  lanzhu
* 为配合新DRIVER, 发声时不再进行索引转换, 直接使用逻辑键值
*
* Revision 1.1.1.1  2007/01/17 12:28:43  lanzhu
* 齐兰柱 准备一个新的代码分支
*
* Revision 1.5  2007/01/06 09:27:52  lanzhu
* 添加LOG
*
*
*--------------------------------------------------*/


#include "SPMP_define.h"
#include "spca_general.h"
#include <string.h>
#include "SysUtility.h"
#include "appdriver.h"
#include "fs_api.h"
#include "PublicParam.h"

#include "pmp_keytone_cfg.h"

/**************************************************************************
 *                   G E N E R A L    C O N S T A N T S                   *
 **************************************************************************/

 /**************************************************************************
 *                             M A C R O S                                *
 **************************************************************************/

/**************************************************************************
 *                         D A T A   T Y P E S                            *
 **************************************************************************/

/**************************************************************************
 *                        G L O B A L   D A T A                           *
 **************************************************************************/

// 记录有无按键音的全局变量
static UINT16 gKeySoundFlag = 0;

// 记录内存中音源文件数据的内存指针, 16个音源文件在内存中装载的地址指针.
// 需要在 appentry.c 中进行初始化的动作.全部初始化为 0x00
static UINT8 * gpkeyToneFile[0x20];

// 记录读入到内存中的按键音的文件的长度
static UINT16  gpkeyToneFileLen[0x20];

// 记录当前所使用的key tone 的数据的内存指针
// 发音时直接使用这里所存放的指针值, 只要与键的个数相等就可以了.
static UINT8 * gpNowTonePtr[0x08];

 /**************************************************************************
 *                 E X T E R N A L   R E F E R E N C E S                  *
 **************************************************************************/

 /**************************************************************************
 *               F U N C T I O N   D E C L A R A T I O N S                *
 **************************************************************************/
// 将音源文件装载到内存中来
static UINT8 * load_tone_2_mem( UINT8 * pfname, UINT16 *plen);

/*  对外的接口函数 */
UINT16 SPMP_KeyTone_Init( void );				//	按键音的初始化 	
UINT16 SPMP_KeyTone_Select( UINT16 index );		//	选择一套按键音配置方案到AP中
UINT16 SPMP_KeyTone_Play( UINT16 key_value );	//  输入按键值,发送发按键音






/************************************************************************/
/*			播放按键音
  input:
			key_value	[in]	UINT16 	
  output:
			0 成功,非0值失败  
  func:
  note:					
                                                                        */
/************************************************************************/
UINT16 SPMP_KeyTone_Play( UINT16 key_value )
{
	UINT16	i,ret,index;
	UINT8	*pdata;
	UINT16	len;

#ifdef QLZ_DEBUG_0106
	sio_printf("\r\n ---- play Tone! \r\n");
#endif

	// 判断是否需要进行发音
	SPMP_KeySound_GetFlag(&i);

	if (!i) 
	{
#ifdef QLZ_DEBUG_0106
		sio_printf("\r\n ---- 按键音已关闭! \r\n");
#endif		
		return APP_DRV_OK;	
	}

	// [01/27/2006] lanzhu changed for new key driver 
	// 直接使用逻辑键盘值, 作为声音的索引.
	
	index = gpNowTonePtr[ key_value ];

#ifdef QLZ_DEBUG_26
	sio_printf("\r\n +++++ key = %d  index = 0x%x\r\n");
#endif

	if ( DUMMY_TONE == index ) 
	{
		return APP_DRV_ERR;		
	}

	pdata = gpkeyToneFile[ index ];
	len   = gpkeyToneFileLen[ index ];

#ifdef QLZ_DEBUG_01014
	sio_printf("\r\n index = %d\r\n", index );
	sio_printf("\r\n pdata = 0x%x\r\n", pdata );
	sio_printf("\r\n len   = %d\r\n", len);	
#endif

	if ( (NULL == pdata) || !len ){
		return APP_DRV_ERR;
	}

	// 使用 MIDI 作为按键音
	SPMP_AUDIO_MIDI_Play( pdata, len ); 

	return APP_DRV_OK;
}


/************************************************************************/
/*				按键音的初始化
  input:
			void 
  output:
			0 成功, 非0值失败
  func:
			
  note:
                                                                        */
/************************************************************************/
UINT16 SPMP_KeyTone_Init( void )
{
	// 将音源文件全局指针数组清空, 全部设置为无效值
	memset(gpkeyToneFile, 0x00, sizeof(gpkeyToneFile));

	// 将当前指针表, 全部设置为无效值
	memset(gpNowTonePtr, 0x00, sizeof(gpNowTonePtr));

	return APP_DRV_OK;	// 返回成功	
}

/************************************************************************/
/*				选择一套按键音作为当前的配置
  input:
			tone_cfg_index	[in]	UINT16  所选用的按键音配置方案号
  output:
			0 成功, 非0值失败
  func:
			输入按键音的配置方案索引值, 
			根据此配置数据,寻找对应的文件, 装载到内存中
			将数据指针, 全局指针数组中

                                                                        */
/************************************************************************/
UINT16 SPMP_KeyTone_Select( UINT16 index )
{
	UINT16 i;
	UINT16	file_index;
	UINT16	data_len;
	UINT16 * pbuf;

	// 获得配置表第一个位置的地址值
	pbuf = &( gKeyToneCfg[index][0] );

#ifdef QLZ_DEBUG_0104
	sio_printf("\r\n pbuf = 0x%x\r\n", pbuf);	
#endif

	for(i=0x00; i<PMP_KEY_MAX; i++ )
	{
		file_index = pbuf[i];		// 获得音源文件的代号

		
#ifdef QLZ_DEBUG_0104
	sio_printf("\r\n file_index = 0x%x\r\n", file_index);		
#endif

		// 本键值部\不需要发声
		if ( DUMMY_TONE == file_index ) 
		{
#ifdef QLZ_DEBUG_0104
	sio_printf("\r\n ------------ this is dummy %d\r\n", file_index);			
#endif
			gpNowTonePtr[i] = DUMMY_TONE;
			continue;
		}	

		// 如果内存中还没有装载该音源文件
		if ( NULL == gpkeyToneFile[file_index] ){

			// 将内存地址记录到指针数组
			gpkeyToneFile[ file_index ] = load_tone_2_mem( gpSoundFname[file_index], &data_len);
			// 将长度记录到长度数组
			gpkeyToneFileLen[ file_index ] = data_len;
		}

		// 值需要将索引值记录到当前的数组 
		gpNowTonePtr[i]	= file_index;
	}

	return APP_DRV_OK;	 // 返回成功
}

/************************************************************************/
/*				设定按键是否有声
  input:
			enable_flag		[in]	UINT16	
									ENABLE_KEY_SOUND	按键有声
									DISABLE_KEY_SOUBD	按键无声
  output:
			0 成功,非0值失败
  func:
                                                                        */
/************************************************************************/
UINT16 SPMP_KeySound_SetFlag ( UINT16 KeySoundFlag )
{
	UINT16 i;

	i = DISABLE_KEY_SOUND;

	if ( KeySoundFlag )			// 输入非0值,表示按键声 使能	 
	{
		i = ENABLE_KEY_SOUND;
	}

	gKeySoundFlag = i;

	return APP_DRV_OK;
}

/************************************************************************/
/*				获取当前程序中按键音开关的状态
  input:
			pFlag	UINT16	[out]	存放将要得到的按键音状态的指针
  output:
			0 成功,非0值失败  
  func:
                                                                        */
/************************************************************************/
UINT16 SPMP_KeySound_GetFlag( UINT16 *pSoundFlag)
{

	* pSoundFlag = gKeySoundFlag;
	return APP_DRV_OK;
}

/************************************************************************/
/*			输入音源文件的文件名字符串, 将该文件读入到内存中, 
			返回其在内存的导致指针值
  input:
			pFname	[in]	UINT8 *  文件名字符串全路径名
			plen	[out]	UINT16 * 该文件在内存中的长度值

  output:
			UINT8 * pmem	文件数据在内存中的指针值
  func:
			打开输入的音源文件, 进行内存申请, 读入数据, 将内存指针返回

			NULL		失败
			非NULL值	成功
                                                                        */
/************************************************************************/
static UINT8 * load_tone_2_mem( UINT8 * pfname, UINT16 *plen)
{
	UINT16 err; 
	UINT8 *pbuf;	
	UINT32 file_handle, file_len;
	UINT32 bytes_read;
	UINT8 buf[0x40];

	*plen = 0x00;

	strcpy(buf, SPMP_RO_RES_DIR_HEADER);
	strcat(buf, "SOUND\\");	
	strcat(buf, pfname);

#ifdef QLZ_DEBUG_0104
	sio_printf("\r\n File = %s\r\n", buf);	
#endif

	// 使用 SPMP 内部文件函数实现
	err = fsOpen(buf, (UINT32)FS_O_RDONLY, &file_handle);
	if ( err) {
		ERROR_REPORT;		
		return NULL;
	}

#ifdef QLZ_DEBUG_0104
	sio_printf("fname = %s\r\n", pfname);
	sio_printf("file handle = 0x%x\r\n", file_handle);
#endif

	// 获得文件的长度	
	err = fsSizeGet(file_handle, &file_len);
	if ( err || !file_len) {
		ERROR_REPORT;
		return NULL;
	}

#ifdef QLZ_DEBUG_0104
	sio_printf("\r\n file size = %d\r\n", file_len);	
#endif

	// 进行内存的申请
	pbuf = (UINT8 *)MEM_ALLOC( file_len+0x10);	
	if (NULL == pbuf) {
		ERROR_REPORT;
		return NULL;
	}

#ifdef QLZ_DEBUG_0104
	sio_printf("\r\n buf = 0x%x\r\n", pbuf);	
#endif

	// 进行文件的读取动作
	err = fsRead(file_handle, pbuf, file_len, &bytes_read );
	if ( err || (bytes_read != file_len) )
	{
		ERROR_REPORT;
		MEM_FREE( pbuf );
		pbuf = NULL;
	}

	*plen = bytes_read;

#ifdef QLZ_DEBUG_0104
	sio_printf("\r\n byets read = %d\r\n", bytes_read);	
#endif

	// 关闭文件
	fsClose( file_handle );

#ifdef QLZ_DEBUG_0104
	sio_printf("\r\n load file return!");	
#endif

	// 返回内存地址的指针
	return pbuf;
}


⌨️ 快捷键说明

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