📄 sound.c
字号:
/*!
* Example program.
* Copyright (c) 2004 by BREW Development Team, Zhejiang University.
* All Rights Reserved.
*/
/*!-----------------------------------
@file sound.c
@author TYB
@brief 程序主文件
-----------------------------------*/
#include "AEEModGen.h"
#include "AEEAppGen.h"
#include "AEEShell.h"
#include "AEESound.h"
#include "AEEMenu.h"
#include "AEEStdLib.h"
#include "AEEMedia.h"
typedef struct _CSound{
AEEApplet a;
ISound *pISound;
ISoundPlayer *pISoundPlayer;
IMedia *pIMedia;
IMenuCtl *pIMenu;
AEESoundToneData*pToneData;
uint16 nTones;
uint16 wVolume; //标记音量大小
uint32 nPlayTime;
}CSound;
#define USAGE_GET 103
#define USAGE_SETDEVICE 104
#define USAGE_PLAYTONE 105
#define USAGE_PLAYTONELIST 106
#define USAGE_PLAYFREQTONE 107
#define USAGE_VIBRATE 109
#define USAGE_SETVOLUMEUP 110
#define USAGE_SETVOLUMEDOWN 111
#define USAGE_GETVOLUME 112
#define USAGE_BEEP 113
#define USAGE_PLAYMP3 114
#define USAGE_PAUSE 115
#define USAGE_RESUME 116
#define USAGE_STOP 117
#define USAGE_FORWARD 118
#define USAGE_REWIND 119
#define USAGE_PLAYQCP 120
#define USAGE_PLAYMIDI 121
#define USAGE_MEDIAPLAY 122
#define USAGE_MEDIASTOP 123
#define USAGE_MEDIAPAUSE 124
#define USAGE_MEDIARESUME 125
#define HIGHFREQ 600
#define LOWFREQ 200
#define PLAY_DURATION1 3000 // In milliseconds
#define PLAY_DURATION2 4000
#define PLAY_DURATION3 5000
#define PLAY_DURATION4 6000
/*!
Function Prototypes
*/
static boolean sound_HandleEvent(IApplet * pi,AEEEvent eCode,uint16 wParam,uint32 dwParam);
static boolean InitData(IApplet* pMe);
static void FreeAppData(IApplet* pme);
static void SoundCBFun(void * pUser, AEESoundCmd eCBType, AEESoundStatus eStatus, uint32 dwParam);
static void MediaCBFun(void * pUser, AEEMediaCmdNotify *pCmdNotify);
static void SoundPlayerCBFn(void *pUser, AEESoundPlayerCmd eCBType, AEESoundPlayerStatus eStatus, uint32 dwParam);
static void BuildMainMenu(CSound *pMe);
static void DisplayOutput(CSound * pMe, char *pszStr);
boolean SoundPlay(CSound *pme , int16 mark);
void ExecuteCommand(CSound *pme , int16 wParam);
/*!
Function Defintions
*/
//--------------------------------------------------------------------------------------
/*!
* @brief: 小程序初始化函数
* @para: ClsId小程序的ClassID
* @para: pIShell底层传递来的指向IShell接口的指针
* @para: po指向IModule接口的指针
* @para: ppObj用于初始化以后返回AEEApplet结构的指针
* @return: AEE_SUCCESS表示成功,EFAILED表示失败
*/
int AEEClsCreateInstance(AEECLSID ClsId,IShell * pIShell,IModule * po,void ** ppObj)
{
*ppObj = NULL;
if(AEEApplet_New(sizeof(CSound),
ClsId,
pIShell,
po,
(IApplet**)ppObj,
(AEEHANDLER)sound_HandleEvent,
(PFNFREEAPPDATA)FreeAppData)){
if (InitData((IApplet*)*ppObj) == TRUE){
return(AEE_SUCCESS);
}
}
return (EFAILED);
}
/*!
* @brief: 消息处理函数
* @para: pi指向IApplet接口的指针
* @para: eCode消息代码
* @para: wParam是16位的参数
* @para: dwParam是32位的参数
* @return: TRUE表示处理过,FALSE没有处理
*/
static boolean sound_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam)
{
CSound *pme = (CSound*)pi;
switch (eCode)
{
case EVT_APP_START:
if(SUCCESS == ISHELL_CreateInstance(pme->a.m_pIShell, AEECLSID_MENUCTL, (void **)&pme->pIMenu))
{
ISHELL_CreateInstance(pme->a.m_pIShell, AEECLSID_SOUND, (void **)&pme->pISound);
ISHELL_CreateInstance(pme->a.m_pIShell, AEECLSID_SOUNDPLAYER, (void **)&pme->pISoundPlayer);
ISHELL_CreateInstance(pme->a.m_pIShell, AEECLSID_MEDIAMP3, (void**)&pme->pIMedia);
BuildMainMenu(pme);
}
return TRUE;
case EVT_APP_STOP:
return TRUE;
case EVT_KEY:
if(pme->pIMenu != NULL && (IMENUCTL_IsActive(pme->pIMenu) == TRUE))
{
return IMENUCTL_HandleEvent(pme->pIMenu, EVT_KEY, wParam, 0);
}
else if(pme->pIMenu != NULL && (IMENUCTL_IsActive(pme->pIMenu) == FALSE))
{
if(wParam == AVK_CLR)
{
// 清除回调函数
ISOUND_RegisterNotify(pme->pISound, NULL, NULL);
ISOUNDPLAYER_RegisterNotify(pme->pISoundPlayer, NULL, NULL);
ISOUND_StopTone (pme->pISound);
ISOUND_StopVibrate (pme->pISound);
// 重新回到菜单界面
IMENUCTL_SetActive(pme->pIMenu, TRUE);
return TRUE;
}
}
break;
case EVT_COMMAND:
ExecuteCommand(pme , wParam);
return TRUE;
default:
break;
}
return FALSE;
}
/*!
* @brief: 初始化函数
* @para: pMe指向IApplet接口的指针
* @return: TRUE表示成功,FALSE表示失败
*/
static boolean InitData(IApplet* pMe)
{
if(pMe != NULL){
CSound *pme = (CSound*)pMe;
pme->pIMenu = NULL;
pme->pISound= NULL;
pme->pIMedia= NULL;
pme->pISoundPlayer = NULL;
pme->pToneData = NULL;
pme->nTones = 0;
pme->wVolume= 100;
return TRUE;
}
else
return FALSE;
}
/*!
* @brief: 资源释放函数
* @para: pMe指向IApplet接口的指针
*/
static void FreeAppData(IApplet* pme)
{
CSound *pMe = (CSound*)pme;
if(pMe->pIMenu){
IMENUCTL_Release(pMe->pIMenu);
pMe->pIMenu = NULL;
}
if(pMe->pISound){
ISOUND_RegisterNotify(pMe->pISound, NULL, NULL);
ISOUND_StopTone (pMe->pISound);
if(pMe->pToneData){
FREE(pMe->pToneData);
pMe->pToneData = NULL;
pMe->nTones = 0;
}
ISOUND_StopVibrate (pMe->pISound);
ISOUND_Release(pMe->pISound);
pMe->pISound = NULL;
}
if(pMe->pIMedia) {
IMEDIA_RegisterNotify(pMe->pIMedia, NULL, NULL);
IMEDIA_Stop(pMe->pIMedia);
IMEDIA_Release(pMe->pIMedia);
pMe->pIMedia = NULL;
}
if(pMe->pISoundPlayer) {
ISOUNDPLAYER_RegisterNotify(pMe->pISoundPlayer, NULL, NULL);
ISOUNDPLAYER_Stop(pMe->pISoundPlayer);
ISOUNDPLAYER_Release (pMe->pISoundPlayer);
pMe->pISoundPlayer = NULL;
}
}
/*!
* @brief: 程序的主要功能模块
* @para: pme指向CSound结构的指针
* @para: mark标记当前菜单命令编号
* @return: TRUE表示成功,FALSE表示失败
*/
boolean SoundPlay(CSound *pme , int16 mark)
{
AEESoundToneData toneData;
AEESoundInfo sndInfo= {0};
uint16 wHiFreq = HIGHFREQ;
uint16 wLoFreq = LOWFREQ;
uint16 wDuration = PLAY_DURATION3;
uint16 w16Duration = PLAY_DURATION3;
AEEMediaData mediadata;
AEESoundPlayerInfo Info;
Info.pData = "midi.mid";
Info.dwSize = 0;
Info.eInput = SDT_FILE;
mediadata.pData = "midi.mid";
mediadata.dwSize = 0;
mediadata.clsData = MMD_FILE_NAME;
if(!pme->pISound || !pme->pIMedia || !pme->pISoundPlayer)
return FALSE;
//注册回调函数,以便于和小程序通信
ISOUND_RegisterNotify(pme->pISound, &SoundCBFun, (void *)pme);
IMEDIA_RegisterNotify(pme->pIMedia, &MediaCBFun, (void *)pme);
ISOUNDPLAYER_RegisterNotify(pme->pISoundPlayer, &SoundPlayerCBFn, (void *)pme);
switch(mark) {
//播放一个固定声调
case USAGE_PLAYTONE:
toneData.eTone = AEE_TONE_RING_A;
toneData.wDuration = PLAY_DURATION1;
ISOUND_PlayTone (pme->pISound, toneData);
return TRUE;
//取得当前设备信息
case USAGE_GET:
ISOUND_Get (pme->pISound, &sndInfo);
return TRUE;
//设置设备的参数
case USAGE_SETDEVICE:
sndInfo.eDevice = AEE_SOUND_DEVICE_CURRENT;
sndInfo.eMethod = AEE_SOUND_METHOD_RING;
sndInfo.eAPath = AEE_SOUND_APATH_LOCAL;
sndInfo.eEarMuteCtl = AEE_SOUND_MUTECTL_UNMUTED;
sndInfo.eMicMuteCtl = AEE_SOUND_MUTECTL_UNMUTED;
ISOUND_Set(pme->pISound, &sndInfo);
ISOUND_SetDevice(pme->pISound);
return TRUE;
//播放音调列表
case USAGE_PLAYTONELIST:
pme->nTones = 4;
pme->pToneData = MALLOC(sizeof(AEESoundToneData)*pme->nTones);
pme->pToneData[0].eTone = AEE_TONE_RING_B;
pme->pToneData[0].wDuration = PLAY_DURATION2;
pme->pToneData[1].eTone = AEE_TONE_RING_A;
pme->pToneData[1].wDuration = PLAY_DURATION1;
pme->pToneData[2].eTone = AEE_TONE_0;
pme->pToneData[2].wDuration = PLAY_DURATION2;
pme->pToneData[3].eTone = AEE_TONE_1;
pme->pToneData[3].wDuration = PLAY_DURATION3;
ISOUND_PlayToneList (pme->pISound, pme->pToneData, pme->nTones);
return TRUE;
//播放一个给定高低频率的音调
case USAGE_PLAYFREQTONE:
ISOUND_PlayFreqTone (pme->pISound, wHiFreq, wLoFreq, wDuration);
return TRUE;
//产生振动
case USAGE_VIBRATE:
ISOUND_Vibrate(pme->pISound, w16Duration);
return TRUE;
//取得当前的声音大小参数
case USAGE_GETVOLUME:
ISOUND_GetVolume (pme->pISound);
return TRUE;
//加大音量
case USAGE_SETVOLUMEUP:
if(pme->wVolume <= AEE_MAX_VOLUME) {
pme->wVolume += 10;
pme->wVolume = pme->wVolume > AEE_MAX_VOLUME ? AEE_MAX_VOLUME : pme->wVolume;
}
ISOUND_SetVolume(pme->pISound,pme->wVolume);
return TRUE;
//减少音量
case USAGE_SETVOLUMEDOWN:
if(pme->wVolume >= 10) {
pme->wVolume -= 10;
pme->wVolume = pme->wVolume < 10 ? 11 : pme->wVolume;
}
ISOUND_SetVolume(pme->pISound,pme->wVolume);
return TRUE;
//利用IShell接口的ISHELL_Beep函数来播放系统蜂鸣声或振动
//该函数是直到播放完毕才返回一个值标记是否播放成功,与回调机制不同
case USAGE_BEEP:
ISHELL_Beep(pme->a.m_pIShell, BEEP_OFF, FALSE);
ISHELL_Beep(pme->a.m_pIShell, BEEP_ALERT, FALSE);
ISHELL_Beep(pme->a.m_pIShell, BEEP_ALERT, TRUE);
ISHELL_Beep(pme->a.m_pIShell, BEEP_REMINDER, FALSE);
ISHELL_Beep(pme->a.m_pIShell, BEEP_REMINDER, TRUE);
ISHELL_Beep(pme->a.m_pIShell, BEEP_MSG, FALSE);
ISHELL_Beep(pme->a.m_pIShell, BEEP_MSG, TRUE);
ISHELL_Beep(pme->a.m_pIShell, BEEP_ERROR, FALSE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -