MALINES.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:15k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //==========================================================================;
  2. //
  3. //  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  4. //  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  5. //  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  6. //  PURPOSE.
  7. //
  8. //  Copyright (C) 1993 - 1997  Microsoft Corporation.  All Rights Reserved.
  9. //
  10. //--------------------------------------------------------------------------;
  11. //
  12. //  malines.c
  13. //
  14. //  Description:
  15. //
  16. //
  17. //  History:
  18. //       9/21/93
  19. //
  20. //==========================================================================;
  21. #include <windows.h>
  22. #include <windowsx.h>
  23. #include <mmsystem.h>
  24. #include "mixapp.h"
  25. #include "debug.h"
  26. TCHAR       gszLineFormatTitle[]        = TEXT("Typet3!Componentt10!Line IDt6!Flagst6!Ctrlst3!Connst3!Name");
  27. TCHAR       gszLineFormatList[]         = TEXT("%-s%ct%-st%.08lXht%.08lXht%lut%lut%-s");
  28. //==========================================================================;
  29. //
  30. //
  31. //
  32. //
  33. //==========================================================================;
  34. //--------------------------------------------------------------------------;
  35. //
  36. //  BOOL MixAppGetComponentName
  37. //
  38. //  Description:
  39. //
  40. //
  41. //  Arguments:
  42. //      LPMIXERLINE pmxl:
  43. //
  44. //      LPTSTR szComponent:
  45. //
  46. //  Return (BOOL):
  47. //
  48. //  History:
  49. //      08/18/93
  50. //
  51. //--------------------------------------------------------------------------;
  52. BOOL FNLOCAL MixAppGetComponentName
  53. (
  54.     LPMIXERLINE             pmxl,
  55.     LPTSTR                  szComponent
  56. )
  57. {
  58.     //
  59.     //
  60.     //
  61.     if (0 == (MIXERLINE_LINEF_SOURCE & pmxl->fdwLine))
  62.     {
  63.         switch (pmxl->dwComponentType)
  64.         {
  65.             case MIXERLINE_COMPONENTTYPE_DST_UNDEFINED:
  66.                 lstrcpy(szComponent, "Undefined");
  67.                 break;
  68.             case MIXERLINE_COMPONENTTYPE_DST_DIGITAL:
  69.                 lstrcpy(szComponent, "Digital");
  70.                 break;
  71.             case MIXERLINE_COMPONENTTYPE_DST_LINE:
  72.                 lstrcpy(szComponent, "Line Level");
  73.                 break;
  74.             case MIXERLINE_COMPONENTTYPE_DST_MONITOR:
  75.                 lstrcpy(szComponent, "Monitor");
  76.                 break;
  77.             case MIXERLINE_COMPONENTTYPE_DST_SPEAKERS:
  78.                 lstrcpy(szComponent, "Speakers");
  79.                 break;
  80.             case MIXERLINE_COMPONENTTYPE_DST_HEADPHONES:
  81.                 lstrcpy(szComponent, "Headphones");
  82.                 break;
  83.             case MIXERLINE_COMPONENTTYPE_DST_TELEPHONE:
  84.                 lstrcpy(szComponent, "Telephone");
  85.                 break;
  86.             case MIXERLINE_COMPONENTTYPE_DST_WAVEIN:
  87.                 lstrcpy(szComponent, "Wave Input");
  88.                 break;
  89.             case MIXERLINE_COMPONENTTYPE_DST_VOICEIN:
  90.                 lstrcpy(szComponent, "Voice Recognition");
  91.                 break;
  92.             default:
  93.                 lstrcpy(szComponent, "NOT VALID");
  94.                 break;
  95.         }
  96.     }
  97.     else
  98.     {
  99.         switch (pmxl->dwComponentType)
  100.         {
  101.             case MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED:
  102.                 lstrcpy(szComponent, "Undefined");
  103.                 break;
  104.             case MIXERLINE_COMPONENTTYPE_SRC_DIGITAL:
  105.                 lstrcpy(szComponent, "Digital");
  106.                 break;
  107.             case MIXERLINE_COMPONENTTYPE_SRC_LINE:
  108.                 lstrcpy(szComponent, "Line Level");
  109.                 break;
  110.             case MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE:
  111.                 lstrcpy(szComponent, "Microphone");
  112.                 break;
  113.             case MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER:
  114.                 lstrcpy(szComponent, "Synthesizer");
  115.                 break;
  116.             case MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC:
  117.                 lstrcpy(szComponent, "Compact Disc");
  118.                 break;
  119.             case MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE:
  120.                 lstrcpy(szComponent, "Telephone");
  121.                 break;
  122.             case MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER:
  123.                 lstrcpy(szComponent, "PC Speaker");
  124.                 break;
  125.             case MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT:
  126.                 lstrcpy(szComponent, "Wave Out");
  127.                 break;
  128.             case MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY:
  129.                 lstrcpy(szComponent, "Auxiliary");
  130.                 break;
  131.             case MIXERLINE_COMPONENTTYPE_SRC_ANALOG:
  132.                 lstrcpy(szComponent, "Analog");
  133.                 break;
  134.             default:
  135.                 lstrcpy(szComponent, "NOT VALID");
  136.                 break;
  137.         }
  138.     }
  139.     return (TRUE);
  140. } // MixAppGetComponentName()
  141. //--------------------------------------------------------------------------;
  142. //
  143. //  BOOL MixAppDlgProcLineInfo
  144. //
  145. //  Description:
  146. //      This dialog procedure is used to display driver capabilities.
  147. //
  148. //  Arguments:
  149. //      HWND hwnd: Handle to window.
  150. //
  151. //      UINT uMsg: Message being sent to the window.
  152. //
  153. //      WPARAM wParam: Specific argument to message.
  154. //
  155. //      LPARAM lParam: Specific argument to message.
  156. //
  157. //  Return (BOOL):
  158. //      The return value is specific to the message that was received. For
  159. //      the most part, it is FALSE if this dialog procedure does not handle
  160. //      a message.
  161. //
  162. //  History:
  163. //       1/ 2/93
  164. //
  165. //--------------------------------------------------------------------------;
  166. BOOL CALLBACK MixAppDlgProcLineInfo
  167. (
  168.     HWND                    hwnd,
  169.     UINT                    uMsg,
  170.     WPARAM                  wParam,
  171.     LPARAM                  lParam
  172. )
  173. {
  174.     HWND                hedit;
  175.     UINT                u;
  176.     MIXERLINE           mxl;
  177.     MMRESULT            mmr;
  178.     TCHAR               ach[64];
  179.     switch (uMsg)
  180.     {
  181.         case WM_INITDIALOG:
  182.             hedit = GetDlgItem(hwnd, IDD_LINEINFO_EDIT_INFO);
  183.             SetWindowFont(hedit, GetStockFont(SYSTEM_FIXED_FONT), FALSE);
  184.             //
  185.             //
  186.             //
  187.             //
  188.             mxl.cbStruct      = sizeof(mxl);
  189.             mxl.dwLineID      = lParam;
  190.             mmr = mixerGetLineInfo((HMIXEROBJ)ghmx, &mxl, MIXER_GETLINEINFOF_LINEID);
  191.             if (MMSYSERR_NOERROR != mmr)
  192.             {
  193.                 AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  194.                           "mixerGetLineInfo(lineid=%.08lXh) failed on hmx=%.04Xh, mmr=%u!",
  195.                           lParam, ghmx, mmr);
  196.             }
  197.             else
  198.             {
  199.                 static TCHAR    szDisplayTitle[]  = TEXT("[Line Info]rn");
  200.                 //
  201.                 //
  202.                 //
  203.                 MEditPrintF(hedit, NULL);
  204.                 MEditPrintF(hedit, szDisplayTitle);
  205.                 MEditPrintF(hedit, "%25s: %.04Xh", (LPTSTR)"Mixer Handle", ghmx);
  206.                 //
  207.                 //
  208.                 //
  209.                 MEditPrintF(hedit, "%25s: %lu bytes (requested %lu)", (LPTSTR)"Size of Line Info", mxl.cbStruct, (DWORD)sizeof(mxl));
  210.                 MEditPrintF(hedit, "%25s: %lu", (LPTSTR)"Destination", mxl.dwDestination);
  211.                 MEditPrintF(hedit, "%25s: %lu", (LPTSTR)"Source", mxl.dwSource);
  212.                 MEditPrintF(hedit, "%25s: %.08lXh", (LPTSTR)"Line ID", mxl.dwLineID);
  213.                 MEditPrintF(hedit, "~%25s: %.08lXh", (LPTSTR)"Line Flags", mxl.fdwLine);
  214.                 if (MIXERLINE_LINEF_SOURCE & mxl.fdwLine)
  215.                     MEditPrintF(hedit, "~, source");
  216.                 else
  217.                     MEditPrintF(hedit, "~, destination");
  218.                 if (MIXERLINE_LINEF_DISCONNECTED & mxl.fdwLine)
  219.                     MEditPrintF(hedit, "~, disconnected");
  220.                 if (MIXERLINE_LINEF_ACTIVE & mxl.fdwLine)
  221.                     MEditPrintF(hedit, "~, active");
  222.                 if (~(MIXERLINE_LINEF_SOURCE | MIXERLINE_LINEF_DISCONNECTED | MIXERLINE_LINEF_ACTIVE) & mxl.fdwLine)
  223.                     MEditPrintF(hedit, "~, *INVALID FLAGS*");
  224.                 MEditPrintF(hedit, "");
  225.                 MEditPrintF(hedit, "%25s: %.08lXh", (LPTSTR)"Driver User DWord", mxl.dwUser);
  226.                 MixAppGetComponentName(&mxl, ach);
  227.                 MEditPrintF(hedit, "%25s: %lu, (%s)", (LPTSTR)"Component Type", mxl.dwComponentType, (LPTSTR)ach);
  228.                 MEditPrintF(hedit, "%25s: %lu", (LPTSTR)"Num Channels", mxl.cChannels);
  229.                 MEditPrintF(hedit, "%25s: %lu", (LPTSTR)"Num Connections", mxl.cConnections);
  230.                 MEditPrintF(hedit, "%25s: %lu", (LPTSTR)"Num Controls", mxl.cControls);
  231.                 MEditPrintF(hedit, "%25s: '%s'", (LPTSTR)"Short Name", (LPTSTR)mxl.szShortName);
  232.                 MEditPrintF(hedit, "%25s: '%s'", (LPTSTR)"Name", (LPTSTR)mxl.szName);
  233.                 MEditPrintF(hedit, "rn%25s: %lu", (LPTSTR)"Target Type", mxl.Target.dwType);
  234.                 MEditPrintF(hedit, "%25s: %lu", (LPTSTR)"Device ID", mxl.Target.dwDeviceID);
  235.                 MEditPrintF(hedit, "%25s: %u", (LPTSTR)"Manufacturer ID", mxl.Target.wMid);
  236.                 MEditPrintF(hedit, "%25s: %u", (LPTSTR)"Product ID", mxl.Target.wPid);
  237.                 MEditPrintF(hedit, "%25s: %u.%.02u", (LPTSTR)"Version",
  238.                             mxl.Target.vDriverVersion >> 8,
  239.                             mxl.Target.vDriverVersion & 0x00FF);
  240.                 MEditPrintF(hedit, "%25s: '%s'", (LPTSTR)"Product Name", (LPTSTR)mxl.Target.szPname);
  241.             }
  242.             //
  243.             //  return nonzero to set the input focus to the control
  244.             //  identified by the (hwndFocus = (HWND)wParam) argument.
  245.             //  a zero return tells the dialog manager that this function
  246.             //  has set the focus using SetFocus.
  247.             //
  248.             return (TRUE);
  249.         case WM_COMMAND:
  250.             u = GET_WM_COMMAND_ID(wParam, lParam);
  251.             if ((IDOK == u) || (IDCANCEL == u))
  252.             {
  253.                 EndDialog(hwnd, (IDOK == u));
  254.             }
  255.             break;
  256.     }
  257.     return (FALSE);
  258. } // MixAppDlgProcLineInfo()
  259. //--------------------------------------------------------------------------;
  260. //
  261. //  BOOL MixAppRefreshLineList
  262. //
  263. //  Description:
  264. //
  265. //
  266. //  Arguments:
  267. //      HWND hwnd: Handle of main window.
  268. //
  269. //  Return (BOOL):
  270. //
  271. //  History:
  272. //      05/16/93
  273. //
  274. //--------------------------------------------------------------------------;
  275. BOOL FNGLOBAL MixAppRefreshLineList
  276. (
  277.     HWND                    hwnd,
  278.     PTABBEDLISTBOX          ptlb
  279. )
  280. {
  281.     static TCHAR        szLineTypeDst[] = TEXT("DST");
  282.     static TCHAR        szLineTypeSrc[] = TEXT("  src");
  283.     MMRESULT            mmr;
  284.     UINT                u;
  285.     UINT                v;
  286.     UINT                cConnections;
  287.     MIXERLINE           mxl;
  288.     TCHAR               ach[128];
  289.     TCHAR               szComponent[64];
  290.     int                 nIndex;
  291.     MIXERCAPS           mxcaps;
  292.     //
  293.     //
  294.     //
  295.     SetWindowRedraw(ptlb->hlb, FALSE);
  296.     ListBox_ResetContent(ptlb->hlb);
  297.     if (0 != (APP_OPTF_DEBUGLOG & gfuAppOptions))
  298.         MixAppDebugLog(NULL);
  299.     //
  300.     //
  301.     //
  302.     //
  303.     mmr = mixerGetDevCaps((UINT)ghmx, &mxcaps, sizeof(mxcaps));
  304.     if (MMSYSERR_NOERROR != mmr)
  305.     {
  306.         AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  307.                     "mixerGetDevCaps() failed on hmx=%.04Xh, mmr=%u!",
  308.                     ghmx, mmr);
  309.         mxcaps.cDestinations = 0;
  310.     }
  311.     for (u = 0; u < mxcaps.cDestinations; u++)
  312.     {
  313.         mxl.cbStruct      = sizeof(mxl);
  314.         mxl.dwDestination = u;
  315.         mmr = mixerGetLineInfo((HMIXEROBJ)ghmx, &mxl, MIXER_GETLINEINFOF_DESTINATION);
  316.         if (MMSYSERR_NOERROR != mmr)
  317.         {
  318.             AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  319.                       "mixerGetLineInfo(dst=%u) failed on hmx=%.04Xh, mmr=%u!",
  320.                       u, ghmx, mmr);
  321.             continue;
  322.         }
  323.         MixAppGetComponentName(&mxl, szComponent);
  324.         //
  325.         //
  326.         //
  327.         wsprintf(ach, gszLineFormatList,
  328.                  (LPSTR)szLineTypeDst,
  329.                  (MIXERLINE_LINEF_ACTIVE & mxl.fdwLine) ? '*' : ' ',
  330.                  (LPTSTR)szComponent,
  331.                  mxl.dwLineID,
  332.                  mxl.fdwLine,
  333.                  mxl.cControls,
  334.                  mxl.cConnections,
  335.                  (LPSTR)mxl.szName);
  336.         if (0 != (APP_OPTF_DEBUGLOG & gfuAppOptions))
  337.         {
  338.             MixAppDebugLog(ach);
  339.             MixAppDebugLog(gszCRLF);
  340.         }
  341.         nIndex = ListBox_AddString(ptlb->hlb, ach);
  342.         ListBox_SetItemData(ptlb->hlb, nIndex, mxl.dwLineID);
  343.         cConnections = (UINT)mxl.cConnections;
  344.         for (v = 0; v < cConnections; v++)
  345.         {
  346.             mxl.cbStruct      = sizeof(mxl);
  347.             mxl.dwDestination = u;
  348.             mxl.dwSource      = v;
  349.             mmr = mixerGetLineInfo((HMIXEROBJ)ghmx, &mxl, MIXER_GETLINEINFOF_SOURCE);
  350.             if (MMSYSERR_NOERROR != mmr)
  351.             {
  352.                 AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  353.                           "mixerGetLineInfo(src=%u) failed on hmx=%.04Xh, mmr=%u!",
  354.                           v, ghmx, mmr);
  355.                 continue;
  356.             }
  357.             MixAppGetComponentName(&mxl, szComponent);
  358.             //
  359.             //
  360.             //
  361.             wsprintf(ach, gszLineFormatList,
  362.                      (LPSTR)szLineTypeSrc,
  363.                      (MIXERLINE_LINEF_ACTIVE & mxl.fdwLine) ? '*' : ' ',
  364.                      (LPTSTR)szComponent,
  365.                      mxl.dwLineID,
  366.                      mxl.fdwLine,
  367.                      mxl.cControls,
  368.                      mxl.cConnections,
  369.                      (LPSTR)mxl.szName);
  370.             if (0 != (APP_OPTF_DEBUGLOG & gfuAppOptions))
  371.             {
  372.                 MixAppDebugLog(ach);
  373.                 MixAppDebugLog(gszCRLF);
  374.             }
  375.             nIndex = ListBox_AddString(ptlb->hlb, ach);
  376.             ListBox_SetItemData(ptlb->hlb, nIndex, mxl.dwLineID);
  377.         }
  378.     }
  379.     //
  380.     //
  381.     //
  382.     SetWindowRedraw(ptlb->hlb, TRUE);
  383.     return (TRUE);
  384. } // MixAppRefreshLineList()
  385. //==========================================================================;
  386. //
  387. //
  388. //
  389. //
  390. //==========================================================================;
  391. //--------------------------------------------------------------------------;
  392. //
  393. //  LRESULT MixAppLineChange
  394. //
  395. //  Description:
  396. //
  397. //
  398. //  Arguments:
  399. //      HWND hwnd:
  400. //
  401. //      HMIXER hmx:
  402. //
  403. //      DWORD dwLineID:
  404. //
  405. //  Return (LRESULT):
  406. //
  407. //  History:
  408. //      07/21/93
  409. //
  410. //--------------------------------------------------------------------------;
  411. LRESULT FNGLOBAL MixAppLineChange
  412. (
  413.     HWND                    hwnd,
  414.     HMIXER                  hmx,
  415.     DWORD                   dwLineID
  416. )
  417. {
  418.     DPF(1, "MixAppLineChange(hwnd=%Xh, hmx=%Xh, dwLineID=%.08lXh)",
  419.         hwnd, hmx, dwLineID);
  420.     //
  421.     //
  422.     //
  423.     if (gfDisplayingControl &&
  424.         (dwLineID == gmxl.dwLineID) &&
  425.         (NULL != ghdlgControl))
  426.     {
  427.         SendMessage(ghdlgControl, MM_MIXM_LINE_CHANGE, (WPARAM)hmx, dwLineID);
  428.     }
  429.     MixAppRefreshLineList(hwnd, gptlbLines);
  430.     //
  431.     //  return zero because we handled the message
  432.     //
  433.     return (0L);
  434. } // MixAppLineChange()