1 / 36

15. ISound, ISoundPlayer API

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

clio
Download Presentation

15. ISound, ISoundPlayer API

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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 • 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 함수 • 이 함수는 상태 콜백 함수를 등록한다. • 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: 톤 재생이 완료된 후 목록에 있는 각각의 톤에 대해 수신된다. 임베디드 모바일 프로그래밍

  7. 15. ISound, ISoundPlayer API • ISound_Vibrate 함수 • 지정된 시간 동안 또는 ISOUND_StopVibrate()를 호출할 때까지 장치에서 진동음을 내도록 한다. • BREW 시뮬레이터에서 이 함수는 샘플 음색을 사용하여 ISOUND_PlayTone() 을 호출하는 것과 같은 기능을 수행한다. 결과적으로 진행 중인 ISOUND_PlayTone() 재생을 중지하거나 반대로 중지된 재생을 다시 진행할 수 있다. • 이 함수는 콜백을 유발하지 않는다. 임베디드 모바일 프로그래밍

  8. 15. ISound, ISoundPlayer API • ISound_SetVolume 함수 • 이 함수는 ISOUND_Set()에 대한 호출에서 지정한 장치 및 방식에 사용될 볼륨을 설정한다. • 볼륨 범위는 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 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 ); 임베디드 모바일 프로그래밍

  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 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); 콜백 함수를 사용하지 않는다. 임베디드 모바일 프로그래밍

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

  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 tone ISOUND_PlayTone (pMe->m_pISound, toneData); 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 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; 임베디드 모바일 프로그래밍

  20. 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 장치 속성을 포함하는 구조 임베디드 모바일 프로그래밍

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

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

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

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

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

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

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

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

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

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

  34. 15. ISound, ISoundPlayer API • AEESoundPlayerInfo • 설 명 • - AEESoundPlayerInfo 는 오디오 소스를 지정한다. ISOUNDPLAYER_SetInfo()를 사용하여 ISoundPlayer의 오디오 소스를 설정하는 데 사용된다. • 정 의 • typedef structure { AEESoundPlayerInput eInput; void * pData; uint32 dwSize; } AEESoundPlayerInfo; • 구성원: • - eInput : 오디오 소스(입력) 형식입니다. 파일이나 버퍼일 수 있습니다. • - pData: 입력 형식에 기반한 파일 이름이나 버퍼에 대한 포인터입니다. • - dwSize : 버퍼의 데이터 크기입니다. 버퍼 입력 형식에만 사용할 수 있습니다. 임베디드 모바일 프로그래밍

  35. 15. ISound, ISoundPlayer API 15.4 실행 결과 임베디드 모바일 프로그래밍

  36. 15. ISound, ISoundPlayer API 임베디드 모바일 프로그래밍

More Related