summaryrefslogtreecommitdiffstats
path: root/private/mvdm/wow16/mmsystem/mmsex.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/mvdm/wow16/mmsystem/mmsex.c')
-rw-r--r--private/mvdm/wow16/mmsystem/mmsex.c483
1 files changed, 483 insertions, 0 deletions
diff --git a/private/mvdm/wow16/mmsystem/mmsex.c b/private/mvdm/wow16/mmsystem/mmsex.c
new file mode 100644
index 000000000..22317e630
--- /dev/null
+++ b/private/mvdm/wow16/mmsystem/mmsex.c
@@ -0,0 +1,483 @@
+/*
+** MMSEX.C
+**
+** Example applet DLL to be displayed by the Multimedia Control Panel.
+**
+** History:
+**
+** Wed Apr 18 1990 -by- MichaelE
+**
+*/
+
+#ifndef DEBUG
+ #define DEBUG
+#endif
+
+#include <windows.h>
+#include "mmsystem.h"
+#include <cpl.h>
+#include "mmsysi.h"
+#include "mmsex.dlg"
+
+LRESULT FAR PASCAL _loadds _export CPlApplet ( HWND, UINT, LPARAM, LPARAM );
+BOOL FAR PASCAL _loadds DebugDlg ( HWND, UINT, WPARAM, LPARAM );
+
+static SZCODE szMenuName[] = "mmse&x";
+static SZCODE szInfoName[] = "change mmsystem debug settings 1.01";
+static SZCODE szHelpFile[] = "";
+
+#define MAX_TYPE 7
+static SZCODE szTypes[] =
+ "???????\0" // 0
+ "WaveOut\0" // 1 TYPE_WAVEOUT
+ "WaveIn \0" // 2 TYPE_WAVEIN
+ "MidiOut\0" // 3 TYPE_MIDIOUT
+ "MidiIn \0" // 4 TYPE_MIDIIN
+ "mmio \0" // 5 TYPE_MMIO
+ "IOProc \0"; // 6 TYPE_IOPROC
+
+int nLoadedCount = 0;
+HDRVR hdrv;
+int iNumHandles = 0;
+
+/* This function is exported so CPL.EXE can do a GetProcAddress() on
+** the label and send the messages described below.
+** To make MMCPL.EXE load your DLL, and thus add your applets to its
+** window, add a keyname under the [MMCPL] application in
+** WIN.INI:
+**
+** [MMCPL]
+** myapplets=c:\mydir\applet.dll
+**
+** CPL.EXE loads the WIN3 Control Panel applets first, followed by the
+** applets named in WIN.INI, then those from the directory it was loaded,
+** and finally those in the WIN3 SYSTEM directory.
+**
+*/
+LRESULT FAR PASCAL _loadds _export CPlApplet(
+HWND hCPlWnd,
+UINT Msg,
+LPARAM lParam1,
+LPARAM lParam2)
+{
+ LPNEWCPLINFO lpCPlInfo;
+ int i;
+
+ switch( Msg )
+ {
+ case CPL_INIT:
+ if (!hdrv)
+ hdrv = OpenDriver("mmsystem.dll", NULL, 0);
+
+ if (!hdrv)
+ return (LRESULT)FALSE;
+
+// #if 0
+ if (!SendDriverMessage(hdrv, MM_GET_DEBUG, 0, 0))
+ {
+ CloseDriver(hdrv,0,0);
+ hdrv = NULL;
+ return (LRESULT)FALSE;
+ }
+// #endif
+ nLoadedCount++;
+
+ // first message to CPlApplet(), sent once only
+ return (LRESULT)TRUE;
+
+ case CPL_GETCOUNT:
+ // second message to CPlApplet(), sent once only
+ return (LRESULT)1;
+
+ case CPL_NEWINQUIRE:
+ /* third message to CPlApplet(). It is sent as many times
+ as the number of applets returned by CPL_GETCOUNT message
+ */
+ lpCPlInfo = (LPNEWCPLINFO)lParam2;
+
+ // lParam1 is an index ranging from 0 to (NUM_APPLETS-1)
+ i = (int)lParam1;
+
+ lpCPlInfo->dwSize = sizeof(NEWCPLINFO);
+ lpCPlInfo->dwFlags = 0;
+ lpCPlInfo->dwHelpContext = 0; // help context to use
+ lpCPlInfo->lData = 0; // user defined data
+ lpCPlInfo->hIcon = LoadIcon(ghInst, MAKEINTATOM(DLG_MMSEX));
+ lstrcpy(lpCPlInfo->szName, szMenuName);
+ lstrcpy(lpCPlInfo->szInfo, szInfoName);
+ lstrcpy(lpCPlInfo->szHelpFile, szHelpFile);
+
+ return (LRESULT)TRUE;
+
+ case CPL_SELECT:
+ /* One of your applets has been selected.
+ lParam1 is an index from 0 to (NUM_APPLETS-1)
+ lParam2 is the lData value associated with the applet
+ */
+ break;
+
+ case CPL_DBLCLK:
+ /* One of your applets has been double-clicked.
+ lParam1 is an index from 0 to (NUM_APPLETS-1)
+ lParam2 is the lData value associated with the applet
+ */
+ DialogBox(ghInst,MAKEINTRESOURCE(DLG_MMSEX),hCPlWnd,DebugDlg);
+ break;
+
+ case CPL_STOP:
+ /* Sent once for each applet prior to the CPL_EXIT msg.
+ lParam1 is an index from 0 to (NUM_APPLETS-1)
+ lParam2 is the lData value associated with the applet
+ */
+ break;
+
+ case CPL_EXIT:
+ /* Last message, sent once only, before MMCPL.EXE calls
+ FreeLibrary() on your DLL.
+ */
+ nLoadedCount--;
+
+ if (hdrv && !nLoadedCount)
+ {
+ CloseDriver(hdrv,0,0);
+ hdrv = NULL;
+ }
+ break;
+
+ default:
+ break;
+ }
+ return( 0L );
+}
+
+int QueryRadioButton(HWND hdlg, int idFirst, int idLast)
+{
+ int id;
+
+ for (id=idFirst; id<=idLast; id++)
+ {
+ if (IsDlgButtonChecked(hdlg, id))
+ return id;
+ }
+
+ return 0;
+}
+
+#if 0 // API in win31
+
+BOOL NEAR PASCAL IsTask(HANDLE hTask)
+{
+_asm {
+; push si
+ mov ax,hTask
+ or ax,ax
+ jz error
+
+ lsl si,ax
+ jnz error
+
+ call GetCurrentTask
+ lsl ax,ax
+ cmp si,ax
+ je exit
+error:
+ xor ax,ax
+exit:
+; pop si
+}}
+
+#endif
+
+
+void NEAR PASCAL GetTaskName(HANDLE hTask, LPSTR pname)
+{
+ if (!IsTask(hTask))
+ {
+ lstrcpy(pname,"????");
+ }
+ else
+ {
+ ((LPDWORD)pname)[0] = ((LPDWORD)MAKELONG(0xF2,hTask))[0];
+ ((LPDWORD)pname)[1] = ((LPDWORD)MAKELONG(0xF2,hTask))[1];
+ pname[8] = 0;
+ }
+}
+
+#define SLASH(c) ((c) == '/' || (c) == '\\')
+
+LPSTR FileName(LPSTR szPath)
+{
+ LPSTR sz;
+
+ for (sz=szPath; *sz; sz++)
+ ;
+ for (; sz>=szPath && !SLASH(*sz) && *sz!=':'; sz--)
+ ;
+ return ++sz;
+}
+
+int fQuestion(LPSTR sz,...)
+{
+ char ach[128];
+
+ wvsprintf (ach,sz,(LPSTR)(&sz+1)); /* Format the string */
+ return MessageBox(NULL,ach,"mmsex",MB_YESNO|MB_ICONQUESTION|MB_TASKMODAL);
+}
+
+void GetHandles(HWND hdlg)
+{
+ HLOCAL h;
+ HTASK hTask;
+ DWORD wType;
+ UINT n;
+ int i;
+ UINT j;
+ int iSel;
+ char ach[80];
+ char szTask[80];
+ char szName[80];
+ HWND hlb;
+
+ iNumHandles=0;
+
+ hlb = GetDlgItem(hdlg, ID_HANDLES);
+
+ iSel = (int)SendMessage(hlb,LB_GETCURSEL,0,0L);
+ SendMessage(hlb, WM_SETREDRAW, (WPARAM)FALSE, 0);
+ SendMessage(hlb, LB_RESETCONTENT, 0, 0);
+
+ //
+ // fill listbox with all active handles in system
+ //
+ for (h = (HLOCAL)(LONG)SendDriverMessage(hdrv, MM_HINFO_NEXT, NULL, 0);
+ h;
+ h = (HLOCAL)(LONG)SendDriverMessage(hdrv, MM_HINFO_NEXT, (LPARAM)(LONG)(UINT)h, 0) )
+ {
+ iNumHandles++;
+
+ wType = (UINT)SendDriverMessage(hdrv, MM_HINFO_TYPE, (LPARAM)(LONG)(UINT)h, 0);
+ hTask = (HTASK)(LONG)SendDriverMessage(hdrv, MM_HINFO_TASK, (LPARAM)(LONG)(UINT)h, 0);
+
+ if (wType >= MAX_TYPE)
+ wType = 0;
+
+ GetTaskName(hTask, szTask);
+
+ wsprintf(ach, "%ls %04X %ls",(LPSTR)szTypes + wType*(sizeof(szTypes)-1)/MAX_TYPE,h,(LPSTR)szTask);
+
+ i = (int)(LONG)SendMessage(hlb, LB_ADDSTRING, 0, (LPARAM)(LPSTR)ach);
+ SendMessage(hlb, LB_SETITEMDATA, (WPARAM)i, MAKELPARAM(h, wType));
+ }
+
+ //
+ // add to that all MCI handles
+ //
+ n = (UINT)(LONG)SendDriverMessage(hdrv, MM_HINFO_MCI, 0, 0);
+
+ for (j = 1; j < n; j++)
+ {
+ MCI_DEVICE_NODE node;
+
+ if (!SendDriverMessage(hdrv, MM_HINFO_MCI, (LPARAM)j, (LPARAM)(LPVOID)&node))
+ continue;
+
+ iNumHandles++;
+
+ if (node.lpstrName == NULL)
+ node.lpstrName = "";
+ if (node.lpstrInstallName == NULL)
+ node.lpstrInstallName = "";
+
+ GetTaskName(node.hCreatorTask, szTask);
+ wsprintf(ach, "mci %04X %ls %ls %ls",j,(LPSTR)szTask,node.lpstrInstallName,node.lpstrName);
+
+ i = (int)(LONG)SendMessage(hlb, LB_ADDSTRING, 0, (LPARAM)(LPSTR)ach);
+ SendMessage(hlb, LB_SETITEMDATA, (WPARAM)i, MAKELPARAM(j, TYPE_MCI));
+ }
+
+ //
+ // add to that all DRV handles
+ //
+ for (h=GetNextDriver(NULL, 0); h; h=GetNextDriver(h, 0))
+ {
+ if (GetDriverModuleHandle(h))
+ {
+ DRIVERINFOSTRUCT di;
+
+ di.length = sizeof(di);
+ di.szAliasName[0] = 0;
+ GetDriverInfo(h, &di);
+
+ iNumHandles++;
+
+ GetModuleFileName(GetDriverModuleHandle(h), szName, sizeof(szName));
+
+ wsprintf(ach, "Driver %04X %ls (%ls)",h,(LPSTR)di.szAliasName,(LPSTR)FileName(szName));
+ i = (int)(LONG)SendDlgItemMessage(hdlg, ID_HANDLES, LB_ADDSTRING, 0, (LPARAM)(LPSTR)ach);
+ SendDlgItemMessage(hdlg, ID_HANDLES, LB_SETITEMDATA, (WPARAM)i, MAKELPARAM(h,TYPE_DRVR));
+ }
+ }
+
+ SendMessage(hlb,LB_SETCURSEL,(WPARAM)iSel,0L);
+ SendMessage(hlb,WM_SETREDRAW,(WPARAM)TRUE,0);
+ InvalidateRect(hlb, NULL, TRUE);
+}
+
+int CountHandles(void)
+{
+ HLOCAL h;
+ int cnt=0;
+ UINT n;
+ UINT j;
+
+ for (h = (HLOCAL)(LONG)SendDriverMessage(hdrv, MM_HINFO_NEXT, NULL, 0);
+ h;
+ h = (HLOCAL)(LONG)SendDriverMessage(hdrv, MM_HINFO_NEXT, (LPARAM)(LONG)(UINT)h, 0) )
+ {
+ cnt++;
+ }
+
+ n = (UINT)(LONG)SendDriverMessage(hdrv, MM_HINFO_MCI, 0, 0);
+
+ for (j=1; j<n; j++)
+ {
+ MCI_DEVICE_NODE node;
+
+ if (!SendDriverMessage(hdrv, MM_HINFO_MCI, (LPARAM)j, (LPARAM)(LPVOID)&node))
+ continue;
+
+ cnt++;
+ }
+
+ for (h=GetNextDriver(NULL,0); h; h=GetNextDriver(h, 0))
+ {
+ if (GetDriverModuleHandle(h))
+ cnt++;
+ }
+
+ return cnt;
+}
+
+void CloseHandle(DWORD dw)
+{
+ HLOCAL h;
+ h = (HLOCAL)LOWORD(dw);
+
+ switch(HIWORD(dw))
+ {
+ case TYPE_WAVEOUT:
+ if (IDYES == fQuestion("Close WaveOut handle %04X?",h))
+ {
+ waveOutReset(h);
+ waveOutClose(h);
+ }
+ break;
+ case TYPE_WAVEIN:
+ if (IDYES == fQuestion("Close WaveIn handle %04X?",h))
+ {
+ waveInStop(h);
+ waveInClose(h);
+ }
+ break;
+ case TYPE_MIDIOUT:
+ if (IDYES == fQuestion("Close MidiOut handle %04X?",h))
+ {
+ midiOutReset(h);
+ midiOutClose(h);
+ }
+ break;
+ case TYPE_MIDIIN:
+ if (IDYES == fQuestion("Close MidiIn handle %04X?",h))
+ {
+ midiInStop(h);
+ midiInClose(h);
+ }
+ break;
+ case TYPE_MCI:
+ if (IDYES == fQuestion("Close Mci device %04X?",h))
+ {
+ mciSendCommand((UINT)h, MCI_CLOSE, 0, 0);
+ }
+ break;
+ case TYPE_MMIO:
+ if (IDYES == fQuestion("Close MMIO handle %04X?",h))
+ {
+ mmioClose(h,MMIO_FHOPEN);
+ }
+ break;
+ case TYPE_DRVR:
+ break;
+ }
+}
+
+
+BOOL FAR PASCAL _loadds DebugDlg(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ DWORD dw;
+ int i;
+
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ SendDlgItemMessage(hdlg, ID_DEBUG_OUT, CB_ADDSTRING, 0, (LONG)(LPSTR)"(none)");
+ SendDlgItemMessage(hdlg, ID_DEBUG_OUT, CB_ADDSTRING, 0, (LONG)(LPSTR)"COM1:");
+ SendDlgItemMessage(hdlg, ID_DEBUG_OUT, CB_ADDSTRING, 0, (LONG)(LPSTR)"Mono Monitor");
+ SendDlgItemMessage(hdlg, ID_DEBUG_OUT, CB_ADDSTRING, 0, (LONG)(LPSTR)"Windows");
+
+ SendDlgItemMessage(hdlg, ID_DEBUG_OUT, CB_SETCURSEL, (int)(LONG)SendDriverMessage(hdrv, MM_GET_DEBUGOUT, 0, 0), 0L);
+
+ CheckDlgButton(hdlg, ID_DEBUG_MCI, (int)(LONG)SendDriverMessage(hdrv, MM_GET_MCI_DEBUG, 0, 0));
+ CheckDlgButton(hdlg, ID_DEBUG_MMSYS, (int)(LONG)SendDriverMessage(hdrv, MM_GET_MM_DEBUG, 0, 0));
+
+ iNumHandles = CountHandles();
+ GetHandles(hdlg);
+
+ SetTimer(hdlg, 500, 500, NULL);
+ return TRUE;
+
+ case WM_TIMER:
+ i = CountHandles();
+ if (iNumHandles != i)
+ {
+ iNumHandles = i;
+ GetHandles(hdlg);
+ }
+ break;
+
+ case WM_COMMAND:
+ switch ((UINT)wParam)
+ {
+ case IDOK:
+ SendDriverMessage(hdrv, MM_SET_DEBUGOUT,
+ (LPARAM)SendDlgItemMessage(hdlg, ID_DEBUG_OUT, CB_GETCURSEL, 0, 0), 0);
+
+ SendDriverMessage(hdrv, MM_SET_MCI_DEBUG,
+ (LPARAM)IsDlgButtonChecked(hdlg, ID_DEBUG_MCI),0);
+
+ SendDriverMessage(hdrv, MM_SET_MM_DEBUG,
+ (LPARAM)IsDlgButtonChecked(hdlg, ID_DEBUG_MMSYS),0);
+
+ // fall through
+ case IDCANCEL:
+ EndDialog(hdlg, wParam);
+ break;
+
+ case ID_RESTART:
+ SendDriverMessage(hdrv, MM_DRV_RESTART, 0, 0);
+ break;
+
+ case ID_HANDLES:
+ if (HIWORD(lParam) != LBN_DBLCLK)
+ break;
+
+ i = (int)(LONG)SendDlgItemMessage(hdlg,wParam,LB_GETCURSEL,0,0L);
+ dw = (DWORD)SendDlgItemMessage(hdlg,wParam,LB_GETITEMDATA,(WPARAM)i,0L);
+
+ CloseHandle(dw);
+ GetHandles(hdlg);
+ break;
+ }
+ break;
+ }
+ return FALSE;
+}