/**************************************************************************** * * sbtest.c * * Copyright (c) 1991 Microsoft Corporation. All Rights Reserved. * ***************************************************************************/ #include #include #include "wincom.h" #include "sbtest.h" #include /**************************************************************************** * * public data * ***************************************************************************/ HANDLE ghInst; // global instance handle char szAppName[10]; // app name HWND hPrintfWnd; // printf child window HWND hwndVolumeDlg; int fDebug; BYTE bChannel = 0; UINT wLoops = IDM_LOOPOFF; HMIDIOUT hMidiOut = NULL; char ach[256]; OPENFILENAME ofn; char szFname[MAXFILENAME]; BOOL AuxNotSupported; BOOL SetAux; /**************************************************************************** * * local data * ***************************************************************************/ static HMIDIIN hMidiIn = NULL; static int iProfiler; int FAR PASCAL VolumeDlgProc(HWND, unsigned, UINT, LONG); /**************************************************************************** * * internal function prototypes * ***************************************************************************/ static void GetInfo(void); static void CommandMsg(HWND hWnd, UINT wParam, LONG lParam); /*************************************************************************** get and show device info ***************************************************************************/ static void GetInfo(void) { WAVEOUTCAPS wc; WAVEINCAPS wic; MIDIOUTCAPS mc; MIDIINCAPS mic; AUXCAPS ac; UINT wDevs, wDevice; char acherr[80]; UINT wErr; wDevs = waveInGetNumDevs(); if (wDevs > 32) wDevs = 0; sprintf(ach, "\n%u Wave Input Devices\n", wDevs); dbgOut; for (wDevice = 0; wDevice < wDevs; wDevice++) { sprintf(ach, "Wave input device %u: ", wDevice); dbgOut; wErr = waveInGetDevCaps(wDevice, &wic, sizeof(wic)); if (!wErr) { sprintf(ach, "Mid:%u, Pid:%u, %s", wic.wMid, wic.wPid, (LPSTR) wic.szPname); dbgOut; sprintf(ach, "\nFormats:%8.8lXH", wic.dwFormats); dbgOut; sprintf(ach, ", channels:%4.4XH\n", wic.wChannels); dbgOut; } else { sprintf(ach, " Error Getting Wave Input Capabilities\n"); dbgOut; waveInGetErrorText(wErr, acherr, sizeof(acherr)); sprintf(ach, " Error: %s\n", (LPSTR) acherr); dbgOut; } } wDevs = waveOutGetNumDevs(); if (wDevs > 32) wDevs = 0; sprintf(ach, "\n%u Wave Output Devices\n", wDevs); for (wDevice = 0; wDevice < wDevs; wDevice++) { sprintf(ach, "Wave output device %u: ", wDevice); wErr = waveOutGetDevCaps(wDevice, &wc, sizeof(wc)); if (!wErr) { sprintf(ach, "Mid:%u, Pid:%u, %s", wc.wMid, wc.wPid, (LPSTR) wc.szPname); dbgOut; sprintf(ach, "\nFormats:%8.8lXH\n", wc.dwFormats); dbgOut; } else { sprintf(ach, " Error Getting Wave Output Capabilities\n"); dbgOut; waveOutGetErrorText(wErr, acherr, sizeof(acherr)); sprintf(ach, " Error: %s\n", (LPSTR) acherr); dbgOut; } } wDevs = midiInGetNumDevs(); if (wDevs > 32) wDevs = 0; sprintf(ach, "\n%u MIDI Input Devices\n", wDevs); for (wDevice = 0; wDevice < wDevs; wDevice++) { sprintf(ach, "MIDI input device %u: ", wDevice); wErr = midiInGetDevCaps(wDevice, &mic, sizeof(mic)); if (!wErr) { sprintf(ach, "Mid:%u, Pid:%u, %s\n", mic.wMid, mic.wPid, (LPSTR) mic.szPname); dbgOut; } else { sprintf(ach, " Error Getting MIDI Input Capabilities\n"); dbgOut; midiInGetErrorText(wErr, acherr, sizeof(acherr)); sprintf(ach, " Error: %s\n", (LPSTR) acherr); dbgOut; } } wDevs = midiOutGetNumDevs(); if (wDevs > 32) wDevs = 0; sprintf(ach, "\n%u MIDI Output Devices\n", wDevs); dbgOut; for (wDevice = 0; wDevice < wDevs; wDevice++) { sprintf(ach, "MIDI output device %u: ", wDevice); wErr = midiOutGetDevCaps(wDevice, &mc, sizeof(mc)); if (!wErr) { sprintf(ach, "Mid:%u, Pid:%u, %s", mc.wMid, mc.wPid, (LPSTR) mc.szPname); dbgOut; sprintf(ach, "\nTechnology:%4.4XH", mc.wTechnology); dbgOut; sprintf(ach, ", voices:%4.4XH", mc.wVoices); dbgOut; sprintf(ach, ", notes:%4.4XH\n", mc.wNotes); dbgOut; } else { sprintf(ach, " Error Getting MIDI Output Capabilities\n"); dbgOut; midiOutGetErrorText(wErr, acherr, sizeof(acherr)); sprintf(ach, " Error: %s\n", (LPSTR) acherr); dbgOut; } } sprintf(ach, "MIDI output device %u: ", MIDIMAPPER); wErr = midiOutGetDevCaps(MIDIMAPPER, &mc, sizeof(mc)); if (!wErr) { sprintf(ach, "Mid:%u, Pid:%u, %s", mc.wMid, mc.wPid, (LPSTR) mc.szPname); dbgOut; sprintf(ach, "\nTechnology:%4.4XH", mc.wTechnology); dbgOut; sprintf(ach, ", voices:%4.4XH", mc.wVoices); dbgOut; sprintf(ach, ", notes:%4.4XH\n", mc.wNotes); dbgOut; } else { sprintf(ach, " Error Getting MIDI Output Capabilities\n"); dbgOut; midiOutGetErrorText(wErr, acherr, sizeof(acherr)); sprintf(ach, " Error: %s\n", (LPSTR) acherr); dbgOut; } wDevs = auxGetNumDevs(); if (wDevs > 32) wDevs = 0; sprintf(ach, "\n%u Auxiliary Output Devices\n", wDevs); dbgOut; for (wDevice = 0; wDevice < wDevs; wDevice++) { sprintf(ach, "Auxiliary output device %u: ", wDevice); dbgOut; wErr = auxGetDevCaps(wDevice, &ac, sizeof(ac)); if (!wErr) { sprintf(ach, "Mid:%u, Pid:%u, %s", ac.wMid, ac.wPid, (LPSTR) ac.szPname); dbgOut; sprintf(ach, "\nTechnology:%4.4XH", ac.wTechnology); dbgOut; sprintf(ach, ", Support:%4.4XH", ac.dwSupport); dbgOut; } else { sprintf(ach, " Error Getting Auxiliary Output Capabilities\n"); dbgOut; } } } /***************** Main entry point routine *************************/ int __cdecl main(int argc, char **argv) { MSG msg; /* fill in non-variant fields of OPENFILENAME struct. */ ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hMainWnd; ofn.lpstrFilter = NULL; ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; ofn.nFilterIndex = 1; ofn.lpstrFile = szFname; ofn.nMaxFile = MAXFILENAME; ofn.lpstrInitialDir = NULL; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrTitle = NULL; ofn.lpstrDefExt = "WAV"; ofn.Flags = 0; ghInst = GetModuleHandle(NULL); // save our instance handle // medClientInit(); LoadString(ghInst, IDS_APPNAME, szAppName, sizeof(szAppName)); if (! InitFirstInstance(ghInst)) { return 1; } if (!InitEveryInstance(ghInst, SW_SHOWDEFAULT)) return 1; // check for messages from Windows and process them // if no messages, perform some idle function do { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { // got a message to process if (msg.message == WM_QUIT) break; if (!TranslateAccelerator(hMainWnd, hAccTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } else { if (hPosWnd) ShowPos(); else WaitMessage(); } } while (1); // medClientExit(); return (msg.wParam); } /************* main window message handler ******************************/ long FAR PASCAL MainWndProc(HWND hWnd, unsigned message, UINT wParam, LONG lParam) { PAINTSTRUCT ps; // paint structure WAVEOUTCAPS wc; AUXCAPS ac; // process any messages we want switch (message) { case WM_CREATE: InitMenus(hWnd); hPrintfWnd = wpfCreateWindow(hWnd, ghInst, "", WS_CHILD | WS_VISIBLE | WS_VSCROLL, 0, 0, 0, 0, 100, 0); sprintf(ach, "Wave and MIDI device driver test app.\n"); dbgOut; waveOutGetDevCaps( 0, &wc, sizeof(wc) ); EnableMenuItem( GetMenu( hWnd ), IDM_VOLUME, wc.dwSupport & WAVECAPS_VOLUME ? MF_ENABLED : MF_GRAYED ); if ( !(wc.dwSupport & WAVECAPS_VOLUME) ) { hwndVolumeDlg = (HWND)1; } memset(&ac, 0, sizeof(ac)); auxGetDevCaps( 0, &ac, sizeof(ac) ); EnableMenuItem( GetMenu( hWnd ), IDM_AUX_VOLUME, ac.dwSupport & AUXCAPS_VOLUME ? MF_ENABLED : MF_GRAYED ); if ( !(wc.dwSupport & WAVECAPS_VOLUME) ) { AuxNotSupported = 1; } #if 0 { HMENU hMenu; iProfiler = ProfInsChk(); switch (iProfiler) { case 1: sprintf(ach, "Profiler installed for real/286p modes\n"); dbgOut; break; case 2: sprintf(ach, "Profiler installed for real/286p/386p modes\n"); dbgOut; break; default: sprintf(ach, "Profiler not installed\n"); dbgOut; iProfiler = 0; hMenu = GetMenu(hWnd); EnableMenuItem(hMenu, IDM_PROFSTART, MF_GRAYED); break; } } #endif break; case WM_SIZE: MoveWindow(hPrintfWnd, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); break; case WM_COMMAND: // process menu messages CommandMsg(hWnd, wParam, lParam); break; case WM_PAINT: BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); break; case WM_DESTROY: if (hMidiOut) midiOutClose(hMidiOut); if (hMidiIn) midiInClose(hMidiIn); if (hWaveOut) { waveOutReset(hWaveOut); waveOutClose(hWaveOut); } if (hWaveIn) { waveInReset(hWaveIn); waveInClose(hWaveIn); } PostQuitMessage(0); break; case MM_WIM_CLOSE: sprintf(ach, " MM_WIM_CLOSE: %04X %08lX\n",wParam,lParam); dbgOut; break; case MM_WIM_DATA: sprintf(ach, " MM_WIM_DATA: %04X %08lX\n",wParam,lParam); dbgOut; // // Get more data if possible // dwRecorded += ((LPWAVEHDR)lParam)->dwBytesRecorded; if (hWaveIn && (dwDataSize - (lpRecordBuf - (LPSTR)((LPWAVEHDR)lParam)->lpData)) >= dwBlockSize) { UINT wRet; char acherr[80]; ((LPWAVEHDR)lParam)->lpData += dwBlockSize; wRet = waveInAddBuffer(hWaveIn, (LPWAVEHDR)lParam, sizeof(WAVEHDR)); if (wRet) { waveInGetErrorText(wRet, acherr, sizeof(acherr)); sprintf(ach, "\nwaveInAddBuffer: %s", (LPSTR) acherr); dbgOut; } } break; case MM_WIM_OPEN: sprintf(ach, " MM_WIM_OPEN: %04X %08lX\n",wParam,lParam); dbgOut; break; case MM_WOM_OPEN: sprintf(ach, " MM_WOM_OPEN: %04X %08lX\n",wParam,lParam); dbgOut; break; case MM_WOM_CLOSE: sprintf(ach, " MM_WOM_CLOSE: %04X %08lX\n",wParam,lParam); dbgOut; if (hWaveOut != (HWAVEOUT)wParam) { sprintf(ach, " MM_WOM_CLOSE: ACK! wParam doesn't match hWaveOut!!!!\n"); return 0L; } iWaveOut = 0; hWaveOut = NULL; break; case MM_WOM_DONE: sprintf(ach, " MM_WOM_DONE: %04X %08lX\n",wParam,lParam); dbgOut; if (hWaveOut != (HWAVEOUT)wParam) { sprintf(ach, " MM_WOM_DONE: ACK! wParam doesn't match hWaveOut!!!!\n"); return 0L; } // // the wave block is done playing, we need to let the driver unprepare // it and free the memory it used. // // wParam = hWaveOut // lParam = lpWaveHdr // waveOutUnprepareHeader((HWAVEOUT)wParam, (LPWAVEHDR)lParam, sizeof(WAVEHDR)); // GlobalUnlock(lParam); // LocalFree(lParam); GlobalFree( (HANDLE)lParam ); // // if we have no more outstanding blocks free the wave device. // if (--iWaveOut == 0) { sprintf(ach, " MM_WOM_DONE: Releasing the wave device\n"); waveOutClose(hWaveOut); } break; case MM_MIM_OPEN: sprintf(ach, " MM_MIM_OPEN: %04X %08lX\n",wParam,lParam); dbgOut; break; case MM_MIM_CLOSE: sprintf(ach, " MM_MIM_CLOSE: %04X %08lX\n",wParam,lParam); dbgOut; break; case MM_MIM_DATA: sprintf(ach, " MM_MIM_DATA: %04X %08lX\n",wParam,lParam); dbgOut; break; case MM_MIM_LONGDATA: sprintf(ach, " MM_MIM_LONGDATA: %04X %08lX\n",wParam,lParam); dbgOut; break; case MM_MIM_ERROR: sprintf(ach, " MM_MIM_ERROR: %04X %08lX\n",wParam,lParam); dbgOut; break; case MM_MIM_LONGERROR: sprintf(ach, " MM_MIM_LONGERROR: %04X %08lX\n",wParam,lParam); dbgOut; break; case MM_MOM_OPEN: sprintf(ach, " MM_MOM_OPEN: %04X %08lX\n",wParam,lParam); dbgOut; break; case MM_MOM_CLOSE: sprintf(ach, " MM_MOM_CLOSE: %04X %08lX\n",wParam,lParam); dbgOut; break; case MM_MOM_DONE: sprintf(ach, " MM_MOM_DONE: %04X %08lX\n",wParam,lParam); dbgOut; break; case WM_INITMENU: EnableMenuItem((HWND)wParam, IDM_LOOPBREAK , hWaveOut ? MF_ENABLED : MF_GRAYED); EnableMenuItem((HWND)wParam, IDM_RESET , hWaveOut ? MF_ENABLED : MF_GRAYED); EnableMenuItem((HWND)wParam, IDM_PAUSE , hWaveOut ? MF_ENABLED : MF_GRAYED); EnableMenuItem((HWND)wParam, IDM_RESUME , hWaveOut ? MF_ENABLED : MF_GRAYED); EnableMenuItem((HWND)wParam, IDM_VOLUME, hwndVolumeDlg ? MF_GRAYED : MF_ENABLED); EnableMenuItem((HWND)wParam, IDM_AUX_VOLUME, AuxNotSupported ? MF_GRAYED : MF_ENABLED); break; } return DefWindowProc(hWnd, message, wParam, lParam); } static void CommandMsg(HWND hWnd, UINT wParam, LONG lParam) { int i; HMENU hMenu; BYTE acherr[80]; UINT wErr; UINT wPortNum; SHORTMSG sm; switch (wParam) { case IDM_SNDPLAYSOUND: case IDM_PLAYWAVE: // GetProfileString(szAppName, "wavpath", "", szPath, sizeof(szPath)); // if (lstrlen(szPath)) { // DosChangeDir(szPath); // } // i = OpenFileDialog(hMainWnd, // "Open file", // "*.WAV", // DLGOPEN_MUSTEXIST | DLGOPEN_OPEN, // szFname, // sizeof(szFname)); // if (i == DLG_MISSINGFILE) { // sbtestError"Illegal filename"); // } // else if (i == DLG_CANCEL) { // // user pressed cancel // } // else { // } if (GetOpenFileName(&ofn)) { // valid file name if (wParam == IDM_SNDPLAYSOUND) { if (wLoops == IDM_LOOPOFF) sndPlaySound(ofn.lpstrFile, SND_ASYNC); else sndPlaySound(ofn.lpstrFile, SND_ASYNC|SND_LOOP); } else { PlayFile(ofn.lpstrFile); } } break; case IDM_LOOPOFF: case IDM_LOOP2: case IDM_LOOP100: wLoops = wParam; hMenu = GetMenu(hWnd); CheckMenuItem(hMenu, IDM_LOOPOFF, MF_UNCHECKED); CheckMenuItem(hMenu, IDM_LOOP2, MF_UNCHECKED); CheckMenuItem(hMenu, IDM_LOOP100, MF_UNCHECKED); CheckMenuItem(hMenu, wParam, MF_CHECKED); if (wParam != IDM_LOOP100) { if (hWaveOut) { waveOutBreakLoop(hWaveOut); } } break; case IDM_LOOPBREAK: if (hWaveOut) { waveOutBreakLoop(hWaveOut); } break; case IDM_POSITION: if (hPosWnd == NULL) { CreatePosition(hWnd); } else { DestroyWindow(hPosWnd); hPosWnd = NULL; } break; case IDM_RESET: if (hWaveOut) waveOutReset(hWaveOut); break; case IDM_PAUSE: if (hWaveOut) waveOutPause(hWaveOut); break; case IDM_RESUME: if (hWaveOut) waveOutRestart(hWaveOut); break; case IDM_RECORD: Record(hWnd); break; case IDM_AUX_VOLUME: SetAux = TRUE; hwndVolumeDlg = CreateDialog(ghInst, "Volume", hWnd, (DLGPROC)VolumeDlgProc); SetWindowPos( hwndVolumeDlg, (HWND)-1, 0,0,0,0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_SHOWWINDOW ); break; case IDM_VOLUME: SetAux = FALSE; hwndVolumeDlg = CreateDialog(ghInst, "Volume", hWnd, (DLGPROC)VolumeDlgProc); SetWindowPos( hwndVolumeDlg, (HWND)-1, 0,0,0,0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_SHOWWINDOW ); break; case IDM_I0: case IDM_I1: case IDM_I2: case IDM_I3: case IDM_I4: case IDM_I5: case IDM_I6: case IDM_I7: case IDM_I8: case IDM_I9: case IDM_I10: case IDM_I11: case IDM_I12: case IDM_I13: case IDM_I14: case IDM_I15: hMenu = GetMenu(hWnd); for (i = IDM_I0; i <= IDM_I15; i++) { CheckMenuItem(hMenu, i, MF_UNCHECKED); } CheckMenuItem(hMenu, wParam, MF_CHECKED); EnableMenuItem(hMenu, IDM_STARTMIDIIN, MF_GRAYED); EnableMenuItem(hMenu, IDM_STOPMIDIIN, MF_GRAYED); if (hMidiIn) { midiInClose(hMidiIn); hMidiIn = NULL; } wPortNum = wParam - IDM_I0; if (wPortNum != 0) { // NOTE!!! we must PAGE-LOCK our CODE and DATA segment!!!! // The FIXED segment attribute is ignored for applications // // Callbacks *must* be in FIXED code segments of DLLs *not* APPS // // *********** THIS APP IS TOTALY WRONG! ************* // ******************* DONT COPY THIS CODE! ********************** // #define GetDS() HIWORD((DWORD)((LPSTR)&hMidiIn)) // GlobalPageLock(GetDS()); wErr = midiInOpen(&hMidiIn, wPortNum - 1, (DWORD)SBMidiInCallback, (DWORD)hMidiOut, CALLBACK_FUNCTION); if (wErr) { sprintf(ach, " Error opening MIDI Input\n"); dbgOut; midiInGetErrorText(wErr, acherr, sizeof(acherr)); sprintf(ach, " Error: %s\n", (LPSTR) acherr); dbgOut; hMidiIn = NULL; CheckMenuItem(hMenu, wParam, MF_UNCHECKED); CheckMenuItem(hMenu, IDM_I0, MF_CHECKED); } else EnableMenuItem(hMenu, IDM_STARTMIDIIN, MF_ENABLED); } break; case IDM_STARTMIDIIN: if (hMidiIn) { hMenu = GetMenu(hWnd); EnableMenuItem(hMenu, IDM_STARTMIDIIN, MF_GRAYED); EnableMenuItem(hMenu, IDM_STOPMIDIIN, MF_ENABLED); midiInStart(hMidiIn); } break; case IDM_STOPMIDIIN: if (hMidiIn) { hMenu = GetMenu(hWnd); EnableMenuItem(hMenu, IDM_STOPMIDIIN, MF_GRAYED); EnableMenuItem(hMenu, IDM_STARTMIDIIN, MF_ENABLED); midiInStop(hMidiIn); } break; case IDM_D0: case IDM_D1: case IDM_D2: case IDM_D3: case IDM_D4: case IDM_D5: case IDM_D6: case IDM_D7: case IDM_D8: case IDM_D9: case IDM_D10: case IDM_D11: case IDM_D12: case IDM_D13: case IDM_D14: case IDM_D15: hMenu = GetMenu(hWnd); for (i = IDM_D0; i <= IDM_D15; i++) { CheckMenuItem(hMenu, i, MF_UNCHECKED); } CheckMenuItem(hMenu, wParam, MF_CHECKED); if (hMidiOut) { midiOutClose(hMidiOut); hMidiOut = NULL; } if (wParam == IDM_D0 + LASTPORT) wPortNum = MIDIMAPPER; // open mapper if chose last item else wPortNum = wParam - IDM_D0 - 1; if (wParam != IDM_D0) { wErr = midiOutOpen(&hMidiOut, wPortNum, (DWORD)hWnd, 0L, 0L); if (wErr) { sprintf(ach, " Error opening MIDI Output\n"); dbgOut; midiOutGetErrorText(wErr, acherr, sizeof(acherr)); sprintf(ach, " Error: %s\n", (LPSTR) acherr); dbgOut; hMidiOut = NULL; } else { // send patch change sm.b[0] = (BYTE) 0xC0 + bChannel; sm.b[1] = bInstrument; midiOutShortMsg(hMidiOut, sm.dw); } } break; case IDM_C0: case IDM_C1: case IDM_C2: case IDM_C3: case IDM_C4: case IDM_C5: case IDM_C6: case IDM_C7: case IDM_C8: case IDM_C9: case IDM_C10: case IDM_C11: case IDM_C12: case IDM_C13: case IDM_C14: case IDM_C15: hMenu = GetMenu(hWnd); for (i = IDM_C0; i <= IDM_C15; i++) { CheckMenuItem(hMenu, i, MF_UNCHECKED); } CheckMenuItem(hMenu, wParam, MF_CHECKED); bChannel = (BYTE)(wParam - IDM_C0); break; case IDM_KEYBOARD: if (hKeyWnd == NULL) { CreateKeyboard(hWnd); } else { DestroyWindow(hKeyWnd); hKeyWnd = NULL; } break; case IDM_INSTRUMENT: if (hInstWnd == NULL) { CreateInstrument(hWnd); } else { DestroyWindow(hInstWnd); hInstWnd = NULL; } break; case IDM_DUMPPATCH: hMenu = GetMenu(hWnd); if (ISBITSET(fDebug, DEBUG_PATCH)) RESETBIT(fDebug, DEBUG_PATCH); else SETBIT(fDebug, DEBUG_PATCH); CheckMenuItem(hMenu, wParam, ISBITSET(fDebug, DEBUG_PATCH) ? MF_CHECKED : MF_UNCHECKED); break; case IDM_DUMPNOTES: hMenu = GetMenu(hWnd); if (ISBITSET(fDebug, DEBUG_NOTE)) RESETBIT(fDebug, DEBUG_NOTE); else SETBIT(fDebug, DEBUG_NOTE); CheckMenuItem(hMenu, wParam, ISBITSET(fDebug, DEBUG_NOTE) ? MF_CHECKED : MF_UNCHECKED); break; case IDM_RIP: // // send total stuff to mmsystem APIs // waveOutPrepareHeader((HWAVEOUT)1, NULL, sizeof(WAVEHDR)); waveOutClose(NULL); midiInPrepareHeader(0, (LPMIDIHDR)-1l, 4); midiOutClose((HMIDIOUT)(-1)); break; case IDM_GETINFO: GetInfo(); break; case IDM_WAVEOPTIONS: WaveOptions(hWnd); break; case IDM_MIDIOPTIONS: MidiOptions(hWnd); break; case IDM_ABOUT: About(hWnd); break; case IDM_EXIT: PostMessage(hWnd, WM_CLOSE, 0, 0l); break; #if 0 case IDM_PROFSTART: if (iProfiler) { GetProfileString(szAppName, "profpath", "", szPath, sizeof(szPath)); if (lstrlen(szPath)) { DosChangeDir(szPath); } ProfStart(); sprintf(ach, "\nProfiler started. Files in %s", (LPSTR) szPath); dbgOut; EnableMenuItem(hMenu, IDM_PROFSTART, MF_GRAYED); EnableMenuItem(hMenu, IDM_PROFSTOP, MF_ENABLED); } break; case IDM_PROFSTOP: if (iProfiler) { ProfStop(); ProfFlush(); sprintf(ach, "\nProfiler stopped"); dbgOut; EnableMenuItem(hMenu, IDM_PROFSTART, MF_ENABLED); EnableMenuItem(hMenu, IDM_PROFSTOP, MF_GRAYED); } break; #endif default: break; } } int FAR PASCAL VolumeDlgProc(HWND hwnd, unsigned msg, UINT wParam, LONG lParam ) { static HWND hwndScrollbar; static int iScrollPos; DWORD dwVolumeLevel; DWORD dwNewVolumeLevel; WORD wVolumeLeft; WORD wVolumeRight; WORD ret; switch (msg) { case WM_INITDIALOG: /* * What is the current volume setting ? */ (SetAux ? auxGetVolume : waveOutGetVolume)( 0, &dwVolumeLevel ); /* * Take the average of the left and right volume settings */ wVolumeLeft = LOWORD( dwVolumeLevel ); wVolumeRight = HIWORD( dwVolumeLevel ); iScrollPos = ( wVolumeLeft + wVolumeRight ) >> 9; /* * Set the scroll bar and level indicator */ hwndScrollbar = GetDlgItem( hwnd, 105 ); /* 105 is the scroll bar */ SetScrollRange( hwndScrollbar, SB_CTL, 0, 255, FALSE ); SetScrollPos( hwndScrollbar, SB_CTL, iScrollPos, TRUE ); SetDlgItemInt( hwnd, 104, iScrollPos << 8, FALSE ); break; case WM_HSCROLL: switch ( LOWORD( wParam ) ) { case SB_BOTTOM: iScrollPos = 0; break; case SB_TOP: iScrollPos = 255; break; case SB_LINEUP: iScrollPos--; break; case SB_LINEDOWN: iScrollPos++; break; case SB_PAGEDOWN: iScrollPos += 16; break; case SB_PAGEUP: iScrollPos -= 16; break; case SB_THUMBPOSITION: case SB_THUMBTRACK: iScrollPos = HIWORD( wParam ); break; } /* * Make sure that the new setting is within the correct volume * range */ if ( iScrollPos > 255 ) { iScrollPos = 255; } if ( iScrollPos < 0 ) { iScrollPos = 0; } /* * Update the scrollbar position and value indicator */ SetScrollPos( hwndScrollbar, SB_CTL, iScrollPos, TRUE ); SetDlgItemInt( hwnd, 104, iScrollPos << 8, FALSE ); /* * Set the volume on the device and make sure that the * volume has been set correctly. */ dwVolumeLevel = MAKELONG( iScrollPos << 8, iScrollPos << 8 ); if ( 0 != (ret = (SetAux ? auxSetVolume : waveOutSetVolume)( 0, dwVolumeLevel ) ) ) { sprintf( ach, "\n waveOutSetVolume %8X ret = %d ", dwVolumeLevel, ret ); dbgOut; } else { (SetAux ? auxGetVolume : waveOutGetVolume)( 0, &dwNewVolumeLevel ); if ( dwNewVolumeLevel != dwVolumeLevel) { sprintf( ach, "\n New volume not set correctly" ); dbgOut; } } break; case WM_COMMAND: DestroyWindow( hwnd ); hwndVolumeDlg = (HWND)NULL; break; default: return FALSE; break; } return TRUE; }