sl@0: //------------------------------------------------------------------------------ sl@0: #include "IdwThread.h" sl@0: #include "iMONDisplayAPI.h" sl@0: //------------------------------------------------------------------------------ sl@0: #define CLASSNAME TEXT("IDW_IMON_COM_WNDCLASS") sl@0: //------------------------------------------------------------------------------ sl@0: #define WM_IDW_IMON (WM_USER + 1) sl@0: #define WM_IDW_INIT (WM_USER + 2) sl@0: #define WM_IDW_UNINIT (WM_USER + 3) sl@0: #define WM_IDW_ISINITED (WM_USER + 4) sl@0: #define WM_IDW_ISPLUGINMODEENABLED (WM_USER + 5) sl@0: #define WM_IDW_SETVFDTEXT (WM_USER + 6) sl@0: #define WM_IDW_SETVFDEQ (WM_USER + 7) sl@0: #define WM_IDW_SETLCDTEXT (WM_USER + 8) sl@0: #define WM_IDW_SETLCDEQ (WM_USER + 9) sl@0: #define WM_IDW_SETLCDALLICONS (WM_USER + 10) sl@0: #define WM_IDW_SETLCDORANGEICON (WM_USER + 11) sl@0: #define WM_IDW_SETLCDMEDIATYPEICON (WM_USER + 12) sl@0: #define WM_IDW_SETLCDSPEAKERICON (WM_USER + 13) sl@0: #define WM_IDW_SETLCDVIDEOCODEC (WM_USER + 14) sl@0: #define WM_IDW_SETLCDAUDIOCODEC (WM_USER + 15) sl@0: #define WM_IDW_SETLCDASPECTRATIO (WM_USER + 16) sl@0: #define WM_IDW_SETLCDETCICON (WM_USER + 17) sl@0: #define WM_IDW_SETLCDPROGRESS (WM_USER + 18) sl@2: #define WM_IDW_STATUS (WM_USER + 19) sl@0: #define WM_IDW_INTERRUPT (WM_USER + 100) sl@0: //------------------------------------------------------------------------------ sl@1: sl@1: /** sl@2: iMON Display initialization request. sl@1: */ sl@1: class IdwImonInitRequest : public WindowEvent sl@1: { sl@1: public: sl@1: IdwImonInitRequest(HWND aWnd, UINT aMsg): WindowEvent(aWnd,aMsg) {} sl@1: //from WindowEvent sl@1: virtual LRESULT DoExecute(); sl@1: void HandleImonNotifications(WPARAM wParam, LPARAM lParam); sl@1: public: sl@1: DSPNotifyCode iNotification; sl@1: DSPResult iResult; sl@1: DSPNInitResult iInitResult; sl@1: DSPType iDspType; sl@1: static const UINT KMsgIdImonNotification = WM_IDW_IMON; sl@1: }; sl@1: sl@2: sl@2: /** sl@2: iMON Display status request. sl@2: Retrieve the latest iMON notification code. sl@2: */ sl@2: class IdwImonStatusRequest : public WindowEvent sl@2: { sl@2: public: sl@2: IdwImonStatusRequest(HWND aWnd, UINT aMsg): WindowEvent(aWnd,aMsg) {} sl@2: //from WindowEvent sl@2: virtual LRESULT DoExecute(); sl@2: public: sl@2: DSPResult iResult; sl@2: DSPNotifyCode iNotification; sl@2: }; sl@2: sl@0: struct IdwSetVfdText sl@0: { sl@0: DSPResult result; sl@0: LPCWSTR pszLine1; sl@0: LPCWSTR pszLine2; sl@0: }; sl@0: struct IdwSetVfdEq sl@0: { sl@0: DSPResult result; sl@0: PDSPEQDATA pEqData; sl@0: }; sl@0: struct IdwSetLcdText sl@0: { sl@0: DSPResult result; sl@0: LPCWSTR pszLine1; sl@0: }; sl@0: struct IdwSetLcdEq sl@0: { sl@0: DSPResult result; sl@0: PDSPEQDATA pEqDataL; sl@0: PDSPEQDATA pEqDataR; sl@0: }; sl@0: struct IdwSetLcdAllIcons sl@0: { sl@0: DSPResult result; sl@0: BOOL bOn; sl@0: }; sl@0: struct IdwSetLcdIcons sl@0: { sl@0: DSPResult result; sl@0: BYTE btIconData; sl@0: }; sl@0: struct IdwSetLcdIcons2 sl@0: { sl@0: DSPResult result; sl@0: BYTE btIconData1; sl@0: BYTE btIconData2; sl@0: }; sl@0: struct IdwSetLcdProgress sl@0: { sl@0: DSPResult result; sl@0: int nCurPos; sl@0: int nTotal; sl@0: }; sl@0: //------------------------------------------------------------------------------ sl@0: IdwThread::IdwThread(HINSTANCE hInstance) sl@0: : m_hInstance(hInstance) sl@0: , m_hWnd(NULL) sl@0: { sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: IdwThread::~IdwThread() sl@0: { sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: void IdwThread::Interrupt() sl@0: { sl@0: if (!WaitForWindow()) sl@0: return; sl@0: PostMessage(m_hWnd, WM_IDW_INTERRUPT, 0, 0); sl@0: } sl@2: sl@2: /** sl@2: Issue iMON initialization request. sl@2: @param [in, out] Contains our request results on return. sl@2: */ sl@0: DSPResult IdwThread::Init(IDW_INITRESULT* pInitResult) sl@0: { sl@0: if (!WaitForWindow()) sl@0: return DSP_E_FAIL; sl@0: sl@1: IdwImonInitRequest request(m_hWnd, WM_IDW_INIT); sl@1: request.Post(); sl@1: request.Await(); sl@0: if (pInitResult != NULL) sl@0: { sl@1: pInitResult->iInitResult = request.iInitResult; sl@1: pInitResult->iDspType = request.iDspType; sl@1: pInitResult->iNotification = request.iNotification; sl@0: } sl@0: sl@1: return request.iResult; sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: DSPResult IdwThread::Uninit() sl@0: { sl@0: if (!WaitForWindow()) sl@0: return DSP_E_FAIL; sl@0: sl@0: DSPResult result; sl@0: Event finished; sl@0: PostMessage(m_hWnd, WM_IDW_UNINIT, (WPARAM)&result, (LPARAM)&finished); sl@0: finished.Await(); sl@0: sl@0: return result; sl@0: } sl@0: //------------------------------------------------------------------------------ sl@3: DSPResult IdwThread::IsInitialized() sl@0: { sl@0: if (!WaitForWindow()) sl@0: return DSP_E_FAIL; sl@0: sl@0: DSPResult result; sl@0: Event finished; sl@0: PostMessage(m_hWnd, WM_IDW_ISINITED, (WPARAM)&result, (LPARAM)&finished); sl@0: finished.Await(); sl@0: sl@0: return result; sl@0: } sl@2: sl@2: /** sl@2: Issue iMON initialization request. sl@2: @param [in, out] Contains our request results on return. sl@2: */ sl@2: DSPResult IdwThread::GetStatus(IDW_STATUS* aStatus) sl@2: { sl@2: if (!WaitForWindow()) sl@2: { sl@2: return DSP_E_FAIL; sl@2: } sl@2: sl@2: IdwImonStatusRequest request(m_hWnd, WM_IDW_STATUS); sl@2: request.Post(); sl@2: request.Await(); sl@2: if (aStatus != NULL) sl@2: { sl@2: aStatus->iNotification = request.iNotification; sl@2: } sl@2: sl@2: return request.iResult; sl@2: } sl@2: sl@0: //------------------------------------------------------------------------------ sl@0: DSPResult IdwThread::IsPluginModeEnabled() sl@0: { sl@0: if (!WaitForWindow()) sl@0: return DSP_E_FAIL; sl@0: sl@0: DSPResult result; sl@0: Event finished; sl@0: PostMessage(m_hWnd, WM_IDW_ISPLUGINMODEENABLED, (WPARAM)&result, sl@0: (LPARAM)&finished); sl@0: finished.Await(); sl@0: sl@0: return result; sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: DSPResult IdwThread::SetVfdText(LPCWSTR lpszLine1, LPCWSTR lpszLine2) sl@0: { sl@0: if (!WaitForWindow()) sl@0: return DSP_E_FAIL; sl@0: sl@0: IdwSetVfdText text; sl@0: text.pszLine1 = lpszLine1; sl@0: text.pszLine2 = lpszLine2; sl@0: Event finished; sl@0: PostMessage(m_hWnd, WM_IDW_SETVFDTEXT, (WPARAM)&text, (LPARAM)&finished); sl@0: finished.Await(); sl@0: sl@0: return text.result; sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: DSPResult IdwThread::SetVfdEqData(PDSPEQDATA pEqData) sl@0: { sl@0: if (!WaitForWindow()) sl@0: return DSP_E_FAIL; sl@0: sl@0: IdwSetVfdEq eq; sl@0: eq.pEqData = pEqData; sl@0: Event finished; sl@0: PostMessage(m_hWnd, WM_IDW_SETVFDEQ, (WPARAM)&eq, (LPARAM)&finished); sl@0: finished.Await(); sl@0: sl@0: return eq.result; sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: DSPResult IdwThread::SetLcdText(LPCWSTR lpszLine1) sl@0: { sl@0: if (!WaitForWindow()) sl@0: return DSP_E_FAIL; sl@0: sl@0: IdwSetLcdText text; sl@0: text.pszLine1 = lpszLine1; sl@0: Event finished; sl@0: PostMessage(m_hWnd, WM_IDW_SETLCDTEXT, (WPARAM)&text, (LPARAM)&finished); sl@0: finished.Await(); sl@0: sl@0: return text.result; sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: DSPResult IdwThread::SetLcdEqData(PDSPEQDATA pEqDataL, PDSPEQDATA pEqDataR) sl@0: { sl@0: if (!WaitForWindow()) sl@0: return DSP_E_FAIL; sl@0: sl@0: IdwSetLcdEq eq; sl@0: eq.pEqDataL = pEqDataL; sl@0: eq.pEqDataR = pEqDataR; sl@0: Event finished; sl@0: PostMessage(m_hWnd, WM_IDW_SETLCDEQ, (WPARAM)&eq, (LPARAM)&finished); sl@0: finished.Await(); sl@0: sl@0: return eq.result; sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: DSPResult IdwThread::SetLcdAllIcons(BOOL bOn) sl@0: { sl@0: if (!WaitForWindow()) sl@0: return DSP_E_FAIL; sl@0: sl@0: IdwSetLcdAllIcons allIcons; sl@0: allIcons.bOn = bOn; sl@0: Event finished; sl@0: PostMessage(m_hWnd, WM_IDW_SETLCDALLICONS, sl@0: (WPARAM)&allIcons, (LPARAM)&finished); sl@0: finished.Await(); sl@0: sl@0: return allIcons.result; sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: DSPResult IdwThread::SetLcdOrangeIcon(BYTE btIconData1, BYTE btIconData2) sl@0: { sl@0: if (!WaitForWindow()) sl@0: return DSP_E_FAIL; sl@0: sl@0: IdwSetLcdIcons2 iconData; sl@0: iconData.btIconData1 = btIconData1; sl@0: iconData.btIconData2 = btIconData2; sl@0: Event finished; sl@0: PostMessage(m_hWnd, WM_IDW_SETLCDORANGEICON, sl@0: (WPARAM)&iconData, (LPARAM)&finished); sl@0: finished.Await(); sl@0: sl@0: return iconData.result; sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: DSPResult IdwThread::SetLcdMediaTypeIcon(BYTE btIconData) sl@0: { sl@0: if (!WaitForWindow()) sl@0: return DSP_E_FAIL; sl@0: sl@0: IdwSetLcdIcons iconData; sl@0: iconData.btIconData = btIconData; sl@0: Event finished; sl@0: PostMessage(m_hWnd, WM_IDW_SETLCDMEDIATYPEICON, sl@0: (WPARAM)&iconData, (LPARAM)&finished); sl@0: finished.Await(); sl@0: sl@0: return iconData.result; sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: DSPResult IdwThread::SetLcdSpeakerIcon(BYTE btIconData1, BYTE btIconData2) sl@0: { sl@0: if (!WaitForWindow()) sl@0: return DSP_E_FAIL; sl@0: sl@0: IdwSetLcdIcons2 iconData; sl@0: iconData.btIconData1 = btIconData1; sl@0: iconData.btIconData2 = btIconData2; sl@0: Event finished; sl@0: PostMessage(m_hWnd, WM_IDW_SETLCDSPEAKERICON, sl@0: (WPARAM)&iconData, (LPARAM)&finished); sl@0: finished.Await(); sl@0: sl@0: return iconData.result; sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: DSPResult IdwThread::SetLcdVideoCodecIcon(BYTE btIconData) sl@0: { sl@0: if (!WaitForWindow()) sl@0: return DSP_E_FAIL; sl@0: sl@0: IdwSetLcdIcons iconData; sl@0: iconData.btIconData = btIconData; sl@0: Event finished; sl@0: PostMessage(m_hWnd, WM_IDW_SETLCDVIDEOCODEC, sl@0: (WPARAM)&iconData, (LPARAM)&finished); sl@0: finished.Await(); sl@0: sl@0: return iconData.result; sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: DSPResult IdwThread::SetLcdAudioCodecIcon(BYTE btIconData) sl@0: { sl@0: if (!WaitForWindow()) sl@0: return DSP_E_FAIL; sl@0: sl@0: IdwSetLcdIcons iconData; sl@0: iconData.btIconData = btIconData; sl@0: Event finished; sl@0: PostMessage(m_hWnd, WM_IDW_SETLCDAUDIOCODEC, sl@0: (WPARAM)&iconData, (LPARAM)&finished); sl@0: finished.Await(); sl@0: sl@0: return iconData.result; sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: DSPResult IdwThread::SetLcdAspectRatioIcon(BYTE btIconData) sl@0: { sl@0: if (!WaitForWindow()) sl@0: return DSP_E_FAIL; sl@0: sl@0: IdwSetLcdIcons iconData; sl@0: iconData.btIconData = btIconData; sl@0: Event finished; sl@0: PostMessage(m_hWnd, WM_IDW_SETLCDASPECTRATIO, sl@0: (WPARAM)&iconData, (LPARAM)&finished); sl@0: finished.Await(); sl@0: sl@0: return iconData.result; sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: DSPResult IdwThread::SetLcdEtcIcon(BYTE btIconData) sl@0: { sl@0: if (!WaitForWindow()) sl@0: return DSP_E_FAIL; sl@0: sl@0: IdwSetLcdIcons iconData; sl@0: iconData.btIconData = btIconData; sl@0: Event finished; sl@0: PostMessage(m_hWnd, WM_IDW_SETLCDETCICON, sl@0: (WPARAM)&iconData, (LPARAM)&finished); sl@0: finished.Await(); sl@0: sl@0: return iconData.result; sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: DSPResult IdwThread::SetLcdProgress(int nCurPos, int nTotal) sl@0: { sl@0: if (!WaitForWindow()) sl@0: return DSP_E_FAIL; sl@0: sl@0: IdwSetLcdProgress progressData; sl@0: progressData.nCurPos = nCurPos; sl@0: progressData.nTotal = nTotal; sl@0: Event finished; sl@0: PostMessage(m_hWnd, WM_IDW_SETLCDPROGRESS, sl@0: (WPARAM)&progressData, (LPARAM)&finished); sl@0: finished.Await(); sl@0: sl@0: return progressData.result; sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: void IdwThread::Run() sl@0: { sl@0: if (!RegisterClass()) sl@0: { sl@0: m_eventWindowCreationDone.Signal(); sl@0: return; sl@0: } sl@0: if (!CreateMessageWindow()) sl@0: { sl@0: m_eventWindowCreationDone.Signal(); sl@0: return; sl@0: } sl@0: AllowImonMessages(); sl@0: sl@0: m_eventWindowCreationDone.Signal(); sl@0: sl@0: MSG msg; sl@0: BOOL fGotMessage; sl@0: while ((fGotMessage = GetMessage(&msg, (HWND) NULL, 0, 0)) != 0 sl@0: && fGotMessage != -1) sl@0: { sl@0: TranslateMessage(&msg); sl@0: DispatchMessage(&msg); sl@0: } sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: bool IdwThread::RegisterClass() sl@0: { sl@0: WNDCLASSEX wc; sl@0: if (GetClassInfoEx(m_hInstance, CLASSNAME, &wc)) sl@0: { sl@0: return true; sl@0: } sl@0: sl@0: wc.cbSize = sizeof(wc); sl@0: wc.style = CS_HREDRAW | CS_VREDRAW; sl@0: wc.lpfnWndProc = IdwThread::WndProc; sl@0: wc.cbClsExtra = 0; sl@0: wc.cbWndExtra = 0; sl@0: wc.hInstance = m_hInstance; sl@0: wc.hIcon = NULL; sl@0: wc.hCursor = NULL; sl@0: wc.hbrBackground = NULL; sl@0: wc.lpszMenuName = NULL; sl@0: wc.lpszClassName = CLASSNAME; sl@0: wc.hIconSm = NULL; sl@0: if (::RegisterClassEx(&wc)) sl@0: { sl@0: return true; sl@0: } sl@0: return false; sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: bool IdwThread::CreateMessageWindow() sl@0: { sl@0: m_hWnd = CreateWindow( sl@0: CLASSNAME, sl@0: TEXT("MP iMON MessageWindow"), sl@0: 0, sl@0: 0, 0, 0, 0, sl@0: HWND_MESSAGE, sl@0: NULL, sl@0: m_hInstance, sl@0: NULL); sl@0: sl@0: if (!m_hWnd) sl@0: return false; sl@0: return true; sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: void IdwThread::AllowImonMessages() sl@0: { sl@0: // Determine OS sl@0: OSVERSIONINFO version; sl@0: version.dwOSVersionInfoSize = sizeof(version); sl@0: GetVersionEx(&version); sl@0: if (version.dwMajorVersion < 6) sl@0: { sl@0: return; sl@0: } sl@0: sl@0: // Determine and allow iMON message number sl@0: UINT iMonMsg = sl@0: RegisterWindowMessage( sl@0: TEXT("iMonMessage-431F1DC6-F31A-4AC6-A1FA-A4BB9C44FF10")); sl@0: ChangeWindowMessageFilter(iMonMsg, MSGFLT_ADD); sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: bool IdwThread::WaitForWindow() sl@0: { sl@0: m_eventWindowCreationDone.Await(); sl@0: if (m_hWnd == NULL) sl@0: return false; sl@0: return true; sl@0: } sl@0: //------------------------------------------------------------------------------ sl@1: LRESULT CALLBACK IdwThread::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) sl@1: { sl@1: static IdwImonInitRequest* initRequest = NULL; sl@2: static DSPNotifyCode notification = DSPNM_PLUGIN_FAILED; sl@0: DSPResult* pResult; sl@0: Event* pFinished; sl@0: sl@0: switch (uMsg) sl@0: { sl@0: case WM_CREATE: sl@0: return 0; sl@0: sl@0: case WM_DESTROY: sl@0: PostQuitMessage(0); sl@0: return 0; sl@0: sl@1: //Notifications from iMON Display API sl@1: case IdwImonInitRequest::KMsgIdImonNotification: sl@2: notification=(DSPNotifyCode)wParam; //Keep track of our current status sl@1: if (initRequest) sl@1: { sl@1: initRequest->HandleImonNotifications(wParam,lParam); sl@1: initRequest=NULL; sl@1: } sl@1: return 0; sl@0: sl@0: case WM_IDW_INIT: sl@1: { sl@1: initRequest = (IdwImonInitRequest*)wParam; sl@1: LRESULT res=initRequest->Execute(uMsg); sl@1: if (res==1) sl@1: { sl@1: //Request has been completed sl@1: initRequest=NULL; sl@1: } sl@1: return 0; sl@1: } sl@0: sl@0: case WM_IDW_UNINIT: sl@0: pResult = (DSPResult*)wParam; sl@0: pFinished = (Event*)lParam; sl@0: *pResult = IMON_Display_Uninit(); sl@0: pFinished->Signal(); sl@0: return 0; sl@0: sl@0: case WM_IDW_ISINITED: sl@0: pResult = (DSPResult*)wParam; sl@0: pFinished = (Event*)lParam; sl@0: *pResult = IMON_Display_IsInited(); sl@0: pFinished->Signal(); sl@0: return 0; sl@0: sl@0: case WM_IDW_ISPLUGINMODEENABLED: sl@0: pResult = (DSPResult*)wParam; sl@0: pFinished = (Event*)lParam; sl@0: *pResult = IMON_Display_IsPluginModeEnabled(); sl@0: pFinished->Signal(); sl@0: return 0; sl@0: sl@2: case WM_IDW_STATUS: sl@2: { sl@2: IdwImonStatusRequest* request = (IdwImonStatusRequest*)wParam; sl@2: request->iNotification = notification; //Get our notification code sl@2: request->iResult = DSP_SUCCEEDED; sl@2: LRESULT res=request->Execute(uMsg); sl@2: return 0; sl@2: } sl@2: sl@0: case WM_IDW_SETVFDTEXT: sl@0: { sl@0: IdwSetVfdText* pSetVfdText = (IdwSetVfdText*)wParam; sl@0: WCHAR szLine1[20]; sl@0: WCHAR szLine2[20]; sl@0: pFinished = (Event*)lParam; sl@0: MapChars(szLine1, pSetVfdText->pszLine1, 16); sl@0: MapChars(szLine2, pSetVfdText->pszLine2, 16); sl@0: pSetVfdText->result = IMON_Display_SetVfdText(szLine1, szLine2); sl@0: pFinished->Signal(); sl@0: return 0; sl@0: } sl@0: sl@0: case WM_IDW_SETVFDEQ: sl@0: { sl@0: IdwSetVfdEq* pSetVfdEq = (IdwSetVfdEq*)wParam; sl@0: pFinished = (Event*)lParam; sl@0: pSetVfdEq->result = IMON_Display_SetVfdEqData(pSetVfdEq->pEqData); sl@0: pFinished->Signal(); sl@0: return 0; sl@0: } sl@0: sl@0: case WM_IDW_SETLCDTEXT: sl@0: { sl@0: IdwSetLcdText* pSetLcdText = (IdwSetLcdText*)wParam; sl@0: pFinished = (Event*)lParam; sl@0: pSetLcdText->result = IMON_Display_SetLcdText(pSetLcdText->pszLine1); sl@0: pFinished->Signal(); sl@0: return 0; sl@0: } sl@0: sl@0: case WM_IDW_SETLCDEQ: sl@0: { sl@0: IdwSetLcdEq* pSetLcdEq = (IdwSetLcdEq*)wParam; sl@0: pFinished = (Event*)lParam; sl@0: pSetLcdEq->result = sl@0: IMON_Display_SetLcdEqData(pSetLcdEq->pEqDataL, pSetLcdEq->pEqDataR); sl@0: pFinished->Signal(); sl@0: return 0; sl@0: } sl@0: sl@0: case WM_IDW_SETLCDALLICONS: sl@0: { sl@0: IdwSetLcdAllIcons* pSetLcdAllIcons = (IdwSetLcdAllIcons*)wParam; sl@0: pFinished = (Event*)lParam; sl@0: pSetLcdAllIcons->result = sl@0: IMON_Display_SetLcdAllIcons(pSetLcdAllIcons->bOn); sl@0: pFinished->Signal(); sl@0: return 0; sl@0: } sl@0: sl@0: case WM_IDW_SETLCDORANGEICON: sl@0: { sl@0: IdwSetLcdIcons2* pSetLcdIcons2 = (IdwSetLcdIcons2*)wParam; sl@0: pFinished = (Event*)lParam; sl@0: pSetLcdIcons2->result = IMON_Display_SetLcdOrangeIcon( sl@0: pSetLcdIcons2->btIconData1, pSetLcdIcons2->btIconData2); sl@0: pFinished->Signal(); sl@0: return 0; sl@0: } sl@0: sl@0: case WM_IDW_SETLCDMEDIATYPEICON: sl@0: { sl@0: IdwSetLcdIcons* pSetLcdIcons = (IdwSetLcdIcons*)wParam; sl@0: pFinished = (Event*)lParam; sl@0: pSetLcdIcons->result = sl@0: IMON_Display_SetLcdMediaTypeIcon(pSetLcdIcons->btIconData); sl@0: pFinished->Signal(); sl@0: return 0; sl@0: } sl@0: sl@0: case WM_IDW_SETLCDSPEAKERICON: sl@0: { sl@0: IdwSetLcdIcons2* pSetLcdIcons2 = (IdwSetLcdIcons2*)wParam; sl@0: pFinished = (Event*)lParam; sl@0: pSetLcdIcons2->result = IMON_Display_SetLcdSpeakerIcon( sl@0: pSetLcdIcons2->btIconData1, pSetLcdIcons2->btIconData2); sl@0: pFinished->Signal(); sl@0: return 0; sl@0: } sl@0: sl@0: case WM_IDW_SETLCDVIDEOCODEC: sl@0: { sl@0: IdwSetLcdIcons* pSetLcdIcons = (IdwSetLcdIcons*)wParam; sl@0: pFinished = (Event*)lParam; sl@0: pSetLcdIcons->result = sl@0: IMON_Display_SetLcdVideoCodecIcon(pSetLcdIcons->btIconData); sl@0: pFinished->Signal(); sl@0: return 0; sl@0: } sl@0: sl@0: case WM_IDW_SETLCDAUDIOCODEC: sl@0: { sl@0: IdwSetLcdIcons* pSetLcdIcons = (IdwSetLcdIcons*)wParam; sl@0: pFinished = (Event*)lParam; sl@0: pSetLcdIcons->result = sl@0: IMON_Display_SetLcdAudioCodecIcon(pSetLcdIcons->btIconData); sl@0: pFinished->Signal(); sl@0: return 0; sl@0: } sl@0: sl@0: case WM_IDW_SETLCDASPECTRATIO: sl@0: { sl@0: IdwSetLcdIcons* pSetLcdIcons = (IdwSetLcdIcons*)wParam; sl@0: pFinished = (Event*)lParam; sl@0: pSetLcdIcons->result = sl@0: IMON_Display_SetLcdAspectRatioIcon(pSetLcdIcons->btIconData); sl@0: pFinished->Signal(); sl@0: return 0; sl@0: } sl@0: sl@0: case WM_IDW_SETLCDETCICON: sl@0: { sl@0: IdwSetLcdIcons* pSetLcdIcons = (IdwSetLcdIcons*)wParam; sl@0: pFinished = (Event*)lParam; sl@0: pSetLcdIcons->result = sl@0: IMON_Display_SetLcdEtcIcon(pSetLcdIcons->btIconData); sl@0: pFinished->Signal(); sl@0: return 0; sl@0: } sl@0: sl@0: case WM_IDW_SETLCDPROGRESS: sl@0: { sl@0: IdwSetLcdProgress* pSetLcdProgress = (IdwSetLcdProgress*)wParam; sl@0: pFinished = (Event*)lParam; sl@0: pSetLcdProgress->result = IMON_Display_SetLcdProgress( sl@0: pSetLcdProgress->nCurPos, pSetLcdProgress->nTotal); sl@0: pFinished->Signal(); sl@0: return 0; sl@0: } sl@0: sl@0: case WM_IDW_INTERRUPT: sl@0: DestroyWindow(hwnd); sl@0: return 0; sl@0: } sl@0: return DefWindowProc(hwnd, uMsg, wParam, lParam); sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: void IdwThread::MapChars(LPWSTR lpszTarget, LPCWSTR lpszSource, sl@0: int nMaxLength) sl@0: { sl@0: int len = (int)wcslen(lpszSource); sl@0: if ((nMaxLength > 0) && (len > nMaxLength)) sl@0: len = nMaxLength; sl@0: lpszTarget[len] = 0; sl@0: for (int i = 0; i < len; ++i) sl@0: { sl@0: wchar_t ch = lpszSource[i]; sl@0: lpszTarget[i] = MapChar(ch); sl@0: } sl@0: } sl@0: //------------------------------------------------------------------------------ sl@0: #define IN_RANGE(ch, s, e) ((ch >= s) && (ch <= e)) sl@0: #define IS(ch, c) (ch == c) sl@0: wchar_t IdwThread::MapChar(wchar_t ch) sl@0: { sl@0: if (IN_RANGE(ch, 0x0020, 0x005B) sl@0: || IN_RANGE(ch, 0x005D, 0x007D) sl@0: || IS(ch, 0x0401) sl@0: || IS(ch, 0x0404) sl@0: || IN_RANGE(ch, 0x0406, 0x0407) sl@0: || IN_RANGE(ch, 0x0410, 0x044F) sl@0: || IS(ch, 0x0451) sl@0: || IS(ch, 0x0454) sl@0: || IN_RANGE(ch, 0x0456, 0x0457) sl@0: || IN_RANGE(ch, 0x0490, 0x0491)) sl@0: return ch; sl@0: sl@0: switch (ch) sl@0: { sl@0: case 0x5C: sl@0: return 0x8C; sl@0: case 0x7E: sl@0: return 0x8E; sl@0: case 0x7F: sl@0: return 0x20; sl@0: case 0xA2: sl@0: return 0xEC; sl@0: case 0xA3: sl@0: return 0x92; sl@0: case 0xA5: sl@0: return 0x5C; sl@0: case 0xA6: sl@0: return 0x98; sl@0: case 0xA7: sl@0: return 0x8F; sl@0: case 0xB0: sl@0: return 0xDF; sl@0: case 0xB5: sl@0: return 0xE4; sl@0: case 0xC2: sl@0: return 0x82; sl@0: case 0xC4: sl@0: return 0x80; sl@0: case 0xC5: sl@0: return 0x81; sl@0: case 0xC6: sl@0: return 0x90; sl@0: case 0xC7: sl@0: return 0x99; sl@0: case 0xD1: sl@0: return 0xEE; sl@0: case 0xD6: sl@0: return 0x86; sl@0: case 0xD8: sl@0: return 0x88; sl@0: case 0xDC: sl@0: return 0x8A; sl@0: case 0xDE: sl@0: return 0xF0; sl@0: case 0xDF: sl@0: return 0xE2; sl@0: case 0xE1: sl@0: return 0x83; sl@0: case 0xE4: sl@0: return 0xE1; sl@0: case 0xE5: sl@0: return 0x84; sl@0: case 0xE7: sl@0: return 0x99; sl@0: case 0xF1: sl@0: return 0xD1; sl@0: case 0xF6: sl@0: return 0x87; sl@0: case 0xF7: sl@0: return 0xFD; sl@0: case 0xF8: sl@0: return 0x89; sl@0: case 0xFC: sl@0: return 0x8B; sl@0: case 0xFE: sl@0: return 0xF0; sl@0: default: sl@0: return L'#'; sl@0: } sl@0: } sl@1: sl@1: /** sl@1: Handle iMON notifications sl@1: */ sl@1: void IdwImonInitRequest::HandleImonNotifications(WPARAM wParam, LPARAM lParam) sl@1: { sl@1: iNotification=(DSPNotifyCode)wParam; sl@1: iDspType=DSPN_DSP_NONE; sl@1: iResult= DSP_SUCCEEDED; sl@1: sl@1: switch (iNotification) sl@1: { sl@1: case DSPNM_PLUGIN_SUCCEED: sl@1: case DSPNM_IMON_RESTARTED: sl@1: case DSPNM_HW_CONNECTED: sl@1: //lParam is display type sl@1: iDspType = (DSPType)lParam; sl@3: iInitResult = DSPN_SUCCEEDED; sl@1: break; sl@1: case DSPNM_PLUGIN_FAILED: sl@1: case DSPNM_HW_DISCONNECTED: sl@1: case DSPNM_IMON_CLOSED: sl@1: //lParam is error sl@1: iInitResult = (DSPNInitResult)lParam; sl@1: break; sl@1: case DSPNM_LCD_TEXT_SCROLL_DONE: sl@1: //That should not happen, report an error sl@1: iResult = DSP_E_FAIL; sl@1: break; sl@1: } sl@1: sl@1: //Complete our request sl@1: Signal(); sl@1: } sl@1: sl@1: sl@1: /** sl@1: Run our display initialization. sl@1: */ sl@1: LRESULT IdwImonInitRequest::DoExecute() sl@1: { sl@1: iResult = IMON_Display_Init(iWnd, KMsgIdImonNotification); sl@1: if (iResult != DSP_SUCCEEDED) sl@1: { sl@1: iNotification = DSPNM_PLUGIN_FAILED; sl@1: iInitResult = DSPN_ERR_UNKNOWN; sl@1: iDspType = DSPN_DSP_NONE; sl@1: Signal(); sl@1: return 1; sl@1: } sl@1: sl@1: return 0; sl@1: } sl@2: sl@2: sl@2: /** sl@2: */ sl@2: LRESULT IdwImonStatusRequest::DoExecute() sl@2: { sl@2: Signal(); sl@2: return 0; sl@2: }