?? 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 函數(shù), 放置按鍵音和
* AP 發(fā)生沖突
* 2. 解決開機第一聲的 POP 音問題.
* 3. 去掉音頻播放時對CODEC 的設(shè)置
*
* Revision 1.2 2007/01/27 10:00:16 lanzhu
* 修改 SPMP_SPEAKER_ENABLE/DISABLE 函數(shù), 添加了發(fā)聲標(biāo)志
*
* Revision 1.1.1.1 2007/01/17 12:28:43 lanzhu
* 齊蘭柱 準(zhǔn)備一個新的代碼分支
*
* Revision 1.9 2007/01/06 09:28:56 lanzhu
* 添加設(shè)定系統(tǒng)默認音量值的函數(shù)
*
* Revision 1.8 2007/01/06 05:26:52 cuining
* SPMP_AUDIO_GetInfo完成后,釋放FW中申請的內(nèi)存。
*
* 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
* 暫時屏蔽 高低速度的切換函數(shù)
*
* 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 設(shè)置
*
* 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播放停止時,關(guān)閉audio模塊,降低功耗
*
* Revision 1.5 2006/11/06 00:03:00 lanzhu
* 添加了 基于數(shù)據(jù)的MIDI 播放函數(shù)
*
* Revision 1.4 2006/10/28 09:20:23 lanzhu
* 逐個對底層函數(shù)進行檢查, 返回 SendSignal SendSignal_T 的結(jié)果
*
* Revision 1.3 2006/10/22 15:45:04 lanzhu
* 添加了音效控制函數(shù)
*
* Revision 1.2 2006/10/16 02:10:07 cuining
* 加入揚聲器是否發(fā)音控制
*
* 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 *
**************************************************************************/
// 音頻是否結(jié)束的標(biāo)志
#define AUDIO_OVER_MASK (1<<0)
static UINT16 gAudioOverFlag = AUDIO_OVER_MASK;
// bit0 ------- 0 還沒有結(jié)束
// ------- 1 已經(jīng)真正結(jié)束
// 是否需要發(fā)聲的標(biāo)志
#define BIT_SOUND_FLAG (1<<0)
#define BIT_USER_FLAG (1<<1)
static UINT16 gSoundFlag = 0x00;
// BIT0 ------ 是否發(fā)聲
// 0 無聲
// 1 有聲
// BIT1 ------ 表示 使用者身分
// 0 key tone
// 1 AP sound
// AP sound 的優(yōu)先級高于 key tone
// key tone 不能關(guān)掉 AP sound
// AP sound 可以關(guān)掉 key tone
// codec 設(shè)定標(biāo)志
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 );
/************************************************************************/
/* 將將音量設(shè)定為系統(tǒng)默認的值
input:
void
output:
void
func:
*/
/************************************************************************/
void SPMP_AUDIO_SetDefaultValue( void )
{
SPMP_AUDIO_SetOutputValue( PMP_AUDIO_DEFAULT_VALUE );
return;
}
/************************************************************************/
/* 設(shè)定播放的音效
input:
eq_mode [in] UINT16
output:
0 成功, 非0值失敗
func:
輸入音效模式,設(shè)定播放時的音效
note:
使用常量數(shù)據(jù)
*/
/************************************************************************/
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;
}
// 獲得參數(shù)的地址指針
pdata = (UINT8 *) (&( audEQModeParam[eq_mode][0]));
// 進行音效的設(shè)定
err = SPMP_SendSignal((UINT16)MCATCH_CMD_AUDIO_EQ_SET,
(UINT8 *)pdata,
(UINT16)sizeof(audEQModeParam[0]) );
return err; // 返回成功
}
/************************************************************************/
/* 設(shè)定聲音的位置
input:
Position [in] UINT32 歌曲聲音的位置
output:
0 成功, 非0值失敗
func:
設(shè)定聲音的位置
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;
// 判斷輸入?yún)?shù)是否合法
if (NULL == pFileName) {
return APP_DRV_ERR;
}
// 如果文件不存在, 返回失敗
if ( !strlen(pFileName) ) {
return APP_DRV_ERR;
}
// 設(shè)定需要播放的文件名
SPMP_sysFileNamePtrSet( MCATCH_CMD_AUDIO_GROUP, pFileName );
// 啟動MP3的播放
ret = mp3_playback_start();
return ret;
}
/************************************************************************/
/* 輸入MIDI 數(shù)據(jù)的地址指針,進行MIDI 的播放
input:
pMIDI [in] UINT8 * MIDI 數(shù)據(jù)的內(nèi)存指針
len [in] UINT16 MIDI 數(shù)據(jù)的長度值
output:
0 成功, 非0值失敗
func:
note:
[01/29/2007] 發(fā)現(xiàn)原來每次進行按鍵音發(fā)聲時,都有CODEC 的設(shè)置
去除每次對CODEC 的設(shè)置動作
*/
/************************************************************************/
UINT16 SPMP_AUDIO_MIDI_Play( UINT8 * pMIDI, UINT16 len )
{
UINT16 ret;
UINT32 buf[2];
buf[0] = (UINT32) pMIDI;
buf[1] = len;
// 判斷輸入?yún)?shù)是否合法
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;
}
/************************************************************************/
/* 在歌曲播放的過程中, 獲得當(dāng)前已經(jīng)播放了的時間
input:
pCurrSecond [out] 當(dāng)前歌曲播放的時間
output:
0 成功, 非0值失敗
func:
在歌曲播放的過程中, 獲得當(dāng)前的時間值
note:
時間值 是以"秒"為單位的。 UINT32
*/
/************************************************************************/
UINT16 SPMP_AUDIO_GetCurrSecond( UINT32 * pCurrSecond )
{
UINT8 buffer[4];
UINT32 RegAddr;
// 判斷輸入的參數(shù)是否合法
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 );
// 進行數(shù)據(jù)的合成
*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;
}
// 設(shè)定需要播放的文件名
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; // 有錯誤發(fā)生,報錯退出
}
// 得到地址指針
//ptemp = ret_audio_buf_ptr();
// 信息的復(fù)制
memcpy(paudInfoAttr, gpAudDataBuf, sizeof(AUDIO_INFO_ATTR) );
//釋放FW中申請的內(nèi)存
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)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -