360 likes | 459 Views
15. ISound, ISoundPlayer API. 15.1 ISound API ISound 인터페이스는 기본적인 사운드 서비스를 제공한다 . 이러한 서비스에서는 경보 , 벨 , 진동 등의 다양한 음색을 재생하고 목록으로 관리한다 .
E N D
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 • AEESoundStatus 자료형 • AEESoundStatus 는 콜백 함수로 반환되어 ISound 이벤트를 지정하고 응용 프로그램에 데이터를 반환한다. • AEESoundStatus 자료형의 구조 • typedef enum { AEE_SOUND_UNKNOWN, • AEE_SOUND_SUCCESS, • AEE_SOUND_PLAY_DONE, • AEE_SOUND_FAILURE, • AEE_SOUND_LAST • } AEESoundStatus; 임베디드 모바일 프로그래밍
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: 작업이 실패하여 중지 명령을 받아들이지 않은 경우 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API • ISound_RegisterNotify 함수 • 이 함수는 상태 콜백 함수를 등록한다. • AEESoundCmd 자료형 • AEESoundCmd는 ISound에 의해 이벤트와 데이터를 응용 프로그램으로 보내는데 사용되는 콜백 형식을 지정한다. 임베디드 모바일 프로그래밍
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() 을 호출할 때까지 음색이 재생된다. • 음색 목록에 있는 각 음색에 대한 재생 결과가 콜백 함수 포인터를 통해 클라이언트로 전달된다. 또한 작업이 완료되면 같은 콜백 함수 포인터를 통해 작업이 완료되었음을 클라이언트에 알린다. 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API • - AEE_SOUND_SUCCESS: 음색 목록에 있는 각 음색을 재생한 경우 • - AEE_SOUND_FAILURE: 음색 목록에 있는 음색 재생에 실패하여 음색 목록 재생이 끝난 경우 • - AEE_SOUND_PLAY_DONE: 톤 재생이 완료된 후 목록에 있는 각각의 톤에 대해 수신된다. 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API • ISound_Vibrate 함수 • 지정된 시간 동안 또는 ISOUND_StopVibrate()를 호출할 때까지 장치에서 진동음을 내도록 한다. • BREW 시뮬레이터에서 이 함수는 샘플 음색을 사용하여 ISOUND_PlayTone() 을 호출하는 것과 같은 기능을 수행한다. 결과적으로 진행 중인 ISOUND_PlayTone() 재생을 중지하거나 반대로 중지된 재생을 다시 진행할 수 있다. • 이 함수는 콜백을 유발하지 않는다. 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API • ISound_SetVolume 함수 • 이 함수는 ISOUND_Set()에 대한 호출에서 지정한 장치 및 방식에 사용될 볼륨을 설정한다. • 볼륨 범위는 0(최소)부터 AEE_MAX_VOLUME(최대) 사이이다. BREW 시뮬레이터에서 볼륨은 선형적으로 증가된다. • 작업 결과는 콜백 함수 포인터를 통해 클라이언트로 전달된다. • - AEE_SOUND_SUCCESS: 새로운 볼륨 수준을 설정한 경우 • AEE_SOUND_FAILURE: 새로운 볼륨 수준을 설정하는 데 실패하여 이전 수준이 유지되는 • 경우 임베디드 모바일 프로그래밍
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) 형식을 지원한다. 임베디드 모바일 프로그래밍
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 : 사용되지 않음 임베디드 모바일 프로그래밍
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 임베디드 모바일 프로그래밍
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; 볼륨 조절 상태를 나타내는 변수 타입 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API typedef 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 ); 임베디드 모바일 프로그래밍
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. 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 playing • if ( 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 Interface • if (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); 콜백 함수를 사용하지 않는다. 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API // Stop any songs being played at this time ISOUNDPLAYER_Stop (pMe->m_pISoundPlayer); ISOUNDPLAYER_Release (pMe->m_pISoundPlayer); 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; 임베디드 모바일 프로그래밍
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 tone ISOUND_PlayTone (pMe->m_pISound, toneData); return TRUE; } AEESoundToneData 자료형 typedef struct { AEESoundTone eTone; uint16 wDuration; } AEESoundToneData; 콜백함수 사용 임베디드 모바일 프로그래밍
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; 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API pMe->m_pToneDataList[2].wDuration = 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; 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API ISOUND_RegisterNotify(pMe->m_pISound, &SoundSampleCBFn, (void *)pMe); // ISOUND_Get: gets the device attributes of ISound // interface object. ISOUND_Get (pMe->m_pISound, &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 장치 속성을 포함하는 구조 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API 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_SOUND_APATH_LOCAL) DisplayOutput ((IApplet *)pMe, 6, "APath: Local", MAKE_RGB(0xff, 0, 0)); 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API if (sndInfo.eEarMuteCtl == AEE_SOUND_MUTECTL_UNMUTED) DisplayOutput ((IApplet *)pMe, 7, "Ear MuteCtl: Unmuted", MAKE_RGB(0xff, 0, 0)); if (sndInfo.eMicMuteCtl == AEE_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; } 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API case MENU_EVT_VOLUME: { 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_RING_A; toneData.wDuration = 4000; // in milliseconds pMe->wVolume = AEE_MAX_VOLUME/2; pMe->m_eSoundProcess = SOUND_VOLUMEUP; ISOUND_SetVolume (pMe->m_pISound, pMe->wVolume); return TRUE; } AEE_TONE_RING_A : 첫 번째 벨소리 음색 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API • case MENU_EVT_SOUNDPLAYER1: • { • AEESoundPlayerInfo 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_pISoundPlayer, SDT_FILE, “audio1.qcp"); • info.eInput = SDT_FILE; • info.pData = (void *)"sample.qcp"; • info.dwSize = 0; • ISOUNDPLAYER_SetInfo(pMe->m_pISoundPlayer, &info); • ISOUNDPLAYER_Play (pMe->m_pISoundPlayer); • return TRUE; • } Slide 34 참조 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API • case MENU_EVT_SOUNDPLAYER2: • { • AEESoundPlayerInfo 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_pISoundPlayer, SDT_FILE, “audio2.qcp"); • info.eInput = SDT_FILE; • info.pData = (void *)"sample.qcp"; • info.dwSize = 0; • ISOUNDPLAYER_SetInfo(pMe->m_pISoundPlayer, &info); • ISOUNDPLAYER_Play (pMe->m_pISoundPlayer); • return TRUE; • } • default: • return TRUE; • } • } • default: • break; • } • return FALSE; • } 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API static 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 rectangle SETAEERECT (&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); 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API STREXPAND((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 NULL pMe->m_pIMenu = NULL; pMe->m_pISound = NULL; 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API pMe->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; } 임베디드 모바일 프로그래밍
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 time ISOUNDPLAYER_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; 임베디드 모바일 프로그래밍
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 임베디드 모바일 프로그래밍
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 참조 임베디드 모바일 프로그래밍
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; 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API case 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(0xff, 0, 0)); else if(pMe->m_eSoundProcess == SOUND_VOLUMEDOWN) DisplayOutput ((IApplet *)pMe, 4, "볼륨 낮추기 실패", MAKE_RGB(0xff, 0, 0)); else DisplayOutput ((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 ) { } 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API • AEESoundPlayerInfo • 설 명 • - AEESoundPlayerInfo 는 오디오 소스를 지정한다. ISOUNDPLAYER_SetInfo()를 사용하여 ISoundPlayer의 오디오 소스를 설정하는 데 사용된다. • 정 의 • typedef structure { AEESoundPlayerInput eInput; void * pData; uint32 dwSize; } AEESoundPlayerInfo; • 구성원: • - eInput : 오디오 소스(입력) 형식입니다. 파일이나 버퍼일 수 있습니다. • - pData: 입력 형식에 기반한 파일 이름이나 버퍼에 대한 포인터입니다. • - dwSize : 버퍼의 데이터 크기입니다. 버퍼 입력 형식에만 사용할 수 있습니다. 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API 15.4 실행 결과 임베디드 모바일 프로그래밍
15. ISound, ISoundPlayer API 임베디드 모바일 프로그래밍