IdwThread.cpp
author sl
Sun, 16 Mar 2014 09:11:39 +0100
changeset 0 523a7dc3469f
child 1 d9a866996670
permissions -rw-r--r--
First contribution.
sl@0
     1
//------------------------------------------------------------------------------
sl@0
     2
#include "IdwThread.h"
sl@0
     3
#include "iMONDisplayAPI.h"
sl@0
     4
//------------------------------------------------------------------------------
sl@0
     5
#define CLASSNAME TEXT("IDW_IMON_COM_WNDCLASS")
sl@0
     6
//------------------------------------------------------------------------------
sl@0
     7
#define WM_IDW_IMON                (WM_USER + 1)
sl@0
     8
#define WM_IDW_INIT                (WM_USER + 2)
sl@0
     9
#define WM_IDW_UNINIT              (WM_USER + 3)
sl@0
    10
#define WM_IDW_ISINITED            (WM_USER + 4)
sl@0
    11
#define WM_IDW_ISPLUGINMODEENABLED (WM_USER + 5)
sl@0
    12
#define WM_IDW_SETVFDTEXT          (WM_USER + 6)
sl@0
    13
#define WM_IDW_SETVFDEQ            (WM_USER + 7)
sl@0
    14
#define WM_IDW_SETLCDTEXT          (WM_USER + 8)
sl@0
    15
#define WM_IDW_SETLCDEQ            (WM_USER + 9)
sl@0
    16
#define WM_IDW_SETLCDALLICONS      (WM_USER + 10)
sl@0
    17
#define WM_IDW_SETLCDORANGEICON    (WM_USER + 11)
sl@0
    18
#define WM_IDW_SETLCDMEDIATYPEICON (WM_USER + 12)
sl@0
    19
#define WM_IDW_SETLCDSPEAKERICON   (WM_USER + 13)
sl@0
    20
#define WM_IDW_SETLCDVIDEOCODEC    (WM_USER + 14)
sl@0
    21
#define WM_IDW_SETLCDAUDIOCODEC    (WM_USER + 15)
sl@0
    22
#define WM_IDW_SETLCDASPECTRATIO   (WM_USER + 16)
sl@0
    23
#define WM_IDW_SETLCDETCICON       (WM_USER + 17)
sl@0
    24
#define WM_IDW_SETLCDPROGRESS      (WM_USER + 18)
sl@0
    25
#define WM_IDW_INTERRUPT           (WM_USER + 100)
sl@0
    26
//------------------------------------------------------------------------------
sl@0
    27
struct IdwImonInitResult
sl@0
    28
{
sl@0
    29
  DSPResult result;
sl@0
    30
  DSPNInitResult initResult;
sl@0
    31
  DSPType dspType;
sl@0
    32
};
sl@0
    33
struct IdwSetVfdText
sl@0
    34
{
sl@0
    35
  DSPResult result;
sl@0
    36
  LPCWSTR pszLine1;
sl@0
    37
  LPCWSTR pszLine2;
sl@0
    38
};
sl@0
    39
struct IdwSetVfdEq
sl@0
    40
{
sl@0
    41
  DSPResult result;
sl@0
    42
  PDSPEQDATA pEqData;
sl@0
    43
};
sl@0
    44
struct IdwSetLcdText
sl@0
    45
{
sl@0
    46
  DSPResult result;
sl@0
    47
  LPCWSTR pszLine1;
sl@0
    48
};
sl@0
    49
struct IdwSetLcdEq
sl@0
    50
{
sl@0
    51
  DSPResult result;
sl@0
    52
  PDSPEQDATA pEqDataL;
sl@0
    53
  PDSPEQDATA pEqDataR;
sl@0
    54
};
sl@0
    55
struct IdwSetLcdAllIcons
sl@0
    56
{
sl@0
    57
  DSPResult result;
sl@0
    58
  BOOL bOn;
sl@0
    59
};
sl@0
    60
struct IdwSetLcdIcons
sl@0
    61
{
sl@0
    62
  DSPResult result;
sl@0
    63
  BYTE btIconData;
sl@0
    64
};
sl@0
    65
struct IdwSetLcdIcons2
sl@0
    66
{
sl@0
    67
  DSPResult result;
sl@0
    68
  BYTE btIconData1;
sl@0
    69
  BYTE btIconData2;
sl@0
    70
};
sl@0
    71
struct IdwSetLcdProgress
sl@0
    72
{
sl@0
    73
  DSPResult result;
sl@0
    74
  int nCurPos;
sl@0
    75
	int nTotal;
sl@0
    76
};
sl@0
    77
//------------------------------------------------------------------------------
sl@0
    78
IdwThread::IdwThread(HINSTANCE hInstance)
sl@0
    79
: m_hInstance(hInstance)
sl@0
    80
, m_hWnd(NULL)
sl@0
    81
{
sl@0
    82
}
sl@0
    83
//------------------------------------------------------------------------------
sl@0
    84
IdwThread::~IdwThread()
sl@0
    85
{
sl@0
    86
}
sl@0
    87
