📄 pmp_audio_driver.c
字号:
/*-------------------------------------------------*
* $RCSfile: pmp_audio_driver.c,v $
* $Date: 2007/01/29 16:27:10 $
* $Author: lanzhu $
* $Log: pmp_audio_driver.c,v $
* Revision 1.3 2007/01/29 16:27:10 lanzhu
* 1. 添加了SPMP_SPEAKER_ENABLE_EX DISABLE_EX 函数, 放置按键音和
* AP 发生冲突
* 2. 解决开机第一声的 POP 音问题.
* 3. 去掉音频播放时对CODEC 的设置
*
* Revision 1.2 2007/01/27 10:00:16 lanzhu
* 修改 SPMP_SPEAKER_ENABLE/DISABLE 函数, 添加了发声标志
*
* Revision 1.1.1.1 2007/01/17 12:28:43 lanzhu
* 齐兰柱 准备一个新的代码分支
*
* Revision 1.9 2007/01/06 09:28:56 lanzhu
* 添加设定系统默认音量值的函数
*
* Revision 1.8 2007/01/06 05:26:52 cuining
* SPMP_AUDIO_GetInfo完成后,释放FW中申请的内存。
*
* Revision 1.7 2007/01/05 09:32:04 lanzhu
* no message
*
* Revision 1.6 2007/01/02 00:52:33 lanzhu
* no message
*
* Revision 1.5 2006/12/28 01:28:53 lanzhu
* 修改CODEC 的控制方式, 修改SPEAKER的控制方式
*
* Revision 1.4 2006/12/27 01:05:33 lanzhu
* 暂时屏蔽 高低速度的切换函数
*
* Revision 1.3 2006/12/18 02:14:27 taiyun
* Modify include filename
*
* Revision 1.2 2006/12/12 00:32:43 lanzhu
* 去除 WARNING, 放开了一个TABLE 设置
*
* Revision 1.1.1.1 2006/12/05 03:01:16 lanzhu
* no message
*
* Revision 1.1.1.1 2006/12/01 09:49:35 lanzhu
* no message
*
* Revision 1.6 2006/11/16 09:15:01 cuining
* 在mp3播放停止时,关闭audio模块,降低功耗
*
* Revision 1.5 2006/11/06 00:03:00 lanzhu
* 添加了 基于数据的MIDI 播放函数
*
* Revision 1.4 2006/10/28 09:20:23 lanzhu
* 逐个对底层函数进行检查, 返回 SendSignal SendSignal_T 的结果
*
* Revision 1.3 2006/10/22 15:45:04 lanzhu
* 添加了音效控制函数
*
* Revision 1.2 2006/10/16 02:10:07 cuining
* 加入扬声器是否发音控制
*
* Revision 1.1 2006/09/02 06:56:11 lanzhu
* 首次提交 AUDIO DRIVER API
*
*
*--------------------------------------------------*/
//#define AUDIO_DEBUG_1227
//#define AUDIO_DEBUG_1226
#include "SPMP_define.h"
#include "audio_api.h"
#include "mcatch_cmd.h"
#include <string.h>
#include "os_api.h"
#include "SysUtility.h"
#include "mcatch_basestruct.h"
#include "appdriver.h"
#include "pmp_io.h" // [01/27/2007] lanzhu add
/**************************************************************************
* G E N E R A L C O N S T A N T S *
**************************************************************************/
// audio EQ para
const static UINT8 audEQModeParam[6][7] = {
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{24, 24, 20, 20, 14, 9, 5 },
{20, 20, 15, 10, 2, 8, 22 },
{18, 16, 14, 1, 16, 18, 17 },
{12, 18, 4, 12, 18, 12, 8 },
{7, 10, 14, 17, 18, 10, 7 }
};
enum{
HB_VCDataOut_ADDR = 0x1000b000,
};
#define OUTPUT_VALUE_MAX (0x1f)
//#define TEST_MUSIC_S "audio\\48K320.mp3"
#define TEST_MUSIC_S "AudioAMRPly\\AMR_PLY_01.amr"
/**************************************************************************
* 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 *
**************************************************************************/
// 音频是否结束的标志
#define AUDIO_OVER_MASK (1<<0)
static UINT16 gAudioOverFlag = AUDIO_OVER_MASK;
// bit0 ------- 0 还没有结束
// ------- 1 已经真正结束
// 是否需要发声的标志
#define BIT_SOUND_FLAG (1<<0)
#define BIT_USER_FLAG (1<<1)
static UINT16 gSoundFlag = 0x00;
// BIT0 ------ 是否发声
// 0 无声
// 1 有声
// BIT1 ------ 表示 使用者身分
// 0 key tone
// 1 AP sound
// AP sound 的优先级高于 key tone
// key tone 不能关掉 AP sound
// AP sound 可以关掉 key tone
// codec 设定标志
static UINT16 gCodecFlag = 0x00;
// lanzhu add
static UINT8 audioAppTbl[33] =
#if 0
{3,7,8,9,
8,0,0,0,
0,0,0,1,
0,3,0,0,
1,7,1,1,
1,1,1,1,
0,'6','c','6',
'b','6','e','6','d'};
#else
// [03/07/2006] lanzhu for fix speaker MAX value bug
{
3,7,8,9,
8,0,0,0,
0,1,1,1,
0,3,0,0,
1,7,1,1,
1,1,1,1,
0,'6','e','6','d'
};
#endif
// cuining add
static UINT8 audioAppTbl_t[29]= {3,7,8,9,
8,0,0,1,
1,0,0,1,
0,3,0,0,
1,7,1,1,
1,1,1,1,
0,'6','c','6','b'};
/**************************************************************************
* E X T E R N A L R E F E R E N C E S *
**************************************************************************/
extern UINT8* gpAudDataBuf;
/**************************************************************************
* F U N C T I O N D E C L A R A T I O N S *
**************************************************************************/
static UINT16 mp3_playback_start( void ); // MP3 play start
static UINT8* ret_audio_buf_ptr( void ); // return address ptr
void SPMP_AUDIO_SetCodec( void );
static UINT16 get_codec_flag( void );
void SPMP_Codec_ResetFlag( void );
/************************************************************************/
/* 将将音量设定为系统默认的值
input:
void
output:
void
func:
*/
/************************************************************************/
void SPMP_AUDIO_SetDefaultValue( void )
{
SPMP_AUDIO_SetOutputValue( PMP_AUDIO_DEFAULT_VALUE );
return;
}
/************************************************************************/
/* 设定播放的音效
input:
eq_mode [in] UINT16
output:
0 成功, 非0值失败
func:
输入音效模式,设定播放时的音效
note:
使用常量数据
*/
/************************************************************************/
UINT16 SPMP_AUDIO_SetEQMode( UINT16 eq_mode )
{
UINT16 err;
UINT8 *pdata;
// 判断输入的音效模式是否合法
if ( eq_mode >= sizeof(audEQModeParam)/sizeof(audEQModeParam[0]) ) {
ERROR_REPORT;
return APP_DRV_ERR;
}
// 获得参数的地址指针
pdata = (UINT8 *) (&( audEQModeParam[eq_mode][0]));
// 进行音效的设定
err = SPMP_SendSignal((UINT16)MCATCH_CMD_AUDIO_EQ_SET,
(UINT8 *)pdata,
(UINT16)sizeof(audEQModeParam[0]) );
return err; // 返回成功
}
/************************************************************************/
/* 设定声音的位置
input:
Position [in] UINT32 歌曲声音的位置
output:
0 成功, 非0值失败
func:
设定声音的位置
note:
*/
/************************************************************************/
UINT16 SPMP_AUDIO_SetCurrSecond( UINT32 Second )
{
UINT16 err;
err = SPMP_SendSignal( (UINT16) MCATCH_CMD_AUDIO_POSITION_SET,
(UINT8 *) &Second,
(UINT16) sizeof(Second) );
return err;
}
/************************************************************************/
/* 输入需要播放的文件名, 开始该文件的播放
input:
pFileName [in] UINT8 * 文件名字符串的指针
output:
0 成功, 非0值失败
func:
note:
*/
/************************************************************************/
UINT16 SPMP_AUDIO_Play( UINT8 *pFileName )
{
UINT16 ret;
// 判断输入参数是否合法
if (NULL == pFileName) {
return APP_DRV_ERR;
}
// 如果文件不存在, 返回失败
if ( !strlen(pFileName) ) {
return APP_DRV_ERR;
}
// 设定需要播放的文件名
SPMP_sysFileNamePtrSet( MCATCH_CMD_AUDIO_GROUP, pFileName );
// 启动MP3的播放
ret = mp3_playback_start();
return ret;
}
/************************************************************************/
/* 输入MIDI 数据的地址指针,进行MIDI 的播放
input:
pMIDI [in] UINT8 * MIDI 数据的内存指针
len [in] UINT16 MIDI 数据的长度值
output:
0 成功, 非0值失败
func:
note:
[01/29/2007] 发现原来每次进行按键音发声时,都有CODEC 的设置
去除每次对CODEC 的设置动作
*/
/************************************************************************/
UINT16 SPMP_AUDIO_MIDI_Play( UINT8 * pMIDI, UINT16 len )
{
UINT16 ret;
UINT32 buf[2];
buf[0] = (UINT32) pMIDI;
buf[1] = len;
// 判断输入参数是否合法
if ( (NULL == pMIDI) || (0 == len)) {
ERROR_REPORT;
return APP_DRV_ERR;
}
// [01/29/2007] lanzhu marked
//SPMP_AUDIO_SetCodec( );
// 启动MIDI 的播放
ret = SPMP_SendSignal_T((UINT16)MCATCH_CMD_AUDIO_MIDIKEYTONE_PLAY_START,
(UINT8 *)buf, (UINT16)sizeof(buf));
return ret;
}
/************************************************************************/
/* 在歌曲播放的过程中, 获得当前已经播放了的时间
input:
pCurrSecond [out] 当前歌曲播放的时间
output:
0 成功, 非0值失败
func:
在歌曲播放的过程中, 获得当前的时间值
note:
时间值 是以"秒"为单位的。 UINT32
*/
/************************************************************************/
UINT16 SPMP_AUDIO_GetCurrSecond( UINT32 * pCurrSecond )
{
UINT8 buffer[4];
UINT32 RegAddr;
// 判断输入的参数是否合法
if ( NULL == pCurrSecond ) {
ERROR_REPORT;
return APP_DRV_ERR;
}
RegAddr = HB_VCDataOut_ADDR;
// 获得播放的时间值
buffer[0] = READ8( RegAddr++ );
buffer[1] = READ8( RegAddr++ );
buffer[2] = READ8( RegAddr++ );
buffer[3] = READ8( RegAddr );
// 进行数据的合成
*pCurrSecond = *((UINT32 *) buffer );
// 返回成功
return APP_DRV_OK;
}
/************************************************************************/
/* 输入一个文件名字符串,获得该文件的音频信息
input:
paudInfoAttr [out] 存放得到的 audio 信息的指针
output:
0 成功, 非0值失败
func:
note:
typedef struct AUDIO_CODEC_ATTR
{
UINT16 samplingrate;
UINT16 channel;
UINT16 bit;
UINT16 codectype;
} AUDIO_CODEC_ATTR;
typedef struct AUDIO_INFO_ATTR
{
UINT32 audioTotalSecond;
AUDIO_CODEC_ATTR audioCodec;
UINT16 audioFormat;
UINT16 avgBps;
UINT16 isVBR;
UINT16 isSeekable;
UINT16 isID3v2;
UINT8 title[256];
UINT8 artist[256];
UINT8 album[256];
} AUDIO_INFO_ATTR;
*/
/************************************************************************/
UINT16 SPMP_AUDIO_GetInfo( UINT8 *pFileName, void *paudInfoAttr )
{
UINT16 err;
UINT8 *ptemp;
// 判断输入的指针是否合法
if ( (NULL == paudInfoAttr) || (NULL == pFileName))
{
return APP_DRV_ERR;
}
// 设定需要播放的文件名
SPMP_sysFileNamePtrSet((UINT16)MCATCH_CMD_AUDIO_GROUP, pFileName);
// 进行信息的获得
err = SPMP_SendSignal((UINT16)MCATCH_CMD_AUDIO_INFO_GET, (UINT8 *)NULL, (UINT16)NULL);
if ( err ) {
ERROR_REPORT;
return err; // 有错误发生,报错退出
}
// 得到地址指针
//ptemp = ret_audio_buf_ptr();
// 信息的复制
memcpy(paudInfoAttr, gpAudDataBuf, sizeof(AUDIO_INFO_ATTR) );
//释放FW中申请的内存
memFree(gpAudDataBuf);
gpAudDataBuf = NULL;
return APP_DRV_OK;
}
/************************************************************************/
/* audio stop
input:
void
output:
0 成功, 非0值失败
func:
audio play stop
note:
*/
/************************************************************************/
#define AUDIO_OVER_DELAY (5)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -