36
임임임임 임임임 임임임임임 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> 임임 임임임임임 임임 임임 임임임 임임임 임임임임임임 임임임임임 .

15. ISound, ISoundPlayer API

  • Upload
    clio

  • View
    38

  • Download
    0

Embed Size (px)

DESCRIPTION

15. ISound, ISoundPlayer API. 15.1 ISound API ISound 인터페이스는 기본적인 사운드 서비스를 제공한다 . 이러한 서비스에서는 경보 , 벨 , 진동 등의 다양한 음색을 재생하고 목록으로 관리한다 . - PowerPoint PPT Presentation

Citation preview

Page 1: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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> 하위 디렉터리에 있는 콜백 함수를 통해서 클라이언트에 전달됩니다 .

Page 2: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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;

Page 3: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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: 작업이 실패하여 중지 명령을 받아들이지 않은 경우

Page 4: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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 에 의해 이벤트와 데이터를 응용 프로그램으로 보내는데 사용되는 콜백 형식을 지정한다 .

Page 5: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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() 을 호출할 때까지 음색이 재생된다 .

• 음색 목록에 있는 각 음색에 대한 재생 결과가 콜백 함수 포인터를 통해 클라이언트로 전달된다 . 또한 작업이 완료되면 같은 콜백 함수 포인터를 통해 작업이 완료되었음을 클라이언트에 알린다 .

Page 6: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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 목록에 있는 음색의 수입니다 .

반환값 없음

Page 7: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 7

15. ISound, ISoundPlayer API

ISound_Vibrate 함수

• 지정된 시간 동안 또는 ISOUND_StopVibrate() 를 호출할 때까지 장치에서 진동음을 내도록 한다 .

함수 형식void ISOUND_Vibrate (ISound * pISound, uint16 w6Duration)

기능 진동음 발생

매개변수pISound 공용 ISound 개체에 대한 포인터

wDuration 진동음 재생 시간 ( 밀리초 )

반환값 없음

• BREW 시뮬레이터에서 이 함수는 샘플 음색을 사용하여 ISOUND_PlayTone() 을 호출하는 것과 같은 기능을 수행한다 . 결과적으로 진행 중인 ISOUND_PlayTone() 재생을 중지하거나 반대로 중지된 재생을 다시 진행할 수 있다 .

• 이 함수는 콜백을 유발하지 않는다 .

Page 8: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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: 새로운 볼륨 수준을 설정하는 데 실패하여 이전 수준이 유지되는

경우

Page 9: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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) 형식을 지원한다 .

Page 10: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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 : 사용되지 않음

Page 11: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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

Page 12: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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;

볼륨 조절 상태를 나타내는 변수 타입

Page 13: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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 );

Page 14: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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);

Page 15: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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);

콜백 함수를 사용하지 않는다 .

Page 16: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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;

Page 17: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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;

Page 18: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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;

Page 19: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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;

Page 20: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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 장치

속성을 포함하는 구조

Page 21: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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

Page 22: 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; }

Page 23: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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 : 첫 번째 벨소리

음색

Page 24: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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 참조

Page 25: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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;

}

Page 26: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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);

Page 27: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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;

Page 28: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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;}

Page 29: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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;

Page 30: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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

Page 31: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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 참조

Page 32: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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;

Page 33: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 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 ){

}

Page 34: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 34

AEESoundPlayerInfo

• 설 명

- AEESoundPlayerInfo 는 오디오 소스를 지정한다 . ISOUNDPLAYER_SetInfo() 를 사용하여 ISoundPlayer 의 오디오 소스를 설정하는 데 사용된다 .

• 정 의

- typedef structure { AEESoundPlayerInput eInput; void * pData; uint32 dwSize; } AEESoundPlayerInfo;

• 구성원 :

- eInput : 오디오 소스 ( 입력 ) 형식입니다 . 파일이나 버퍼일 수 있습니다 .

- pData: 입력 형식에 기반한 파일 이름이나 버퍼에 대한 포인터입니다 .

- dwSize : 버퍼의 데이터 크기입니다 . 버퍼 입력 형식에만 사용할 수 있습니다 .

15. ISound, ISoundPlayer API

Page 35: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 35

15. ISound, ISoundPlayer API

15.4 실행 결과

Page 36: 15. ISound, ISoundPlayer API

임베디드 모바일 프로그래밍 36

15. ISound, ISoundPlayer API