//------------------------------------------------------------------------------
sl@0
    88
void IdwThread::Interrupt()
sl@0
    89
{
sl@0
    90
  if (!WaitForWindow())
sl@0
    91
    return;
sl@0
    92
  PostMessage(m_hWnd, WM_IDW_INTERRUPT, 0, 0);
sl@0
    93
}
sl@0
    94
//------------------------------------------------------------------------------
sl@0
    95
DSPResult IdwThread::Init(IDW_INITRESULT* pInitResult)
sl@0
    96
{
sl@0
    97
  if (!WaitForWindow())
sl@0
    98
    return DSP_E_FAIL;
sl@0
    99
sl@0
   100
  IdwImonInitResult result;
sl@0
   101
  Event finished;
sl@0
   102
  PostMessage(m_hWnd, WM_IDW_INIT, (WPARAM)&result, (LPARAM)&finished);
sl@0
   103
  finished.Await();
sl@0
   104
  if (pInitResult != NULL)
sl@0
   105
  {
sl@0
   106
    pInitResult->initResult = result.initResult;
sl@0
   107
    pInitResult->dspType = result.dspType;
sl@0
   108
  }
sl@0
   109
sl@0
   110
  return result.result;
sl@0
   111
}
sl@0
   112
//------------------------------------------------------------------------------
sl@0
   113
DSPResult IdwThread::Uninit()
sl@0
   114
{
sl@0
   115
  if (!WaitForWindow())
sl@0
   116
    return DSP_E_FAIL;
sl@0
   117
sl@0
   118
  DSPResult result;  
sl@0
   119
  Event finished;
sl@0
   120
  PostMessage(m_hWnd, WM_IDW_UNINIT, (WPARAM)&result, (LPARAM)&finished);
sl@0
   121
  finished.Await();
sl@0
   122
sl@0
   123
  return result;
sl@0
   124
}
sl@0
   125
//------------------------------------------------------------------------------
sl@0
   126
DSPResult IdwThread::IsInited()
sl@0
   127
{
sl@0
   128
  if (!WaitForWindow())
sl@0
   129
    return DSP_E_FAIL;
sl@0
   130
sl@0
   131
  DSPResult result;  
sl@0
   132
  Event finished;
sl@0
   133
  PostMessage(m_hWnd, WM_IDW_ISINITED, (WPARAM)&result, (LPARAM)&finished);
sl@0
   134
  finished.Await();
sl@0
   135
sl@0
   136
  return result;
sl@0
   137
}
sl@0
   138
//------------------------------------------------------------------------------
sl@0
   139
DSPResult IdwThread::IsPluginModeEnabled()
sl@0
   140
{
sl@0
   141
  if (!WaitForWindow())
sl@0
   142
    return DSP_E_FAIL;
sl@0
   143
sl@0
   144
  DSPResult result;  
sl@0
   145
  Event finished;
sl@0
   146
  PostMessage(m_hWnd, WM_IDW_ISPLUGINMODEENABLED, (WPARAM)&result,
sl@0
   147
              (LPARAM)&finished);
sl@0
   148
  finished.Await();
sl@0
   149
sl@0
   150
  return result;
sl@0
   151
}
sl@0
   152
//------------------------------------------------------------------------------
sl@0
   153
DSPResult IdwThread::SetVfdText(LPCWSTR lpszLine1, LPCWSTR lpszLine2)
sl@0
   154
{
sl@0
   155
  if (!WaitForWindow())
sl@0
   156
    return DSP_E_FAIL;
sl@0
   157
sl@0
   158
  IdwSetVfdText text;
sl@0
   159
  text.pszLine1 = lpszLine1;
sl@0
   160
  text.pszLine2 = lpszLine2;
sl@0
   161
  Event finished;
sl@0
   162
  PostMessage(m_hWnd, WM_IDW_SETVFDTEXT, (WPARAM)&text, (LPARAM)&finished);
sl@0
   163
  finished.Await();
sl@0
   164
sl@0
   165
  return text.result;
sl@0
   166
}
sl@0
   167
//------------------------------------------------------------------------------
sl@0
   168
DSPResult IdwThread::SetVfdEqData(PDSPEQDATA pEqData)
sl@0
   169
{
sl@0
   170
  if (!WaitForWindow())
sl@0
   171
    return DSP_E_FAIL;
sl@0
   172
sl@0
   173
  IdwSetVfdEq eq;
sl@0
   174
  eq.pEqData = pEqData;
sl@0
   175
  Event finished;
sl@0
   176
  PostMessage(m_hWnd, WM_IDW_SETVFDEQ, (WPARAM)&eq, (LPARAM)&finished);
sl@0
   177
  finished.Await();
sl@0
   178
sl@0
   179
  return eq.result;
sl@0
   180
}
sl@0
   181
//------------------------------------------------------------------------------
sl@0
   182
DSPResult IdwThread::SetLcdText(LPCWSTR lpszLine1)
sl@0
   183
{
sl@0
   184
  if (!WaitForWindow())
sl@0
   185
    return DSP_E_FAIL;
sl@0
   186
sl@0
   187
  IdwSetLcdText text;
sl@0
   188
  text.pszLine1 = lpszLine1;
sl@0
   189
  Event finished;
sl@0
   190
  PostMessage(m_hWnd, WM_IDW_SETLCDTEXT, (WPARAM)&text, (LPARAM)&finished);
sl@0
   191
  finished.Await();
sl@0
   192
sl@0
   193
  return text.result;
sl@0
   194
}
sl@0
   195
//------------------------------------------------------------------------------
sl@0
   196
DSPResult IdwThread::SetLcdEqData(PDSPEQDATA pEqDataL, PDSPEQDATA pEqDataR)
sl@0
   197
{
sl@0
   198
  if (!WaitForWindow())
sl@0
   199
    return DSP_E_FAIL;
sl@0
   200
sl@0
   201
  IdwSetLcdEq eq;
sl@0
   202
  eq.pEqDataL = pEqDataL;
sl@0
   203
  eq.pEqDataR = pEqDataR;
sl@0
   204
  Event finished;
sl@0
   205
  PostMessage(m_hWnd, WM_IDW_SETLCDEQ, (WPARAM)&eq, (LPARAM)&finished);
sl@0
   206
  finished.Await();
sl@0
   207
sl@0
   208
  return eq.result;
sl@0
   209
}
sl@0
   210
//------------------------------------------------------------------------------
sl@0
   211
DSPResult IdwThread::SetLcdAllIcons(BOOL bOn)
sl@0
   212
{
sl@0
   213
  if (!WaitForWindow())
sl@0
   214
    return DSP_E_FAIL;
sl@0
   215
sl@0
   216
  IdwSetLcdAllIcons allIcons;
sl@0
   217
  allIcons.bOn = bOn;
sl@0
   218
  Event finished;
sl@0
   219
  PostMessage(m_hWnd, WM_IDW_SETLCDALLICONS, 
sl@0
   220
		(WPARAM)&allIcons, (LPARAM)&finished);
sl@0
   221
  finished.Await();
sl@0
   222
sl@0
   223
  return allIcons.result;
sl@0
   224
}
sl@0
   225
//------------------------------------------------------------------------------
sl@0
   226
DSPResult IdwThread::SetLcdOrangeIcon(BYTE btIconData1, BYTE btIconData2)
sl@0
   227
{
sl@0
   228
  if (!WaitForWindow())
sl@0
   229
    return DSP_E_FAIL;
sl@0
   230
sl@0
   231
  IdwSetLcdIcons2 iconData;
sl@0
   232
  iconData.btIconData1 = btIconData1;
sl@0
   233
  iconData.btIconData2 = btIconData2;
sl@0
   234
  Event finished;
sl@0
   235
  PostMessage(m_hWnd, WM_IDW_SETLCDORANGEICON, 
sl@0
   236
		(WPARAM)&iconData, (LPARAM)&finished);
sl@0
   237
  finished.Await();
sl@0
   238
sl@0
   239
  return iconData.result;
sl@0
   240
}
sl@0
   241
//------------------------------------------------------------------------------
sl@0
   242
DSPResult IdwThread::SetLcdMediaTypeIcon(BYTE btIconData)
sl@0
   243
{
sl@0
   244
  if (!WaitForWindow())
sl@0
   245
    return DSP_E_FAIL;
sl@0
   246
sl@0
   247
  IdwSetLcdIcons iconData;
sl@0
   248
  iconData.btIconData = btIconData;
sl@0
   249
  Event finished;
sl@0
   250
  PostMessage(m_hWnd, WM_IDW_SETLCDMEDIATYPEICON, 
sl@0
   251
		(WPARAM)&iconData, (LPARAM)&finished);
sl@0
   252
  finished.Await();
sl@0
   253
sl@0
   254
  return iconData.result;
sl@0
   255
}
sl@0
   256
//------------------------------------------------------------------------------
sl@0
   257
DSPResult IdwThread::SetLcdSpeakerIcon(BYTE btIconData1, BYTE btIconData2)
sl@0
   258
{
sl@0
   259
  if (!WaitForWindow())
sl@0
   260
    return DSP_E_FAIL;
sl@0
   261
sl@0
   262
  IdwSetLcdIcons2 iconData;
sl@0
   263
  iconData.btIconData1 = btIconData1;
sl@0
   264
  iconData.btIconData2 = btIconData2;
sl@0
   265
  Event finished;
sl@0
   266
  PostMessage(m_hWnd, WM_IDW_SETLCDSPEAKERICON, 
sl@0
   267
		(WPARAM)&iconData, (LPARAM)&finished);
sl@0
   268
  finished.Await();
sl@0
   269
sl@0
   270
  return iconData.result;
sl@0
   271
}
sl@0
   272
//------------------------------------------------------------------------------
sl@0
   273
DSPResult IdwThread::SetLcdVideoCodecIcon(BYTE btIconData)
sl@0
   274
{
sl@0
   275
  if (!WaitForWindow())
sl@0
   276
    return DSP_E_FAIL;
sl@0
   277
sl@0
   278
  IdwSetLcdIcons iconData;
sl@0
   279
  iconData.btIconData = btIconData;
sl@0
   280
  Event finished;
sl@0
   281
  PostMessage(m_hWnd, WM_IDW_SETLCDVIDEOCODEC, 
sl@0
   282
		(WPARAM)&iconData, (LPARAM)&finished);
sl@0
   283
  finished.Await();
sl@0
   284
sl@0
   285
  return iconData.result;
sl@0
   286
}
sl@0
   287
//------------------------------------------------------------------------------
sl@0
   288
DSPResult IdwThread::SetLcdAudioCodecIcon(BYTE btIconData)
sl@0
   289
{
sl@0
   290
  if (!WaitForWindow())
sl@0
   291
    return DSP_E_FAIL;
sl@0
   292
sl@0
   293
  IdwSetLcdIcons iconData;
sl@0
   294
  iconData.btIconData = btIconData;
sl@0
   295
  Event finished;
sl@0
   296
  PostMessage(m_hWnd, WM_IDW_SETLCDAUDIOCODEC, 
sl@0
   297
		(WPARAM)&iconData, (LPARAM)&finished);
sl@0
   298
  finished.Await();
sl@0
   299
sl@0
   300
  return iconData.result;
sl@0
   301
}
sl@0
   302
//------------------------------------------------------------------------------
sl@0
   303
DSPResult IdwThread::SetLcdAspectRatioIcon(BYTE btIconData)
sl@0
   304
{
sl@0
   305
  if (!WaitForWindow())
sl@0
   306
    return DSP_E_FAIL;
sl@0
   307
sl@0
   308
  IdwSetLcdIcons iconData;
sl@0
   309
  iconData.btIconData = btIconData;
sl@0
   310
  Event finished;
sl@0
   311
  PostMessage(m_hWnd, WM_IDW_SETLCDASPECTRATIO, 
sl@0
   312
		(WPARAM)&iconData, (LPARAM)&finished);
sl@0
   313
  finished.Await();
sl@0
   314
sl@0
   315
  return iconData.result;
sl@0
   316
}
sl@0
   317
//------------------------------------------------------------------------------
sl@0
   318
DSPResult IdwThread::SetLcdEtcIcon(BYTE btIconData)
sl@0
   319
{
sl@0
   320
  if (!WaitForWindow())
sl@0
   321
    return DSP_E_FAIL;
sl@0
   322
sl@0
   323
  IdwSetLcdIcons iconData;
sl@0
   324
  iconData.btIconData = btIconData;
sl@0
   325
  Event finished;
sl@0
   326
  PostMessage(m_hWnd, WM_IDW_SETLCDETCICON, 
sl@0
   327
		(WPARAM)&iconData, (LPARAM)&finished);
sl@0
   328
  finished.Await();
sl@0
   329
sl@0
   330
  return iconData.result;
sl@0
   331
}
sl@0
   332
//------------------------------------------------------------------------------
sl@0
   333
DSPResult IdwThread::SetLcdProgress(int nCurPos, int nTotal)
sl@0
   334
{
sl@0
   335
  if (!WaitForWindow())
sl@0
   336
    return DSP_E_FAIL;
sl@0
   337
sl@0
   338
  IdwSetLcdProgress progressData;
sl@0
   339
  progressData.nCurPos = nCurPos;
sl@0
   340
	progressData.nTotal = nTotal;
sl@0
   341
  Event finished;
sl@0
   342
  PostMessage(m_hWnd, WM_IDW_SETLCDPROGRESS, 
sl@0
   343
		(WPARAM)&progressData, (LPARAM)&finished);
sl@0
   344
  finished.Await();
sl@0
   345
sl@0
   346
  return progressData.result;
sl@0
   347
}
sl@0
   348
//------------------------------------------------------------------------------
sl@0
   349
void IdwThread::Run()
sl@0
   350
{
sl@0
   351
  if (!RegisterClass())
sl@0
   352
  {
sl@0
   353
    m_eventWindowCreationDone.Signal();
sl@0
   354
    return;
sl@0
   355
  }
sl@0
   356
  if (!CreateMessageWindow())
sl@0
   357
  {
sl@0
   358
    m_eventWindowCreationDone.Signal();
sl@0
   359
    return;
sl@0
   360
  }
sl@0
   361
  AllowImonMessages();
sl@0
   362
sl@0
   363
  m_eventWindowCreationDone.Signal();
sl@0
   364
sl@0
   365
  MSG msg;
sl@0
   366
  BOOL fGotMessage;
sl@0
   367
  while ((fGotMessage = GetMessage(&msg, (HWND) NULL, 0, 0)) != 0
sl@0
   368
       && fGotMessage != -1) 
sl@0
   369
  { 
sl@0
   370
    TranslateMessage(&msg); 
sl@0
   371
    DispatchMessage(&msg); 
sl@0
   372
  } 
sl@0
   373
}
sl@0
   374
