📄 pmp_key_sound.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 + -