Upload
clio
View
38
Download
0
Embed Size (px)
DESCRIPTION
15. ISound, ISoundPlayer API. 15.1 ISound API ISound 인터페이스는 기본적인 사운드 서비스를 제공한다 . 이러한 서비스에서는 경보 , 벨 , 진동 등의 다양한 음색을 재생하고 목록으로 관리한다 . - PowerPoint PPT Presentation
Citation preview
임베디드 모바일 프로그래밍 1
15. ISound, ISoundPlayer API
15.1 ISound API
ISound 인터페이스는 기본적인 사운드 서비스를 제공한다 . 이러한 서비스에서는 경보 , 벨 , 진동 등의 다양한 음색을 재생하고 목록으로 관리한다 .
ISound 에서는 명시적으로 중지하기 전까지 일정 시간 또는 연속하여 재생 가능한 음색의 모음을 정의한다 . 목록에 음색 ID 를 넣을 수 있으며 함수를 한 번만 호출하여 목록에 있는 모든 음색을 재생할 수 있다 . 또한 ISound 인터페이스는 볼륨을 가져오고 설정하는 함수를 제공한다 .
ISound 인터페이스를 사용하려면 ClassID AEECLSID_SOUND 를 사용하여 ISound 인터페이스의 인스턴스를 만든다 .
AEECallback 은 API 작업을 스케줄링하기 위한 일반화 구조체로서 프로시저 " 콜백 " 을 통해 클라이언트에게 API 를 알립니다 .
ISound_PlayerTone 함수
• 이 함수는 지정된 시간 동안 음색 ID 가 주어진 음색을 재생한다 .
• 작업 결과는 BREW 가 설치된 <\BREW> 디렉터리의 <\bin\DataFiles> 하위 디렉터리에 있는 콜백 함수를 통해서 클라이언트에 전달됩니다 .
임베디드 모바일 프로그래밍 2
15. ISound, ISoundPlayer API
함수 형식void ISOUND_PlayTone (ISound * pISound, AEESoundToneData toneData)
기능 지정된 시간 동안 음색 ID 가 주어진 음색을 재생한다매개변수 pISound ISound 인터페이스 개체에 대한 포인터입니다 .
toneData ToneID 와 음색이 재생되는 재생 시간 ( 밀리초 ) 을 포함하는 구조체입니다 .
반환값 없음
AEESoundStatus 자료형• AEESoundStatus 는 콜백 함수로 반환되어 ISound 이벤트를 지정하고 응용 프로그램에
데이터를 반환한다 .
• AEESoundStatus 자료형의 구조 typedef enum { AEE_SOUND_UNKNOWN,
AEE_SOUND_SUCCESS,
AEE_SOUND_PLAY_DONE,
AEE_SOUND_FAILURE,
AEE_SOUND_LAST
} AEESoundStatus;
임베디드 모바일 프로그래밍 3
15. ISound, ISoundPlayer API• 필드 AEE_SOUND_UNKNOWN : 알 수 없는 상태
AEE_SOUND_SUCCESS : 요청을 수락
AEE_SOUND_PLAY_DONE : 음색의 재생이 완료되거나 다른 음색에 의해 무시
AEE_SOUND_FAILURE : 이 요청에 오류가 발생
AEE_SOUND_LAST : 예약됨
• 음색에 대해 재생 시간 (toneData) 을 0 으로 설정하면 해당 음색은 ISOUND_StopTone() 을 호출할 때까지 재생된다 .
ISound_StopTone 함수• 현재의 음색 재생을 중지하거나 음색 목록 재생을 끝낸다 .
• BREW 시뮬레이터에서 이 함수는 진동음이 재생되고 있는 경우 그 진동음을 중지한다 .
• 작업 결과는 콜백 함수 포인터를 통해 클라이언트로 전달됩니다 . 또한 작업이 완료되면 같은 콜백 함수 포인터를 통해 작업이 완료되었음을 클라이언트에 알린다 . 상태는 다음 값들 중 하나일 수 있다 .
- AEE_SOUND_SUCCESS: 중지 명령을 받아들인 경우 . 음색 또는 음색 목록 재생이 활성화되어 있으면 AEE_SOUND_PLAY_DONE 콜백도 생성한다 .
- AEE_SOUND_FAILURE: 작업이 실패하여 중지 명령을 받아들이지 않은 경우
임베디드 모바일 프로그래밍 4
15. ISound, ISoundPlayer API ISound_RegisterNotify 함수
• 이 함수는 상태 콜백 함수를 등록한다 .
함수 형식void ISOUND_RegisterNotify (ISound * pISound, PFNSOUNDSTATUS pfn, const void * pUser)
기능 상태 메시지를 처리하는 콜백 함수를 등록하기 위해 사용한다 .
매개변수
pISound ISound 인터페이스 개체에 대한 포인터
pfn 상태 콜백 함수 포인터입니다 . 콜백이 필요하지 않은 경우에는 NULL을 반환한다
pUser 트랜잭션의 고유한 상관 관계 / 식별을 위한 사용자 데이터 . 이 정보는 ISound 에서 검색하거나 처리하지 않으며 식별 데이터가 필요하지 않은 경우에는 NULL 이 될 수 있다 . 트랜잭션을 서로 연관시키기 위해 동일한 데이터 포인터가 콜백 상태와 함께 클라이언트로 다시 전달된다 .
출력 없음
AEESoundCmd 자료형
• AEESoundCmd 는 ISound 에 의해 이벤트와 데이터를 응용 프로그램으로 보내는데 사용되는 콜백 형식을 지정한다 .
임베디드 모바일 프로그래밍 5
15. ISound, ISoundPlayer API• AEESoundCmd 자료형의 구조
typedef enum {
AEE_SOUND_STATUS_CB,
AEE_SOUND_VOLUME_CB
} AEESoundCmd;
• 필드
- AEE_SOUND_STATUS_CB : ISound 상태 콜백
- AEE_SOUND_VOLUME_CB : 볼륨 콜백
ISound_PlayToneList 함수
• 음색 목록에서 음색 ID 가 주어진 음색을 지정된 시간 동안 재생한다 .
• 음색 목록의 재생을 끝내려면 ISOUND_StopTone() 을 호출한다 . 목록에 있는 모든 음색의 재생 시간을 0 으로 설정하면 ISOUND_StopTone() 을 호출할 때까지 음색이 재생된다 .
• 음색 목록에 있는 각 음색에 대한 재생 결과가 콜백 함수 포인터를 통해 클라이언트로 전달된다 . 또한 작업이 완료되면 같은 콜백 함수 포인터를 통해 작업이 완료되었음을 클라이언트에 알린다 .
임베디드 모바일 프로그래밍 6
15. ISound, ISoundPlayer API
- AEE_SOUND_SUCCESS: 음색 목록에 있는 각 음색을 재생한 경우
- AEE_SOUND_FAILURE: 음색 목록에 있는 음색 재생에 실패하여 음색 목록 재생이 끝난 경우
- AEE_SOUND_PLAY_DONE: 톤 재생이 완료된 후 목록에 있는 각각의 톤에 대해 수신된다 .
함수 형식void ISOUND_PlayToneList (ISound * pISound, AEESoundToneData * pToneData,
uint16 wDataLen)
기 능 여러 종류의 음색을 재생하기 위해 사용한다 .
매개변수
pISound ISound 인터페이스 개체에 대한 포인터입니다 .
pToneData ToneID 와 해당 음색에 대한 재생 시간 ( 밀리초 ) 을 포함하는 AEESoundToneData 구조의 목록 ( 배열 ) 입니다 .
wDataLen pToneData 목록에 있는 음색의 수입니다 .
반환값 없음
임베디드 모바일 프로그래밍 7
15. ISound, ISoundPlayer API
ISound_Vibrate 함수
• 지정된 시간 동안 또는 ISOUND_StopVibrate() 를 호출할 때까지 장치에서 진동음을 내도록 한다 .
함수 형식void ISOUND_Vibrate (ISound * pISound, uint16 w6Duration)
기능 진동음 발생
매개변수pISound 공용 ISound 개체에 대한 포인터
wDuration 진동음 재생 시간 ( 밀리초 )
반환값 없음
• BREW 시뮬레이터에서 이 함수는 샘플 음색을 사용하여 ISOUND_PlayTone() 을 호출하는 것과 같은 기능을 수행한다 . 결과적으로 진행 중인 ISOUND_PlayTone() 재생을 중지하거나 반대로 중지된 재생을 다시 진행할 수 있다 .
• 이 함수는 콜백을 유발하지 않는다 .
임베디드 모바일 프로그래밍 8
15. ISound, ISoundPlayer API ISound_SetVolume 함수
• 이 함수는 ISOUND_Set() 에 대한 호출에서 지정한 장치 및 방식에 사용될 볼륨을 설정한다 .
함수 형식void ISOUND_SetVolume (ISound * pISound, uint16 wVolume)
기 능 볼륨을 조절하기 위하여 사용한다 .
매개변수pISound ISound 인터페이스 개체에 대한 포인터입니다 .
wVolume 장치 및 방식에 대한 새로운 볼륨 수준입니다 .
반환값 없음
• 볼륨 범위는 0(최소 )부터 AEE_MAX_VOLUME(최대 ) 사이이다 . BREW 시뮬레이터에서 볼륨은 선형적으로 증가된다 .
• 작업 결과는 콜백 함수 포인터를 통해 클라이언트로 전달된다 .
- AEE_SOUND_SUCCESS: 새로운 볼륨 수준을 설정한 경우
- AEE_SOUND_FAILURE: 새로운 볼륨 수준을 설정하는 데 실패하여 이전 수준이 유지되는
경우
임베디드 모바일 프로그래밍 9
15. ISound, ISoundPlayer API AEESoundCmdData 자료형
• AEESoundCmdData 는 콜백을 통해 응용 프로그램에 보낸 데이터를 지정한다 .
• AEESoundCmdData 자료형의 구조
typedef union { uint16 wVolume;
uint16 wPlayIndex;
} AEESoundCmdData;
• 필드
- wVolume : 볼륨 콜백을 통해 보낸 볼륨
- wPlayIndex : 재생할 현재 음색 . 이 음색은 PlayToneList 의 상태 콜백을 통해 전달
15.2 ISoundPlayer API
ISoundPlayer 인터페이스는 오디오 멀티미디어 서비스를 제공한다 . ISoundPlayer는 MIDI, MP3 및 QCP(QUALCOMM PureVoice 또는 QCELP) 형식을 지원한다 .
임베디드 모바일 프로그래밍 10
15. ISound, ISoundPlayer API AEESoundPlayerInput 자료형
• AEESoundPlayerInput 은 ISoundPlayer 가 재생할 데이터나 파일을 찾는 소스를 나타낸다 .
• AEESoundPlayerInput 자료형의 구조
typedef enum {
SDT_NONE,
SDT_FILE,
SDT_BUFFER,
SDT_VOICEPROMPT
} AEESoundPlayerInput;
• 필드
- SDT_NONE : 알 수 없는 소스 ( 예약됨 ).
- SDT_FILE: 지정한 데이터가 파일 이름
- SDT_BUFFER: 지정한 데이터가 원시 버퍼 ( 예약됨 ).
- SDT_VOICEPROMPT : 사용되지 않음
임베디드 모바일 프로그래밍 11
15. ISound, ISoundPlayer API QCP
• Qualcomm 에서 개발한 사운드 압축 방식
• PureVoice 툴 : .wav 파일 .qcp
• PureVoice 툴 (PureWin 132.exe): PC 에서 .qcp 를 재생
• PureVoice download site:
http://www.cdmatech.com/solutions/products/purevoice_download.jsp
• 변환하는 방법-PVconv xxx.wav
• qcp 파일 참조 사이트 : http://www.myphonefiles.com/t/ringtones.php3
임베디드 모바일 프로그래밍 12
15. ISound, ISoundPlayer API
15.3 ISound, ISoundPlayer API – 예제 프로그램 (SoundSample)
/*===============================================================================INCLUDES AND VARIABLE DEFINITIONS=============================================================================== */#include "AEEModGen.h" // Module interface definitions#include "AEEAppGen.h" // Applet interface definitions#include "AEEShell.h" // Shell interface definitions#include "AEESound.h" // Sound Interface definitions
#include "AEEStdLib.h"#include "AEEMenu.h"#include "AEEDisp.h"
#include "SoundSample.bid"
#define MENU_EVT_PLAYTONE 400#define MENU_EVT_PLAYTONELIST 401#define MENU_EVT_GETDEVICE 402#define MENU_EVT_VIBRATE 403#define MENU_EVT_VOLUME 404#define MENU_EVT_SOUNDPLAYER1 405#define MENU_EVT_SOUNDPLAYER2 406
typedef enum{ SOUND_NONE, SOUND_VOLUMEUP, SOUND_VOLUMEDOWN, SOUND_VOLUMEGET} SoundProcess;
볼륨 조절 상태를 나타내는 변수 타입
임베디드 모바일 프로그래밍 13
15. ISound, ISoundPlayer APItypedef struct _CISoundSample { AEEApplet a; IMenuCtl * m_pIMenu; ISound * m_pISound; ISoundPlayer * m_pISoundPlayer;
AEESoundToneData * m_pToneDataList; // Tone-list
AEERect m_rc; int m_nLineHeight; AEEDeviceInfo m_dInfo; uint16 wVolume; SoundProcess m_eSoundProcess;} CISoundSample;
/*-------------------------------------------------------------------Function Prototypes-------------------------------------------------------------------*/static boolean SoundSample_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam);
static void DisplayMenu(CISoundSample *pMe);static boolean SoundSample_InitAppData(IApplet* pi);static void SoundSample_FreeAppData(IApplet* pi);static void DisplayOutput(IApplet * pMe, int nline, char *pszStr, RGBVAL clrColor);static void SoundSampleCBFn( void * pUser, AEESoundCmd eCBType, AEESoundStatus eStatus, uint32 dwParam );static void SoundPlayerCBFn( void * pUser, AEESoundPlayerCmd eCBType, AEESoundPlayerStatus eStatus, uint32 dwParam );
임베디드 모바일 프로그래밍 14
15. ISound, ISoundPlayer API/*===============================================================================FUNCTION DEFINITIONS=============================================================================== */
int AEEClsCreateInstance(AEECLSID ClsId,IShell * pIShell,IModule * po,void ** ppObj){ *ppObj = NULL;
if(ClsId == AEECLSID_SOUNDSAMPLE){ if(AEEApplet_New(sizeof(CISoundSample), ClsId, pIShell,po,(IApplet**)ppObj, (AEEHANDLER)SoundSample_HandleEvent,(PFNFREEAPPDATA)SoundSample_FreeAppData) == TRUE) {
// Add your code here ..... if (SoundSample_InitAppData((IApplet*)*ppObj) == TRUE)
return (AEE_SUCCESS); } }
return (EFAILED);}
static boolean SoundSample_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam){
CISoundSample * pMe = (CISoundSample *)pi;switch (eCode) { case EVT_APP_START:
DisplayMenu(pMe); return(TRUE);
임베디드 모바일 프로그래밍 15
15. ISound, ISoundPlayer API case EVT_KEY:
if (pMe->m_pIMenu){
if ((IMENUCTL_IsActive(pMe->m_pIMenu) == FALSE) && (wParam == AVK_RIGHT))
{// ISound Interface if(pMe->m_pISound != NULL){
ISOUND_RegisterNotify(pMe->m_pISound, NULL, NULL);
// Stop tone if any are playingif ( pMe->m_pToneDataList != NULL ){
FREE(pMe->m_pToneDataList);
pMe->m_pToneDataList = NULL;
}ISOUND_StopTone (pMe->m_pISound);ISOUND_StopVibrate (pMe->m_pISound);ISOUND_Release (pMe->m_pISound);pMe->m_pISound = NULL;
}pMe->m_eSoundProcess = SOUND_NONE;// ISoundPlayer Interfaceif (pMe->m_pISoundPlayer != NULL){
// First deregister the notify. This way no callbacks
// will be posted for the rest of the ISoundPlayer operations.
ISOUNDPLAYER_RegisterNotify (pMe->m_pISoundPlayer, NULL, NULL);
콜백 함수를 사용하지 않는다 .
임베디드 모바일 프로그래밍 16
15. ISound, ISoundPlayer API// Stop any songs being played at this timeISOUNDPLAYER_Stop (pMe->m_pISoundPl
ayer);ISOUNDPLAYER_Release (pMe->m_pISoun
dPlayer);pMe->m_pISoundPlayer = NULL;
}
IMENUCTL_SetActive(pMe->m_pIMenu, TRUE);IMENUCTL_Redraw(pMe->m_pIMenu);
}if ((IMENUCTL_IsActive(pMe->m_pIMenu) == FALSE) && (wParam ==
AVK_UP)){
uint16 wVol = pMe->wVolume + 10; pMe->wVolume = wVol > AEE_MAX_VOLUME ? 0 : wVol; pMe->m_eSoundProcess = SOUND_VOLUMEUP;
ISOUND_SetVolume(pMe->m_pISound, pMe->wVolume);}if ((IMENUCTL_IsActive(pMe->m_pIMenu) == FALSE) && (wParam ==
AVK_DOWN)){
int nVol = pMe->wVolume - 10; pMe->wVolume = nVol < 0 ? AEE_MAX_VOLUME : (uint16)nVol; pMe->m_eSoundProcess = SOUND_VOLUMEDOWN; ISOUND_SetVolume(pMe->m_pISound, pMe->wVolume);
} return IMENUCTL_HandleEvent(pMe->m_pIMenu, EVT_KEY, wParam, 0);}else
return FALSE;
임베디드 모바일 프로그래밍 17
15. ISound, ISoundPlayer API case EVT_APP_STOP:
// Add your code here .....
return TRUE; case EVT_COMMAND:
{ switch(wParam) {
case MENU_EVT_PLAYTONE:{
AEESoundToneData toneData;
IDISPLAY_ClearScreen (pMe->a.m_pIDisplay);
IMENUCTL_SetProperties(pMe->m_pIMenu, MP_NO_REDRAW);
IMENUCTL_SetActive(pMe->m_pIMenu, FALSE);
DisplayOutput((IApplet *)pMe, 1, " 음색 듣기 ( 중지는 오른쪽 방향키 선택 )", MAKE_RGB(0,0,0));
if(ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_SOUND, (void **)&pMe->m_pISound))
return TRUE;
ISOUND_RegisterNotify(pMe->m_pISound, &SoundSampleCBFn, (void *)pMe);
toneData.eTone = AEE_TONE_0; toneData.wDuration = 2000; // in milliseconds
// Start playing toneISOUND_PlayTone (pMe->m_pISound, tone
Data);
return TRUE;}
콜백함수 사용
AEESoundToneData 자료형typedef struct { AEESoundTone eTone; uint16 wDuration; } AEESoundToneData;
임베디드 모바일 프로그래밍 18
15. ISound, ISoundPlayer API case MENU_EVT_PLAYTONELIST:
{uint16 wDataLen = 4;
IDISPLAY_ClearScreen (pMe->a.m_pIDisplay);
IMENUCTL_SetProperties(pMe->m_pIMenu, MP_NO_REDRAW);
IMENUCTL_SetActive(pMe->m_pIMenu, FALSE);
DisplayOutput((IApplet *)pMe, 1, " 음색 듣기 ( 중지는 오른쪽 방향키 선택 )", MAKE_RGB(0,0,0));
if(ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_SOUND, (void **)&pMe->m_pISound))
return TRUE; // 우리는 4 개의 음색을 재생할 것이다 . pMe->m_pToneDataList = MALLOC(sizeof
(AEESoundToneData)*wDataLen);
if(pMe->m_pToneDataList != NULL){
pMe->m_pToneDataList[0].eTone = AEE_TONE_0;
pMe->m_pToneDataList[0].wDuration = 1000; // In milliseconds
pMe->m_pToneDataList[1].eTone = AEE_TONE_1;
pMe->m_pToneDataList[1].wDuration = 2000;
pMe->m_pToneDataList[2].eTone = AEE_TONE_2;
임베디드 모바일 프로그래밍 19
15. ISound, ISoundPlayer APIpMe->m_pToneDataList[2].w
Duration = 3000;
pMe->m_pToneDataList[3].eTone = AEE_TONE_3;
pMe->m_pToneDataList[3].wDuration = 4000;
ISOUND_RegisterNotify(pMe->m_pISound, &SoundSampleCBFn, (void *)pMe);
ISOUND_PlayToneList (pMe->m_pISound, pMe->m_pToneDataList, wDataLen);
} return TRUE;
} case MENU_EVT_GETDEVICE:
{AEESoundInfo sndInfo = {0};
// Create ISound interface object. This step needs to be done only
// if the ISound interface object have not already been created.
IDISPLAY_ClearScreen (pMe->a.m_pIDisplay);
IMENUCTL_SetProperties(pMe->m_pIMenu, MP_NO_REDRAW);
IMENUCTL_SetActive(pMe->m_pIMenu, FALSE);
DisplayOutput((IApplet *)pMe, 1, " 사운드 디바이스 정보 ( 중지는 오른쪽 방향키 선택 )", MAKE_RGB(0,0,0));
if(ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_SOUND, (void **)&pMe->m_pISound))
return TRUE;
임베디드 모바일 프로그래밍 20
15. ISound, ISoundPlayer APIISOUND_RegisterNotify(pMe->m_pISound,
&SoundSampleCBFn, (void *)pMe);
// ISOUND_Get: gets the device attributes of ISound
// interface object.ISOUND_Get (pMe->m_pISou
nd, &sndInfo);
// These are the expected default values that we are
// checking against.switch(sndInfo.eDevice){case AEE_SOUND_DEVICE_
UNKNOWN:DisplayOutput
((IApplet *)pMe, 4, "Device: UNKNOWN", MAKE_RGB(0xff, 0, 0));break;
case AEE_SOUND_DEVICE_HANDSET:
DisplayOutput ((IApplet *)pMe, 4, "Device: HANDSET", MAKE_RGB(0xff, 0, 0));
break;case AEE_SOUND_DEVICE_
HFK:DisplayOutput
((IApplet *)pMe, 4, "Device: HFK", MAKE_RGB(0xff, 0, 0));break;
case AEE_SOUND_DEVICE_HEADSET:
DisplayOutput ((IApplet *)pMe, 4, "Device: HEADSET", MAKE_RGB(0xff, 0, 0));
break;
ISound 인터페이스 개체의 장치 속성을 가져온다 .
void ISOUND_Get (ISound * pISound,
const AEESoundInfo * pSoundInfo) 매개 변수 : pISound : [in]: ISound 인터페이스 개체에 대한 포인터 pSoundInfo : [out]: ISound 장치
속성을 포함하는 구조
임베디드 모바일 프로그래밍 21
case AEE_SOUND_DEVICE_SDAC:
DisplayOutput ((IApplet *)pMe, 4, "Device: SDAC", MAKE_RGB(0xff, 0, 0));
break;case AEE_SOUND_DEVICE
_TTY_HFK:DisplayOutput
((IApplet *)pMe, 4, "Device: HFK", MAKE_RGB(0xff, 0, 0));break;
case AEE_SOUND_DEVICE_TTY_HEADSET:
DisplayOutput ((IApplet *)pMe, 4, "Device: Current", MAKE_RGB(0xff, 0, 0));
break;case AEE_SOUND_DEVICE
_CURRENT:DisplayOutput
((IApplet *)pMe, 4, "Device: Current", MAKE_RGB(0xff, 0, 0));break;
case AEE_SOUND_DEVICE_AHFK:
DisplayOutput ((IApplet *)pMe, 4, "Device: AHFK", MAKE_RGB(0xff, 0, 0));
break;default:
DisplayOutput ((IApplet *)pMe, 4, "Device: UNKNOWN", MAKE_RGB(0xff, 0, 0));
break;}if (sndInfo.eMethod == AEE_
SOUND_METHOD_BEEP)DisplayOutput
((IApplet *)pMe, 5, "Method: Beep", MAKE_RGB(0xff, 0, 0));if (sndInfo.eAPath == AEE_S
OUND_APATH_LOCAL)DisplayOutput
((IApplet *)pMe, 6, "APath: Local", MAKE_RGB(0xff, 0, 0));
15. ISound, ISoundPlayer API
임베디드 모바일 프로그래밍 22
15. ISound, ISoundPlayer APIif (sndInfo.eEarMuteCtl == AE
E_SOUND_MUTECTL_UNMUTED)DisplayOutput
((IApplet *)pMe, 7, "Ear MuteCtl: Unmuted", MAKE_RGB(0xff, 0, 0));if (sndInfo.eMicMuteCtl == A
EE_SOUND_MUTECTL_UNMUTED)DisplayOutput
((IApplet *)pMe, 8, "Mic MuteCtl: Unmuted", MAKE_RGB(0xff, 0, 0));
return TRUE;}
case MENU_EVT_VIBRATE: {
uint16 w16Duration = 2000; // Time in milliseconds
IDISPLAY_ClearScreen (pMe->a.m_pIDisplay);
IMENUCTL_SetProperties(pMe->m_pIMenu, MP_NO_REDRAW);
IMENUCTL_SetActive(pMe->m_pIMenu, FALSE);
DisplayOutput((IApplet *)pMe, 1, " 진동 발생 ( 중지는 오른쪽 방향키 선택 )", MAKE_RGB(0,0,0));
if(ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_SOUND, (void **)&pMe->m_pISound))
return TRUE;
ISOUND_Vibrate(pMe->m_pISound, w16Duration);
return TRUE; }
임베디드 모바일 프로그래밍 23
15. ISound, ISoundPlayer API case MENU_EVT_VOLUME:
{ AEESoundToneData toneData; IDISPLAY_ClearScreen (pMe->a.m_pIDispl
ay); IMENUCTL_SetProperties(pMe->m_pIMen
u, MP_NO_REDRAW); IMENUCTL_SetActive(pMe->m_pIMenu, F
ALSE); DisplayOutput((IApplet *)pMe, 1, " 볼륨
조절 ", MAKE_RGB(0,0,0)); if(ISHELL_CreateInstance(pMe->a.m_pIShe
ll, AEECLSID_SOUND, (void **)&pMe->m_pISound))return TRUE;
ISOUND_RegisterNotify(pMe->m_pISound, &SoundSampleCBFn, (void *)pMe);
toneData.eTone = AEE_TONE_RING_A; toneData.wDuration = 4000; // in milliseconds
pMe->wVolume = AEE_MAX_VOLUME/2; pMe->m_eSoundProcess = SOUND_VOLU
MEUP; ISOUND_SetVolume (pMe->m_pISound, pMe->wVolume);
return TRUE; }
AEE_TONE_RING_A : 첫 번째 벨소리
음색
임베디드 모바일 프로그래밍 24
15. ISound, ISoundPlayer API case MENU_EVT_SOUNDPLAYER1:
{ AEESoundPlay
erInfo info;
IDISPLAY_ClearScreen (pMe->a.m_pIDisplay);
IMENUCTL_SetProperties(pMe->m_pIMenu, MP_NO_REDRAW);
IMENUCTL_SetActive(pMe->m_pIMenu, FALSE);
DisplayOutput((IApplet *)pMe, 1, "Your my disco 듣기 ", MAKE_RGB(0,0,0));
if(ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_SOUNDPLAYER, (void **)&pMe->m_pISoundPlayer))
return TRUE; ISOUNDPLAYER_RegisterNotify(pMe->m
_pISoundPlayer, &SoundPlayerCBFn, (void *)pMe); //ISOUNDPLAYER_Set(pMe->m_pISoundP
layer, SDT_FILE, “audio1.qcp"); info.eInput = SDT_FILE; info.pData = (void *)"sample.qcp"; info.dwSize = 0; ISOUNDPLAYER_SetInfo(pMe->m_pISoun
dPlayer, &info); ISOUNDPLAYER_Play (pMe->m_pISound
Player); return TRUE;
}
Slide 34 참조
임베디드 모바일 프로그래밍 25
15. ISound, ISoundPlayer API case MENU_EVT_SOUNDPLAYER2:
{ AEESoundPlay
erInfo info;
IDISPLAY_ClearScreen (pMe->a.m_pIDisplay);
IMENUCTL_SetProperties(pMe->m_pIMenu, MP_NO_REDRAW);
IMENUCTL_SetActive(pMe->m_pIMenu, FALSE);
DisplayOutput((IApplet *)pMe, 1, "Answer the phone 듣기 ", MAKE_RGB(0,0,0));
if(ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_SOUNDPLAYER, (void **)&pMe->m_pISoundPlayer))
return TRUE; ISOUNDPLAYER_RegisterNotify(pMe->m
_pISoundPlayer, &SoundPlayerCBFn, (void *)pMe); //ISOUNDPLAYER_Set(pMe->m_pISoundP
layer, SDT_FILE, “audio2.qcp"); info.eInput = SDT_FILE; info.pData = (void *)"sample.qcp"; info.dwSize = 0; ISOUNDPLAYER_SetInfo(pMe->m_pISoun
dPlayer, &info); ISOUNDPLAYER_Play (pMe->m_pISound
Player); return TRUE;
} default:
return TRUE; }
} default: break;
}return FALSE;
}
임베디드 모바일 프로그래밍 26
15. ISound, ISoundPlayer APIstatic void DisplayMenu(CISoundSample *pMe){
AEERect rc;AECHAR szBuf[50];AEEMenuColors mclr;
if(ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_MENUCTL, (void **)&pMe->m_pIMenu) != SUCCESS)return;
// Set display rectangleSETAEERECT (&rc, 0, 0, pMe->m_dInfo.cxScreen, pMe->m_dInfo.cyScreen);
// 선택된 메뉴의 색상을 설정한다 . mclr.wMask = (MC_BACK | MC_TEXT | MC_SEL_BACK | MC_SEL_TEXT | MC_FRAME);
mclr.cBack = RGB_WHITE;mclr.cText = RGB_BLACK;mclr.cSelBack = MAKE_RGB (146, 109, 255);mclr.cSelText = RGB_BLACK;mclr.cFrame = RGB_WHITE;
IMENUCTL_SetColors (pMe->m_pIMenu, &mclr);
// 메뉴 컨트롤의 타이틀을 생성한다STREXPAND((byte *)" 사운드 예제 ", STRLEN(" 사운드 예제 "), szBuf, sizeof(szBuf));IMENUCTL_SetTitle(pMe->m_pIMenu, NULL, 0, szBuf);IMENUCTL_SetRect(pMe->m_pIMenu, &rc);
STREXPAND((byte *)"1. 음 들어보기 ", STRLEN("1. 음 들어보기 "), szBuf, sizeof(szBuf));IMENUCTL_AddItem(pMe->m_pIMenu, 0, 0, MENU_EVT_PLAYTONE, szBuf, 0);
임베디드 모바일 프로그래밍 27
15. ISound, ISoundPlayer APISTREXPAND((byte *)"2. 여러 가지 음색 재생 ", STRLEN("2. 여러 가지 음색 재생 "), szBuf, sizeof(szBuf));IMENUCTL_AddItem(pMe->m_pIMenu, 0, 0, MENU_EVT_PLAYTONELIST, szBuf, 0);
STREXPAND((byte *)"3. 사운드 디바이스 정보 ", STRLEN("3. 사운드 디바이스 정보 "), szBuf, sizeof(szBuf));IMENUCTL_AddItem(pMe->m_pIMenu, 0, 0, MENU_EVT_GETDEVICE, szBuf, 0);
STREXPAND((byte *)"4. 진동 발생 ", STRLEN("4. 진동 발생 "), szBuf, sizeof(szBuf));IMENUCTL_AddItem(pMe->m_pIMenu, 0, 0, MENU_EVT_VIBRATE, szBuf, 0);
STREXPAND((char *)"5. 볼륨 조절 ", STRLEN("5. 볼륨 조절 "), szBuf, sizeof(szBuf));IMENUCTL_AddItem(pMe->m_pIMenu, 0, 0, MENU_EVT_VOLUME, szBuf, 0);
STREXPAND((char *)"6. 오디오 1 재생 ", STRLEN("6. 오디오 1 재생 "), szBuf, sizeof(szBuf));IMENUCTL_AddItem(pMe->m_pIMenu, 0, 0, MENU_EVT_SOUNDPLAYER1, szBuf, 0);
STREXPAND((char *)"7. 오디오 2 재생 ", STRLEN("6. 오디오 2 재생 "), szBuf, sizeof(szBuf));IMENUCTL_AddItem(pMe->m_pIMenu, 0, 0, MENU_EVT_SOUNDPLAYER2, szBuf, 0);
IMENUCTL_SetActive(pMe->m_pIMenu,TRUE);}
static boolean SoundSample_InitAppData(IApplet* pi){
CISoundSample* pMe = (CISoundSample*)pi;int pnAscent = 0;int pnDescent = 0;// Initialize the MenuCtl pointer to NULLpMe->m_pIMenu = NULL;pMe->m_pISound = NULL;
임베디드 모바일 프로그래밍 28
15. ISound, ISoundPlayer APIpMe->m_pISoundPlayer = NULL;pMe->m_pToneDataList = NULL;pMe->wVolume = AEE_MAX_VOLUME/2;pMe->m_eSoundProcess = SOUND_NONE;pMe->m_nLineHeight = IDISPLAY_GetFontMetrics (pMe->a.m_pIDisplay, AEE_FONT_NORMAL,
&pnAscent, &pnDescent);ISHELL_GetDeviceInfo(pMe->a.m_pIShell,&pMe->m_dInfo);return TRUE;
}static void SoundSample_FreeAppData(IApplet* pi){
CISoundSample* pMe = (CISoundSample*)pi;// 메뉴 컨트롤이 해지가 되지 않았다면 해지한다 .if (pMe->m_pIMenu != NULL){
// 메뉴 컨트롤 해지하는 함수IMENUCTL_Release (pMe->m_pIMenu);pMe->m_pIMenu = NULL;
}if (pMe->m_pISound != NULL)
{ISOUND_RegisterNotify(pMe->m_pISound, NULL, NULL);ISOUND_StopTone (pMe->m_pISound);if ( pMe->m_pToneDataList != NULL ){
FREE(pMe->m_pToneDataList);pMe->m_pToneDataList = NULL;
}ISOUND_Release (pMe->m_pISound);
pMe->m_pISound = NULL;}
임베디드 모바일 프로그래밍 29
15. ISound, ISoundPlayer API // Release SoundPlayer object if it is not released if (pMe->m_pISoundPlayer != NULL) {
// Deregister Notify so that ISOUNDPLAYER_RegisterNotify (pMe->m_pISoundPlayer, NULL, NULL);// Stop any songs being played at this timeISOUNDPLAYER_Stop (pMe->m_pISoundPlayer);ISOUNDPLAYER_Release (pMe->m_pISoundPlayer);pMe->m_pISoundPlayer = NULL;
}
}
static void DisplayOutput(IApplet * pi, int nline, char *pszStr, RGBVAL clrColor){ AEEDeviceInfo di; // Device Info AECHAR szBuf[200] = {0}; // a buffer that supports 200 char string AECHAR * psz = NULL; int pixelWidth; AEEFont font = AEE_FONT_NORMAL; int pnFits = 0, dy; int totalCh = 0; int charHeight = 0; // Stores the char height in pixels for given font int pnAscent = 0; // Stores the ascent in number of pixels int pnDescent = 0; // Stores the descent in number of pixels AEERect rc;
AEEApplet * pMe = (AEEApplet*)pi;
임베디드 모바일 프로그래밍 30
15. ISound, ISoundPlayer API if (pMe == NULL) return;
ISHELL_GetDeviceInfo(pMe->m_pIShell,&di);
charHeight = IDISPLAY_GetFontMetrics (pMe->m_pIDisplay, AEE_FONT_NORMAL, &pnAscent, &pnDescent);
STREXPAND((byte *)pszStr, STRLEN(pszStr), szBuf, sizeof(szBuf));
if (nline < 0) { dy = di.cyScreen*2/5; } else{ dy = nline * charHeight; }
psz = szBuf; totalCh = STRLEN ((char *)pszStr);
while ((totalCh > 0) && (*psz != NULL)) { pixelWidth = IDISPLAY_MeasureTextEx(pMe->m_pIDisplay, font, (AECHAR *) psz, // Start of the buffer to display, -1, di.cxScreen - 5, // maxWidth &pnFits); // Number of chars that will fit a line
임베디드 모바일 프로그래밍 31
15. ISound, ISoundPlayer API if (pnFits == 0) return;
SETAEERECT(&rc, 0, dy, di.cxScreen, charHeight);IDISPLAY_EraseRect(pMe->m_pIDisplay, &rc);IDISPLAY_SetColor(pMe->m_pIDisplay,CLR_USER_TEXT,clrColor);
IDISPLAY_DrawText(pMe->m_pIDisplay, AEE_FONT_NORMAL, psz, pnFits, 5 /*start dx*/, dy, 0 /* use default rectangle coordinates */, 0);
psz += pnFits; // move pointer to the next segment to be displayed totalCh -= pnFits; // reduce the total number of characters to still display dy += charHeight; // Place next line charHeight pixels below the // previous line. IDISPLAY_Update(pMe->m_pIDisplay); if (totalCh < pnFits) pnFits = totalCh; // if total number is less than pnFits, adjust pnFits } return; }
static void SoundSampleCBFn( void * pUser, AEESoundCmd eCBType, AEESoundStatus eStatus, uint32 dwParam ){
// ISOUND_RegisterNotify 함수의 pUser 인자에 의해 전달된 값CISoundSample* pMe = (CISoundSample *)pUser;char szBuf [30] = {0};// dwParam 은 AEESoundCmdData 데이터의 포인터 값을 저장AEESoundCmdData * pData = (AEESoundCmdData *) dwParam;
콜백함수 구현
Slide 2 참조
임베디드 모바일 프로그래밍 32
15. ISound, ISoundPlayer API
if ( pMe == NULL )return;
// 상태 메시지를 정보를 저장하고 있는 eStatus 인자switch ( eStatus ){// 상태 메시지에 따라 화면에 메시지 출력
case AEE_SOUND_SUCCESS:if(pMe->m_eSoundProcess == SOUND_VOLUMEUP){
pMe->m_eSoundProcess = SOUND_VOLUMEGET;ISOUND_GetVolume(pMe->m_pISound);
}else if(pMe->m_eSoundProcess == SOUND_VOLUMEDOWN){
pMe->m_eSoundProcess = SOUND_VOLUMEGET;ISOUND_GetVolume(pMe->m_pISound);
}else if(pMe->m_eSoundProcess == SOUND_VOLUMEGET){
if ( pData ){
// 볼륨 크기를 읽어온다 .pMe->wVolume = pData->wVolume;SPRINTF(szBuf, " 현재 볼륨 : %u", pMe->wVolume);DisplayOutput((IApplet *)pMe, 5, szBuf, MAKE_RGB(0, 0,
0xff));}
}else
DisplayOutput ((IApplet *)pMe, 4, "AEE_SOUND_SUCCESS 상태 메시지 발생 : 성공 ", MAKE_RGB(0xff, 0, 0));
break;
임베디드 모바일 프로그래밍 33
15. ISound, ISoundPlayer APIcase AEE_SOUND_PLAY_DONE:
DisplayOutput ((IApplet *)pMe, 4, "AEE_SOUND_PLAY_DONE 상태 메시지 발생 : 사운드 재생 완료 ", MAKE_RGB(0xff, 0, 0));
break;case AEE_SOUND_FAILURE:
if(pMe->m_eSoundProcess == SOUND_VOLUMEUP)DisplayOutput ((IApplet *)pMe, 4, " 볼륨 높이기 실패 ", MAKE_RGB(0xf
f, 0, 0));else if(pMe->m_eSoundProcess == SOUND_VOLUMEDOWN)
DisplayOutput ((IApplet *)pMe, 4, " 볼륨 낮추기 실패 ", MAKE_RGB(0xff, 0, 0));
elseDisplayOutput ((IApplet *)pMe, 4, "AEE_SOUND_FAILURE 상태
메시지 발생 : 실패 ", MAKE_RGB(0xff, 0, 0));break;
default:DisplayOutput ((IApplet *)pMe, 4, "AEE_SOUND_UNKNOWN 상태 메시지 발생 : 알
수 없는 상태 메시지 ", MAKE_RGB(0xff, 0, 0));break;
}}
static void SoundPlayerCBFn( void * pUser, AEESoundPlayerCmd eCBType, AEESoundPlayerStatus eStatus, uint32 dwParam ){
}
임베디드 모바일 프로그래밍 34
AEESoundPlayerInfo
• 설 명
- AEESoundPlayerInfo 는 오디오 소스를 지정한다 . ISOUNDPLAYER_SetInfo() 를 사용하여 ISoundPlayer 의 오디오 소스를 설정하는 데 사용된다 .
• 정 의
- typedef structure { AEESoundPlayerInput eInput; void * pData; uint32 dwSize; } AEESoundPlayerInfo;
• 구성원 :
- eInput : 오디오 소스 ( 입력 ) 형식입니다 . 파일이나 버퍼일 수 있습니다 .
- pData: 입력 형식에 기반한 파일 이름이나 버퍼에 대한 포인터입니다 .
- dwSize : 버퍼의 데이터 크기입니다 . 버퍼 입력 형식에만 사용할 수 있습니다 .
15. ISound, ISoundPlayer API
임베디드 모바일 프로그래밍 35
15. ISound, ISoundPlayer API
15.4 실행 결과
임베디드 모바일 프로그래밍 36
15. ISound, ISoundPlayer API