📄 pmp_audio_driver.c
字号:
UINT16 SPMP_AUDIO_Stop( void )
{
UINT16 err;
// lanzhu@[12/26/2006]
err = SPMP_SendSignal((UINT16)MCATCH_CMD_AUDIO_PLAY_STOP, (UINT8 *)NULL, (UINT16)NULL);
// 如果已经成功, 还需要判断是否AUDIO TASK 已经真正结束
if ( !err )
{
// 检测结束标志, 直到AUDIO TASK 真正结束
while ( !SPMP_AUDIO_GetOverFlag() )
{
osTimeDly( AUDIO_OVER_DELAY );
#ifdef QLZ_DEBUG_0208
sio_printf("\r\n ---- AUDIO 没有结束, 等待一下!!!\r\n");
#endif
}
#ifdef QLZ_DEBUG_0208
sio_printf("\r\n ---- AUDIO 已经真正结束了!\r\n");
#endif
}
// 返回成功
return err;
}
/************************************************************************/
/* audio pause
input:
output:
0 成功, 非0值失败
func:
note:
*/
/************************************************************************/
UINT16 SPMP_AUDIO_Pause( void )
{
// 进行音量的设定
return SPMP_SendSignal((UINT16)MCATCH_CMD_AUDIO_PAUSE, (UINT8 *)NULL, (UINT16)NULL);
}
/************************************************************************/
/* audio resume
input:
void
output:
0 成功, 非0值失败
func:
note:
*/
/************************************************************************/
UINT16 SPMP_AUDIO_Resume( void )
{
// 进行音量的设定
return SPMP_SendSignal((UINT16)MCATCH_CMD_AUDIO_RESUME, (UINT8 *)NULL, (UINT16)NULL);
}
/************************************************************************/
/* 设定输出的音量值
input:
UINT16 OutputValue
output:
0 成功, 非0值失败
func:
设定 Codec, 启动MP3 的播放
note:
*/
/************************************************************************/
UINT16 SPMP_AUDIO_SetOutputValue( UINT16 OutputValue )
{
UINT16 value,err;
value = OutputValue;
// 判断输入的参数是否越界
if (value > OUTPUT_VALUE_MAX ) {
value = OUTPUT_VALUE_MAX;
}
#ifdef QLZ_DEBUG_0127
sio_printf("\r\n ++++++++ 音量设定 ======= %d \r\n", OutputValue);
#endif
// 进行音量的设定
err = SPMP_SendSignal((UINT16)MCATCH_CMD_AUDIO_VOLUME_SET,
(UINT8 *)&(value),
(UINT16)sizeof(value));
// 返回成功
return err;
}
extern void SPMP_Codec_ResetFlag( void );
extern void SPMP_AUDIO_SetCodec( void );
/*
* reset codec flag
*/
void SPMP_Codec_ResetFlag( void )
{
gCodecFlag = 0x00;
return;
}
/*
* get codec flag
*/
static UINT16 get_codec_flag( void )
{
return gCodecFlag;
}
/************************************************************************/
/* 进行CODEC 的设置
input:
void
output:
void
function:
进行CODEC 的设置
history:
[01/29/2007]
发现用户通过界面第一次发生时, 还可以从SPEAKER 中听到爆音
*/
/************************************************************************/
void SPMP_AUDIO_SetCodec( void )
{
if ( get_codec_flag() )
{
return;
}
#ifdef QLZ_DEBUG_0129
sio_printf("\r\n -- 进行CODEC 的真正设置!");
#endif
gCodecFlag ++;
if( 1==SPMP_SpeakOutGet() )
{
#ifdef QLZ_DEBUG_0129
sio_printf("\r\n -- 全通道设置!!!!");
#endif
audCodecSet(audioAppTbl, sizeof(audioAppTbl));
}
else
{
#ifdef QLZ_DEBUG_0129
sio_printf("\r\n -- 只有耳机,没有SPEAKER!");
#endif
audCodecSet(audioAppTbl_t, sizeof(audioAppTbl_t));
}
return;
}
/************************************************************************/
/* 使能 SPEAKER
input:
void
output:
void
func:
判断用户是否设定打开SPEAKER 的功放, 判断当前是否有耳机
如果用户使能了功放, 并且没有耳机, 打开 SPEAKER 的功放
history:
[01/27/2007] lanzhu 发现没有考虑到耳机一直插入的状况,
添加对耳机插入的判断
FIX: mantis bug 6769
[01/27/2007] lanzhu 添加 发声标志的设置
[01/29/2007] lanzhu 考虑到不同的TASK 在时间上冲突, 完善了该机制
*/
/************************************************************************/
void SPMP_SPEAKER_ENABLE( void )
{
UINT16 i;
#ifdef QLZ_DEBUG_0206
sio_printf("\r\n >>> SPKER ENABLE!\r\n");
#endif
gSoundFlag = (BIT_USER_FLAG | BIT_SOUND_FLAG);
i = SPMP_SpeakOutGet();
// 只取决于用户的设定和当时耳机的状态
if ( i && ( HEADPHONE_OUT == SPMP_Get_HPStatus() ) ){
SPMP_Speaker_Set(i);
}
#ifdef QLZ_DEBUG_0206
sio_printf("\r\n <<< SPKER ENABLE!\r\n");
#endif
return;
}
/*
*
*/
void SPMP_SPEAKER_ENABLE_EX( void )
{
UINT16 i;
#ifdef QLZ_DEBUG_0206
sio_printf("\r\n >>> SPKER ENABLE EX!\r\n");
#endif
gSoundFlag |= BIT_SOUND_FLAG;
i = SPMP_SpeakOutGet();
// 只取决于用户的设定和当时耳机的状态
if ( i && ( HEADPHONE_OUT == SPMP_Get_HPStatus() ) ){
SPMP_Speaker_Set(i);
}
#ifdef QLZ_DEBUG_0206
sio_printf("\r\n <<< SPKER ENABLE EX!\r\n");
#endif
return;
}
/************************************************************************/
/* 关闭 SPEAKER 的功放
input:
void
output:
void
func:
history:
[01/27/2007] 添加了一个判断条件, 对耳机进行检测
[01/29/2007] 添加 不同任务之间使用该函数的完善机制
*/
/************************************************************************/
void SPMP_SPEAKER_DISABLE( void )
{
UINT16 i;
#ifdef QLZ_DEBUG_0206
sio_printf("\r\n >>> SPKER DISABLE!\r\n");
#endif
gSoundFlag = 0x00; // lanzhu add @[01/27/2007]
i = SPMP_SpeakOutGet();
#ifdef QLZ_DEBUG_0206
sio_printf(" i = 0x%x\r\n", i);
#endif
// 只取决于当前用户的设定和当时耳机的状态
if ( i && (HEADPHONE_OUT == SPMP_Get_HPStatus() ) )
{
SPMP_Speaker_Set( 0x00 );
}
#ifdef QLZ_DEBUG_0206
sio_printf("\r\n <<< SPKER DISABLE!\r\n");
#endif
return;
}
/************************************************************************/
/* 按键音使用的关闭SPEAKER 的函数
input:
void
output:
void
func:
在播放按键音完成后, 关闭SPEAKER 的功放
*/
/************************************************************************/
void SPMP_SPEAKER_DISABLE_EX( void )
{
UINT16 i;
#ifdef QLZ_DEBUG_0206
sio_printf("\r\n >>> SPKER DISABLE EX!\r\n");
#endif
if( gSoundFlag == (BIT_USER_FLAG |BIT_SOUND_FLAG) )
{
#ifdef QLZ_DEBUG_0206
sio_printf("\r\n --- dis speak just ret!\r\n");
#endif
return;
}
// [02/06/2007] lanzhu add fix mantis bug 7342
if( HEADPHONE_OUT == SPMP_Get_HPStatus()){
SPMP_Speaker_Set( 0x00 );
}
#ifdef QLZ_DEBUG_0206
sio_printf("\r\n <<< SPKER DISABLE EX!\r\n");
#endif
return;
}
/*
*
*/
UINT16 SPMP_Get_SoundFlag( void )
{
return (gSoundFlag&BIT_SOUND_FLAG);
}
/************************************************************************/
/* MP3 playback start
input:
void
output:
0 成功, 非0值失败
func:
设定 Codec, 启动MP3 的播放
note:
[01/29/2007] 发现每次进行音频播放时, 有CODEC 的设置动作,
不需要这样做.
*/
/************************************************************************/
static UINT16 mp3_playback_start( void )
{
AUDIO_PLAY_ATTR audAttr;
// [01/29/2007] lanzhu marked
//SPMP_AUDIO_SetCodec( ); // 进行CODEC 的设置
// 设定播放的属性
memset(&audAttr, 0x00, sizeof(audAttr));
audAttr.startSecond = 0;
audAttr.audioCodec.codectype = MCATCH_AUDIO_CODEC_INTERNAL;
// 启动音频播放
return SPMP_SendSignal_T( (UINT16)MCATCH_CMD_AUDIO_PLAY_START,
(UINT8 *)&(audAttr),
(UINT16)sizeof(AUDIO_PLAY_ATTR));
}
/************************************************************************/
/* 获得音频信息的指针
input:
void
output:
地址指针
func:
获得 Audio 的地址指针
*/
/************************************************************************/
static UINT8 * ret_audio_buf_ptr( void )
{
return gpAudDataBuf;
}
/************************************************************************/
/* 设定AUDIO 结束标志
input:
flag [in] UINT16
0 没有结束
非0 值 已经结束
output:
0 成功, 非0值失败
func:
设定AUDIO 结束标志
note:
用于AUDIO PLAY 的真正结束, 以此来在2个AP之间击西宁动作的协调
*/
/************************************************************************/
UINT16 SPMP_AUDIO_SetOverFlag( UINT16 flag )
{
// 首先将该位复位为空
gAudioOverFlag &= ~AUDIO_OVER_MASK;
if ( flag )
{
#ifdef QLZ_DEBUG_0208
sio_printf("\r\n 设定 AUDIO 真正结束 \r\n");
#endif
gAudioOverFlag |= AUDIO_OVER_MASK;
}
return APP_DRV_OK;
}
/************************************************************************/
/* 获得AUDIO 结束标志
input:
void
output:
0 还没有结束
非0值 已经真正结束
func:
通过此标志判断 AUDIO 的动作是否真正结束
note:
*/
/************************************************************************/
UINT16 SPMP_AUDIO_GetOverFlag( void )
{
#ifdef QLZ_DEBUG_0208
sio_printf("\r\n Over Flag = 0x%x\r\n", gAudioOverFlag);
#endif
// 目前只使用 BIT0 来进行是否结束的标志
return (gAudioOverFlag & AUDIO_OVER_MASK);
}
/*
[03/07/2007] lanzhu add
input:
speaker_flag [in] 0 ear phone
非0 值 speaker
output:
void
func:
用于切换耳机和SPEAKER
*/
void SPMP_AUDIO_SetCodecPath( UINT16 speaker_flag )
{
if(speaker_flag)
{
audCodecSet(audioAppTbl, sizeof(audioAppTbl));
}
else{
audCodecSet(audioAppTbl_t, sizeof(audioAppTbl_t));
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -