//==========================================================================; // // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR // PURPOSE. // // Copyright (c) 1992 - 1994 Microsoft Corporation. All Rights Reserved. // //--------------------------------------------------------------------------; // // aawavdev.c // // Description: // // // //==========================================================================; #include #include #include #include #include #include #include "appport.h" #include "acmapp.h" #include "debug.h" // // WAVE[IN|OUT]CAPS // // // PTSTR gaszWaveInOutCapsFormats[32] = { TEXT("8M11"), // Bit 0 WAVE_FORMAT_1M08 TEXT("8S11"), // Bit 1 WAVE_FORMAT_1S08 TEXT("16M11"), // Bit 2 WAVE_FORMAT_1M16 TEXT("16S11"), // Bit 3 WAVE_FORMAT_1S16 TEXT("8M22"), // Bit 4 WAVE_FORMAT_2M08 TEXT("8S22"), // Bit 5 WAVE_FORMAT_2S08 TEXT("16M22"), // Bit 6 WAVE_FORMAT_2M16 TEXT("16S22"), // Bit 7 WAVE_FORMAT_2S16 TEXT("8M44"), // Bit 8 WAVE_FORMAT_4M08 TEXT("8S44"), // Bit 9 WAVE_FORMAT_4S08 TEXT("16M44"), // Bit 10 WAVE_FORMAT_4M16 TEXT("16S44"), // Bit 11 WAVE_FORMAT_4S16 NULL, // Bit 12 NULL, // Bit 13 NULL, // Bit 14 NULL, // Bit 15 NULL, // Bit 16 NULL, // Bit 17 NULL, // Bit 18 NULL, // Bit 19 NULL, // Bit 20 NULL, // Bit 21 NULL, // Bit 22 NULL, // Bit 23 NULL, // Bit 24 NULL, // Bit 25 NULL, // Bit 26 NULL, // Bit 27 NULL, // Bit 28 NULL, // Bit 29 NULL, // Bit 30 NULL // Bit 31 }; PTSTR gaszWaveOutCapsSupport[32] = { TEXT("Pitch"), // Bit 0 WAVECAPS_PITCH TEXT("Playback Rate"), // Bit 1 WAVECAPS_PLAYBACKRATE TEXT("Volume"), // Bit 2 WAVECAPS_VOLUME TEXT("L/R Volume"), // Bit 3 WAVECAPS_LRVOLUME TEXT("Sync"), // Bit 4 WAVECAPS_SYNC NULL, // Bit 5 NULL, // Bit 6 NULL, // Bit 7 NULL, // Bit 8 NULL, // Bit 9 NULL, // Bit 10 NULL, // Bit 11 NULL, // Bit 12 NULL, // Bit 13 NULL, // Bit 14 NULL, // Bit 15 NULL, // Bit 16 NULL, // Bit 17 NULL, // Bit 18 NULL, // Bit 19 NULL, // Bit 20 NULL, // Bit 21 NULL, // Bit 22 NULL, // Bit 23 NULL, // Bit 24 NULL, // Bit 25 NULL, // Bit 26 NULL, // Bit 27 NULL, // Bit 28 NULL, // Bit 29 NULL, // Bit 30 NULL // Bit 31 }; //==========================================================================; // // // // //==========================================================================; //--------------------------------------------------------------------------; // // MMRESULT AcmAppWaveInGetDevCaps // // Description: // // // Arguments: // UINT uDevId: // // LPWAVEINCAPS pwic: // // Return (MMRESULT): // // //--------------------------------------------------------------------------; MMRESULT FNLOCAL AcmAppWaveInGetDevCaps ( UINT uDevId, LPWAVEINCAPS pwic ) { MMRESULT mmr; // // // mmr = waveInGetDevCaps(uDevId, pwic, sizeof(*pwic)); if (MMSYSERR_NOERROR == mmr) { // // because some people shipped drivers without testing. // pwic->szPname[SIZEOF(pwic->szPname) - 1] = '\0'; } else { _fmemset(pwic, 0, sizeof(*pwic)); if (MMSYSERR_BADDEVICEID == mmr) { return (mmr); } if (WAVE_MAPPER == uDevId) { lstrcpy(pwic->szPname, TEXT("Default Wave Input Mapper")); } else { wsprintf(pwic->szPname, TEXT("Bad Wave Input Device %u"), uDevId); } } return (MMSYSERR_NOERROR); } // AcmAppWaveInGetDevCaps() //--------------------------------------------------------------------------; // // MMRESULT AcmAppWaveOutGetDevCaps // // Description: // // // Arguments: // UINT uDevId: // // LPWAVEOUTCAPS pwoc: // // Return (MMRESULT): // // //--------------------------------------------------------------------------; MMRESULT FNLOCAL AcmAppWaveOutGetDevCaps ( UINT uDevId, LPWAVEOUTCAPS pwoc ) { MMRESULT mmr; // // // mmr = waveOutGetDevCaps(uDevId, pwoc, sizeof(*pwoc)); if (MMSYSERR_NOERROR == mmr) { // // because some people shipped drivers without testing. // pwoc->szPname[SIZEOF(pwoc->szPname) - 1] = '\0'; } else { _fmemset(pwoc, 0, sizeof(*pwoc)); if (MMSYSERR_BADDEVICEID == mmr) { return (mmr); } if (WAVE_MAPPER == uDevId) { lstrcpy(pwoc->szPname, TEXT("Default Wave Output Mapper")); } else { wsprintf(pwoc->szPname, TEXT("Bad Wave Output Device %u"), uDevId); } } return (MMSYSERR_NOERROR); } // AcmAppWaveOutGetDevCaps() //--------------------------------------------------------------------------; // // BOOL AcmAppDisplayWaveInDevCaps // // Description: // // // Arguments: // HWND hedit: // // UINT uDevId: // // LPWAVEINCAPS pwic: // // Return (BOOL): // // //--------------------------------------------------------------------------; BOOL FNLOCAL AcmAppDisplayWaveInDevCaps ( HWND hedit, UINT uDevId, LPWAVEINCAPS pwic, LPWAVEFORMATEX pwfx ) { static TCHAR szDisplayTitle[] = TEXT("[Wave Input Device Capabilities]\r\n"); TCHAR ach[40]; PTSTR psz; UINT u; UINT v; DWORD dw; SetWindowRedraw(hedit, FALSE); MEditPrintF(hedit, NULL); MEditPrintF(hedit, szDisplayTitle); // // // if (NULL != pwfx) { TCHAR szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS]; TCHAR szFormat[ACMFORMATDETAILS_FORMAT_CHARS]; MMRESULT mmr; HWAVEIN hwi; // // // AcmAppGetFormatDescription(pwfx, szFormatTag, szFormat); MEditPrintF(hedit, TEXT("%17s: %s"), (LPTSTR)TEXT("Format"), (LPTSTR)szFormatTag); MEditPrintF(hedit, TEXT("%17s: %s"), (LPTSTR)TEXT("Attributes"), (LPTSTR)szFormat); // // // MEditPrintF(hedit, TEXT("~%17s: "), (LPTSTR)TEXT("Recordable")); mmr = waveInOpen(&hwi, uDevId, #if (WINVER < 0x0400) (LPWAVEFORMAT)pwfx, #else pwfx, #endif 0L, 0L, 0L); if (MMSYSERR_NOERROR == mmr) { MEditPrintF(hedit, gszYes); waveInClose(hwi); hwi = NULL; } else { AcmAppGetErrorString(mmr, ach); MEditPrintF(hedit, TEXT("%s, %s (%u)"), (LPTSTR)gszNo, (LPSTR)ach, mmr); } // // // MEditPrintF(hedit, TEXT("~%17s: "), (LPTSTR)TEXT("(Query)")); mmr = waveInOpen(NULL, uDevId, #if (WINVER < 0x0400) (LPWAVEFORMAT)pwfx, #else pwfx, #endif 0L, 0L, WAVE_FORMAT_QUERY); if (MMSYSERR_NOERROR == mmr) { MEditPrintF(hedit, gszYes); } else { AcmAppGetErrorString(mmr, ach); MEditPrintF(hedit, TEXT("%s, %s (%u)"), (LPTSTR)gszNo, (LPSTR)ach, mmr); } MEditPrintF(hedit, gszNull); } // // // MEditPrintF(hedit, TEXT("%17s: %d"), (LPTSTR)TEXT("Device Id"), uDevId); MEditPrintF(hedit, TEXT("%17s: %u"), (LPTSTR)TEXT("Manufacturer Id"), pwic->wMid); MEditPrintF(hedit, TEXT("%17s: %u"), (LPTSTR)TEXT("Product Id"), pwic->wPid); MEditPrintF(hedit, TEXT("%17s: %u.%.02u"), (LPTSTR)TEXT("Driver Version"), (pwic->vDriverVersion >> 8), (pwic->vDriverVersion & 0x00FF)); MEditPrintF(hedit, TEXT("%17s: '%s'"), (LPTSTR)TEXT("Device Name"), (LPTSTR)pwic->szPname); MEditPrintF(hedit, TEXT("%17s: %u"), (LPTSTR)TEXT("Channels"), pwic->wChannels); // // // // MEditPrintF(hedit, TEXT("%17s: %.08lXh"), (LPTSTR)TEXT("Standard Formats"), pwic->dwFormats); for (v = u = 0, dw = pwic->dwFormats; (0L != dw); u++) { if ((BYTE)dw & (BYTE)1) { psz = gaszWaveInOutCapsFormats[u]; if (NULL == psz) { wsprintf(ach, TEXT("Unknown%u"), u); psz = ach; } if (0 == (v % 4)) { if (v != 0) { MEditPrintF(hedit, gszNull); } MEditPrintF(hedit, TEXT("~%19s%s"), (LPTSTR)gszNull, (LPTSTR)psz); } else { MEditPrintF(hedit, TEXT("~, %s"), (LPTSTR)psz); } v++; } dw >>= 1; } MEditPrintF(hedit, gszNull); SetWindowRedraw(hedit, TRUE); return (TRUE); } // AcmAppDisplayWaveInDevCaps() //--------------------------------------------------------------------------; // // BOOL AcmAppDisplayWaveOutDevCaps // // Description: // // // Arguments: // HWND hedit: // // UINT uDevId: // // LPWAVEOUTCAPS pwoc: // // Return (BOOL): // // //--------------------------------------------------------------------------; BOOL FNLOCAL AcmAppDisplayWaveOutDevCaps ( HWND hedit, UINT uDevId, LPWAVEOUTCAPS pwoc, LPWAVEFORMATEX pwfx ) { static TCHAR szDisplayTitle[] = TEXT("[Wave Output Device Capabilities]\r\n"); TCHAR ach[40]; PTSTR psz; UINT u; UINT v; DWORD dw; SetWindowRedraw(hedit, FALSE); // // // MEditPrintF(hedit, NULL); MEditPrintF(hedit, szDisplayTitle); // // // if (NULL != pwfx) { TCHAR szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS]; TCHAR szFormat[ACMFORMATDETAILS_FORMAT_CHARS]; MMRESULT mmr; HWAVEOUT hwo; DWORD fdwOpen; fdwOpen = (0 != (WAVECAPS_SYNC & pwoc->dwSupport)) ? 0L : WAVE_ALLOWSYNC; // // // AcmAppGetFormatDescription(pwfx, szFormatTag, szFormat); MEditPrintF(hedit, TEXT("%17s: %s"), (LPTSTR)TEXT("Format"), (LPTSTR)szFormatTag); MEditPrintF(hedit, TEXT("%17s: %s"), (LPTSTR)TEXT("Attributes"), (LPTSTR)szFormat); // // // MEditPrintF(hedit, TEXT("~%17s: "), (LPTSTR)TEXT("Playable")); mmr = waveOutOpen(&hwo, uDevId, #if (WINVER < 0x0400) (LPWAVEFORMAT)pwfx, #else pwfx, #endif 0L, 0L, fdwOpen); if (MMSYSERR_NOERROR == mmr) { MEditPrintF(hedit, gszYes); waveOutClose(hwo); hwo = NULL; } else { AcmAppGetErrorString(mmr, ach); MEditPrintF(hedit, TEXT("%s, %s (%u)"), (LPTSTR)gszNo, (LPSTR)ach, mmr); } // // // MEditPrintF(hedit, TEXT("~%17s: "), (LPTSTR)TEXT("(Query)")); mmr = waveOutOpen(NULL, uDevId, #if (WINVER < 0x0400) (LPWAVEFORMAT)pwfx, #else pwfx, #endif 0L, 0L, fdwOpen | WAVE_FORMAT_QUERY); if (MMSYSERR_NOERROR == mmr) { MEditPrintF(hedit, gszYes); } else { AcmAppGetErrorString(mmr, ach); MEditPrintF(hedit, TEXT("%s, %s (%u)"), (LPTSTR)gszNo, (LPSTR)ach, mmr); } MEditPrintF(hedit, gszNull); } MEditPrintF(hedit, TEXT("%17s: %d"), (LPTSTR)TEXT("Device Id"), uDevId); MEditPrintF(hedit, TEXT("%17s: %u"), (LPTSTR)TEXT("Manufacturer Id"), pwoc->wMid); MEditPrintF(hedit, TEXT("%17s: %u"), (LPTSTR)TEXT("Product Id"), pwoc->wPid); MEditPrintF(hedit, TEXT("%17s: %u.%.02u"), (LPTSTR)TEXT("Driver Version"), (pwoc->vDriverVersion >> 8), (pwoc->vDriverVersion & 0x00FF)); MEditPrintF(hedit, TEXT("%17s: '%s'"), (LPTSTR)TEXT("Device Name"), (LPTSTR)pwoc->szPname); MEditPrintF(hedit, TEXT("%17s: %u"), (LPTSTR)TEXT("Channels"), pwoc->wChannels); // // // // MEditPrintF(hedit, TEXT("%17s: %.08lXh"), (LPTSTR)TEXT("Standard Formats"), pwoc->dwFormats); for (v = u = 0, dw = pwoc->dwFormats; (0L != dw); u++) { if ((BYTE)dw & (BYTE)1) { psz = gaszWaveInOutCapsFormats[u]; if (NULL == psz) { wsprintf(ach, TEXT("Unknown%u"), u); psz = ach; } if (0 == (v % 4)) { if (v != 0) { MEditPrintF(hedit, gszNull); } MEditPrintF(hedit, TEXT("~%19s%s"), (LPTSTR)gszNull, (LPTSTR)psz); } else { MEditPrintF(hedit, TEXT("~, %s"), (LPTSTR)psz); } v++; } dw >>= 1; } MEditPrintF(hedit, gszNull); // // // // MEditPrintF(hedit, TEXT("%17s: %.08lXh"), (LPTSTR)TEXT("Standard Support"), pwoc->dwSupport); for (v = u = 0, dw = pwoc->dwSupport; dw; u++) { if ((BYTE)dw & (BYTE)1) { psz = gaszWaveOutCapsSupport[u]; if (NULL == psz) { wsprintf(ach, TEXT("Unknown%u"), u); psz = ach; } if (0 == (v % 4)) { if (v != 0) { MEditPrintF(hedit, gszNull); } MEditPrintF(hedit, TEXT("~%19s%s"), (LPTSTR)gszNull, (LPTSTR)psz); } else { MEditPrintF(hedit, TEXT("~, %s"), (LPTSTR)psz); } v++; } dw >>= 1; } MEditPrintF(hedit, gszNull); SetWindowRedraw(hedit, TRUE); return (TRUE); } // AcmAppDisplayWaveOutDevCaps() //--------------------------------------------------------------------------; // // BOOL AcmAppWaveDeviceDlgProc // // Description: // // // Arguments: // HWND hwnd: // // UINT uMsg: // // WPARAM wParam: // // LPARAM lParam: // // Return (BOOL): // // //--------------------------------------------------------------------------; BOOL FNEXPORT AcmAppWaveDeviceDlgProc ( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { LONG lDevice; BOOL fInput; UINT uDevId; UINT cWaveDevs; UINT u; UINT uId; UINT uCmd; HWND hcb; HWND hedit; HFONT hfont; WAVEINCAPS wic; WAVEOUTCAPS woc; lDevice = GetWindowLong(hwnd, DWL_USER); uDevId = (UINT)(int)(short)LOWORD(lDevice); fInput = (BOOL)HIWORD(lDevice); // // // switch (uMsg) { case WM_INITDIALOG: // hfont = GetStockFont(ANSI_FIXED_FONT); hfont = ghfontApp; hedit = GetDlgItem(hwnd, IDD_AAWAVEDEVICE_EDIT_CAPABILITIES); SetWindowFont(hedit, hfont, FALSE); uDevId = (UINT)(int)(short)LOWORD(lParam); fInput = (BOOL)HIWORD(lParam); SetWindowLong(hwnd, DWL_USER, lParam); // // // hcb = GetDlgItem(hwnd, IDD_AAWAVEDEVICE_COMBO_DEVICE); SetWindowFont(hcb, hfont, FALSE); if (fInput) cWaveDevs = waveInGetNumDevs() + 1; else cWaveDevs = waveOutGetNumDevs() + 1; for (u = (UINT)WAVE_MAPPER; (0 != cWaveDevs); u++, cWaveDevs--) { if (fInput) { AcmAppWaveInGetDevCaps(u, &wic); ComboBox_AddString(hcb, wic.szPname); } else { AcmAppWaveOutGetDevCaps(u, &woc); ComboBox_AddString(hcb, woc.szPname); } if (uDevId == u) { hedit = GetDlgItem(hwnd, IDD_AAWAVEDEVICE_EDIT_CAPABILITIES); if (fInput) AcmAppDisplayWaveInDevCaps(hedit, uDevId, &wic, gaafd.pwfx); else AcmAppDisplayWaveOutDevCaps(hedit, uDevId, &woc, gaafd.pwfx); } } ComboBox_SetCurSel(hcb, uDevId + 1); return (TRUE); case WM_COMMAND: uId = GET_WM_COMMAND_ID(wParam, lParam); switch (uId) { case IDOK: hcb = GetDlgItem(hwnd, IDD_AAWAVEDEVICE_COMBO_DEVICE); uDevId = ComboBox_GetCurSel(hcb); if (CB_ERR != uDevId) { EndDialog(hwnd, uDevId - 1); break; } // -- fall through -- // case IDCANCEL: EndDialog(hwnd, uDevId); break; case IDD_AAWAVEDEVICE_COMBO_DEVICE: uCmd = GET_WM_COMMAND_CMD(wParam, lParam); hcb = GET_WM_COMMAND_HWND(wParam, lParam); switch (uCmd) { case CBN_SELCHANGE: uDevId = ComboBox_GetCurSel(hcb); if (CB_ERR == uDevId) break; uDevId--; hedit = GetDlgItem(hwnd, IDD_AAWAVEDEVICE_EDIT_CAPABILITIES); if (fInput) { AcmAppWaveInGetDevCaps(uDevId, &wic); AcmAppDisplayWaveInDevCaps(hedit, uDevId, &wic, gaafd.pwfx); } else { AcmAppWaveOutGetDevCaps(uDevId, &woc); AcmAppDisplayWaveOutDevCaps(hedit, uDevId, &woc, gaafd.pwfx); } break; } } return (TRUE); } return (FALSE); } // AcmAppWaveDeviceDlgProc()