//------------------------------------------------------------------------------
sl@0
   375
bool IdwThread::RegisterClass()
sl@0
   376
{
sl@0
   377
  WNDCLASSEX wc;
sl@0
   378
  if (GetClassInfoEx(m_hInstance, CLASSNAME, &wc))
sl@0
   379
  {
sl@0
   380
    return true;
sl@0
   381
  }
sl@0
   382
sl@0
   383
  wc.cbSize = sizeof(wc);
sl@0
   384
  wc.style = CS_HREDRAW | CS_VREDRAW;
sl@0
   385
  wc.lpfnWndProc = IdwThread::WndProc;
sl@0
   386
  wc.cbClsExtra = 0;
sl@0
   387
  wc.cbWndExtra = 0;
sl@0
   388
  wc.hInstance = m_hInstance;
sl@0
   389
  wc.hIcon = NULL;
sl@0
   390
  wc.hCursor = NULL;
sl@0
   391
  wc.hbrBackground = NULL;
sl@0
   392
  wc.lpszMenuName =  NULL;
sl@0
   393
  wc.lpszClassName = CLASSNAME;
sl@0
   394
  wc.hIconSm = NULL;
sl@0
   395
  if (::RegisterClassEx(&wc))
sl@0
   396
  {
sl@0
   397
    return true;
sl@0
   398
  }
sl@0
   399
  return false;
sl@0
   400
}
sl@0
   401
//------------------------------------------------------------------------------
sl@0
   402
bool IdwThread::CreateMessageWindow()
sl@0
   403
{
sl@0
   404
  m_hWnd = CreateWindow( 
sl@0
   405
    CLASSNAME,
sl@0
   406
    TEXT("MP iMON MessageWindow"),
sl@0
   407
    0,
sl@0
   408
    0, 0, 0, 0,
sl@0
   409
    HWND_MESSAGE,
sl@0
   410
    NULL,
sl@0
   411
    m_hInstance,
sl@0
   412
    NULL);
sl@0
   413
 
sl@0
   414
  if (!m_hWnd) 
sl@0
   415
    return false;
sl@0
   416
  return true; 
sl@0
   417
}
sl@0
   418
//------------------------------------------------------------------------------
sl@0
   419
void IdwThread::AllowImonMessages()
sl@0
   420
{
sl@0
   421
  // Determine OS
sl@0
   422
  OSVERSIONINFO version;
sl@0
   423
  version.dwOSVersionInfoSize = sizeof(version);
sl@0
   424
  GetVersionEx(&version);
sl@0
   425
  if (version.dwMajorVersion < 6)
sl@0
   426
  {
sl@0
   427
    return;
sl@0
   428
  }
sl@0
   429
sl@0
   430
  // Determine and allow iMON message number
sl@0
   431
  UINT iMonMsg =
sl@0
   432
    RegisterWindowMessage(
sl@0
   433
    TEXT("iMonMessage-431F1DC6-F31A-4AC6-A1FA-A4BB9C44FF10"));
sl@0
   434
  ChangeWindowMessageFilter(iMonMsg, MSGFLT_ADD);  
sl@0
   435
}
sl@0
   436
//------------------------------------------------------------------------------
sl@0
   437
bool IdwThread::WaitForWindow()
sl@0
   438
{
sl@0
   439
  m_eventWindowCreationDone.Await();
sl@0
   440
  if (m_hWnd == NULL)
sl@0
   441
    return false;
sl@0
   442
  return true;
sl@0
   443
}
sl@0
   444
//------------------------------------------------------------------------------
sl@0
   445
LRESULT CALLBACK IdwThread::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam,
sl@0
   446
                                    LPARAM lParam)
