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

📄 pmp_audio_driver.c

📁 嵌入式系统下的文件管理处理,和基本图片jpg格式处理原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*-------------------------------------------------*
* $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 + -