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

📄 sound.c

📁 Brew手机开发中
💻 C
📖 第 1 页 / 共 2 页
字号:

/*!
 *	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 + -