sl@0
   447
{
sl@0
   448
  static bool initing = false;
sl@0
   449
  static IdwImonInitResult* pInitResult = NULL;
sl@0
   450
  static Event* pInitFinished = NULL;
sl@0
   451
sl@0
   452
  DSPResult* pResult;
sl@0
   453
  Event* pFinished;
sl@0
   454
sl@0
   455
  switch (uMsg) 
sl@0
   456
  { 
sl@0
   457
    case WM_CREATE: 
sl@0
   458
      return 0; 
sl@0
   459
 
sl@0
   460
    case WM_DESTROY:
sl@0
   461
      PostQuitMessage(0);
sl@0
   462
      return 0;
sl@0
   463
sl@0
   464
    case WM_IDW_IMON:
sl@0
   465
      if (initing)
sl@0
   466
      {
sl@0
   467
        initing = false;
sl@0
   468
        pInitResult->initResult = (DSPNInitResult)wParam;
sl@0
   469
        pInitResult->dspType = (DSPType)lParam;
sl@0
   470
        pInitFinished->Signal();
sl@0
   471
      }
sl@0
   472
      return 0;
sl@0
   473
sl@0
   474
    case WM_IDW_INIT:
sl@0
   475
      initing = true;
sl@0
   476
      pInitResult = (IdwImonInitResult*)wParam;
sl@0
   477
      pInitFinished = (Event*)lParam;
sl@0
   478
      pInitResult->result = IMON_Display_Init(hwnd, WM_IDW_IMON);
sl@0
   479
      if (pInitResult->result != DSP_SUCCEEDED)
sl@0
   480
      {
sl@0
   481
        initing = false;
sl@0
   482
        pInitResult->initResult = DSPN_ERR_UNKNOWN;
sl@0
   483
        pInitResult->dspType = DSPN_DSP_NONE;
sl@0
   484
        pInitFinished->Signal();
sl@0
   485
      }
sl@0
   486
      return 0;
sl@0
   487
sl@0
   488
    case WM_IDW_UNINIT:
sl@0
   489
      pResult = (DSPResult*)wParam;
sl@0
   490
      pFinished = (Event*)lParam;
sl@0
   491
      *pResult = IMON_Display_Uninit();
sl@0
   492
      pFinished->Signal();
sl@0
   493
      return 0;
sl@0
   494
sl@0
   495
    case WM_IDW_ISINITED:
sl@0
   496
      pResult = (DSPResult*)wParam;
sl@0
   497
      pFinished = (Event*)lParam;
sl@0
   498
      *pResult = IMON_Display_IsInited();
sl@0
   499
      pFinished->Signal();
sl@0
   500
      return 0;
sl@0
   501
sl@0
   502
    case WM_IDW_ISPLUGINMODEENABLED:
sl@0
   503
      pResult = (DSPResult*)wParam;
sl@0
   504
      pFinished = (Event*)lParam;
sl@0
   505
      *pResult = IMON_Display_IsPluginModeEnabled();
sl@0
   506
      pFinished->Signal();
sl@0
   507
      return 0;
sl@0
   508
sl@0
   509
    case WM_IDW_SETVFDTEXT:
sl@0
   510
			{
sl@0
   511
				IdwSetVfdText* pSetVfdText = (IdwSetVfdText*)wParam;			
sl@0
   512
				WCHAR szLine1[20];
sl@0
   513
				WCHAR szLine2[20];
sl@0
   514
				pFinished = (Event*)lParam;
sl@0
   515
				MapChars(szLine1, pSetVfdText->pszLine1, 16);
sl@0
   516
				MapChars(szLine2, pSetVfdText->pszLine2, 16);
sl@0
   517
				pSetVfdText->result = IMON_Display_SetVfdText(szLine1, szLine2);
sl@0
   518
				pFinished->Signal();
sl@0
   519
				return 0;
sl@0
   520
			}
sl@0
   521
sl@0
   522
    case WM_IDW_SETVFDEQ:
sl@0
   523
			{
sl@0
   524
				IdwSetVfdEq* pSetVfdEq = (IdwSetVfdEq*)wParam;
sl@0
   525
				pFinished = (Event*)lParam;
sl@0
   526
				pSetVfdEq->result = IMON_Display_SetVfdEqData(pSetVfdEq->pEqData);
sl@0
   527
				pFinished->Signal();
sl@0
   528
				return 0;
sl@0
   529
			}
sl@0
   530
sl@0
   531
    case WM_IDW_SETLCDTEXT:
sl@0
   532
			{
sl@0
   533
				IdwSetLcdText* pSetLcdText = (IdwSetLcdText*)wParam;
sl@0
   534
				pFinished = (Event*)lParam;
sl@0
   535
				pSetLcdText->result = IMON_Display_SetLcdText(pSetLcdText->pszLine1);
sl@0
   536
				pFinished->Signal();
sl@0
   537
				return 0;
sl@0
   538
			}
sl@0
   539
sl@0
   540
    case WM_IDW_SETLCDEQ:
sl@0
   541
			{
sl@0
   542
				IdwSetLcdEq* pSetLcdEq = (IdwSetLcdEq*)wParam;
sl@0
   543
				pFinished = (Event*)lParam;
sl@0
   544
				pSetLcdEq->result = 
sl@0
   545
					IMON_Display_SetLcdEqData(pSetLcdEq->pEqDataL, pSetLcdEq->pEqDataR);
sl@0
   546
				pFinished->Signal();
sl@0
   547
				return 0;
sl@0
   548
			}
sl@0
   549
sl@0
   550
		case WM_IDW_SETLCDALLICONS:
sl@0
   551
			{
sl@0
   552
				IdwSetLcdAllIcons* pSetLcdAllIcons = (IdwSetLcdAllIcons*)wParam;
sl@0
   553
				pFinished = (Event*)lParam;
sl@0
   554
				pSetLcdAllIcons->result = 
sl@0
   555
					IMON_Display_SetLcdAllIcons(pSetLcdAllIcons->bOn);
sl@0
   556
				pFinished->Signal();
sl@0
   557
				return 0;
sl@0
   558
			}
sl@0
   559
sl@0
   560
		case WM_IDW_SETLCDORANGEICON:
sl@0
   561
			{
sl@0
   562
				IdwSetLcdIcons2* pSetLcdIcons2 = (IdwSetLcdIcons2*)wParam;
sl@0
   563
				pFinished = (Event*)lParam;
sl@0
   564
				pSetLcdIcons2->result = IMON_Display_SetLcdOrangeIcon(
sl@0
   565
					pSetLcdIcons2->btIconData1, pSetLcdIcons2->btIconData2);
sl@0
   566
				pFinished->Signal();
sl@0
   567
				return 0;
sl@0
   568
			}
sl@0
   569
sl@0
   570
	  case WM_IDW_SETLCDMEDIATYPEICON:
sl@0
   571
			{
sl@0
   572
				IdwSetLcdIcons* pSetLcdIcons = (IdwSetLcdIcons*)wParam;
sl@0
   573
				pFinished = (Event*)lParam;
sl@0
   574
				pSetLcdIcons->result = 
sl@0
   575
					IMON_Display_SetLcdMediaTypeIcon(pSetLcdIcons->btIconData);
sl@0
   576
				pFinished->Signal();
sl@0
   577
				return 0;
sl@0
   578
			}
sl@0
   579
sl@0
   580
		case WM_IDW_SETLCDSPEAKERICON:
sl@0
   581
			{
sl@0
   582
				IdwSetLcdIcons2* pSetLcdIcons2 = (IdwSetLcdIcons2*)wParam;
sl@0
   583
				pFinished = (Event*)lParam;
sl@0
   584
				pSetLcdIcons2->result = IMON_Display_SetLcdSpeakerIcon(
sl@0
   585
					pSetLcdIcons2->btIconData1, pSetLcdIcons2->btIconData2);
sl@0
   586
				pFinished->Signal();
sl@0
   587
				return 0;
sl@0
   588
			}
sl@0
   589
sl@0
   590
	  case WM_IDW_SETLCDVIDEOCODEC:
sl@0
   591
			{
sl@0
   592
				IdwSetLcdIcons* pSetLcdIcons = (IdwSetLcdIcons*)wParam;
sl@0
   593
				pFinished = (Event*)lParam;
sl@0
   594
				pSetLcdIcons->result = 
sl@0
   595
					IMON_Display_SetLcdVideoCodecIcon(pSetLcdIcons->btIconData);
sl@0
   596
				pFinished->Signal();
sl@0
   597
				return 0;
sl@0
   598
			}
sl@0
   599
sl@0
   600
		case WM_IDW_SETLCDAUDIOCODEC:
sl@0
   601
			{
sl@0
   602
				IdwSetLcdIcons* pSetLcdIcons = (IdwSetLcdIcons*)wParam;
sl@0
   603
				pFinished = (Event*)lParam;
sl@0
   604
				pSetLcdIcons->result = 
sl@0
   605
					IMON_Display_SetLcdAudioCodecIcon(pSetLcdIcons->btIconData);
sl@0
   606
				pFinished->Signal();
sl@0
   607
				return 0;
sl@0
   608
			}
sl@0
   609
sl@0
   610
		case WM_IDW_SETLCDASPECTRATIO:
sl@0
   611
			{
sl@0
   612
				IdwSetLcdIcons* pSetLcdIcons = (IdwSetLcdIcons*)wParam;
sl@0
   613
				pFinished = (Event*)lParam;
sl@0
   614
				pSetLcdIcons->result = 
sl@0
   615
					IMON_Display_SetLcdAspectRatioIcon(pSetLcdIcons->btIconData);
sl@0
   616
				pFinished->Signal();
sl@0
   617
				return 0;
sl@0
   618
			}
sl@0
   619
sl@0
   620
		case WM_IDW_SETLCDETCICON:
sl@0
   621
			{
sl@0
   622
				IdwSetLcdIcons* pSetLcdIcons = (IdwSetLcdIcons*)wParam;
sl@0
   623
				pFinished = (Event*)lParam;
sl@0
   624
				pSetLcdIcons->result = 
sl@0
   625
					IMON_Display_SetLcdEtcIcon(pSetLcdIcons->btIconData);
sl@0
   626
				pFinished->Signal();
sl@0
   627
				return 0;
sl@0
   628
			}
sl@0
   629
sl@0
   630
		case WM_IDW_SETLCDPROGRESS:
sl@0
   631
			{
sl@0
   632
				IdwSetLcdProgress* pSetLcdProgress = (IdwSetLcdProgress*)wParam;
sl@0
   633
				pFinished = (Event*)lParam;
sl@0
   634
				pSetLcdProgress->result = IMON_Display_SetLcdProgress(
sl@0
   635
					pSetLcdProgress->nCurPos, pSetLcdProgress->nTotal);
sl@0
   636
				pFinished->Signal();
sl@0
   637
				return 0;
sl@0
   638
			}
sl@0
   639
sl@0
   640
    case WM_IDW_INTERRUPT:
sl@0
   641
      DestroyWindow(hwnd);
sl@0
   642
      return 0;
sl@0
   643
	}
sl@0
   644
  return DefWindowProc(hwnd, uMsg, wParam, lParam);
sl@0
   645
}
sl@0
   646
//------------------------------------------------------------------------------
sl@0
   647
void IdwThread::MapChars(LPWSTR lpszTarget, LPCWSTR lpszSource,
sl@0
   648
                         int nMaxLength)
sl@0
   649
{
sl@0
   650
  int len = (int)wcslen(lpszSource);
sl@0
   651
  if ((nMaxLength > 0) && (len > nMaxLength))
sl@0
   652
    len = nMaxLength;
sl@0
   653
  lpszTarget[len] = 0;
sl@0
   654
  for (int i = 0; i < len; ++i)
sl@0
   655
  {
sl@0
   656
    wchar_t ch = lpszSource[i];
sl@0
   657
    lpszTarget[i] = MapChar(ch);
sl@0
   658
  }
sl@0
   659
}
sl@0
   660
//------------------------------------------------------------------------------
sl@0
   661
#define IN_RANGE(ch, s, e) ((ch >= s) && (ch <= e))
sl@0
   662
#define IS(ch, c) (ch == c)
sl@0
   663
wchar_t IdwThread::MapChar(wchar_t ch)
sl@0
   664
{
sl@0
   665
  if (IN_RANGE(ch, 0x0020, 0x005B)
sl@0
   666
   || IN_RANGE(ch, 0x005D, 0x007D)
sl@0
   667
   || IS(ch, 0x0401)
sl@0
   668
   || IS(ch, 0x0404)
sl@0
   669
   || IN_RANGE(ch, 0x0406, 0x0407)
sl@0
   670
   || IN_RANGE(ch, 0x0410, 0x044F)
sl@0
   671
   || IS(ch, 0x0451)
sl@0
   672
   || IS(ch, 0x0454)
sl@0
   673
   || IN_RANGE(ch, 0x0456, 0x0457)
sl@0
   674
   || IN_RANGE(ch, 0x0490, 0x0491))
sl@0
   675
    return ch;
sl@0
   676
sl@0
   677
  switch (ch)
sl@0
   678
  {
sl@0
   679
  case 0x5C:
sl@0
   680
    return 0x8C;
sl@0
   681
  case 0x7E:
sl@0
   682
    return 0x8E;
sl@0
   683
  case 0x7F:
sl@0
   684
    return 0x20;
sl@0
   685
  case 0xA2:
sl@0
   686
    return 0xEC;
sl@0
   687
  case 0xA3:
sl@0
   688
    return 0x92;
sl@0
   689
  case 0xA5:
sl@0
   690
    return 0x5C;
sl@0
   691
  case 0xA6:
sl@0
   692
    return 0x98;
sl@0
   693
  case 0xA7:
sl@0
   694
    return 0x8F;
sl@0
   695
  case 0xB0:
sl@0
   696
    return 0xDF;
sl@0
   697
  case 0xB5:
sl@0
   698
    return 0xE4;
sl@0
   699
  case 0xC2:
sl@0
   700
    return 0x82;
sl@0
   701
  case 0xC4:
sl@0
   702
    return 0x80;
sl@0
   703
  case 0xC5:
sl@0
   704
    return 0x81;
sl@0
   705
  case 0xC6:
sl@0
   706
    return 0x90;
sl@0
   707
  case 0xC7:
sl@0
   708
    return 0x99;
sl@0
   709
  case 0xD1:
sl@0
   710
    return 0xEE;
sl@0
   711
  case 0xD6:
sl@0
   712
    return 0x86;
sl@0
   713
  case 0xD8:
sl@0
   714
    return 0x88;
sl@0
   715
  case 0xDC:
sl@0
   716
    return 0x8A;
sl@0
   717
  case 0xDE:
sl@0
   718
    return 0xF0;
sl@0
   719
  case 0xDF:
sl@0
   720
    return 0xE2;
sl@0
   721
  case 0xE1:
sl@0
   722
    return 0x83;
sl@0
   723
  case 0xE4:
sl@0
   724
    return 0xE1;
sl@0
   725
  case 0xE5:
sl@0
   726
    return 0x84;
sl@0
   727
  case 0xE7:
sl@0
   728
    return 0x99;
sl@0
   729
  case 0xF1:
sl@0
   730
    return 0xD1;
sl@0
   731
  case 0xF6:
sl@0
   732
    return 0x87;
sl@0
   733
  case 0xF7:
sl@0
   734
    return 0xFD;
sl@0
   735
  case 0xF8:
sl@0
   736
    return 0x89;
sl@0
   737
  case 0xFC:
sl@0
   738
    return 0x8B;
sl@0
   739
  case 0xFE:
sl@0
   740
    return 0xF0;
sl@0
   741
  default:
sl@0
   742
    return L'#';
sl@0
   743
  }
sl@0
   744
}
sl@0
   745
//------------------------------------------------------------------------------