|
|
//==========================================================================;
//
// 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.
//
//--------------------------------------------------------------------------;
//
// aachoose.c
//
// Description:
//
//
//
//==========================================================================;
#include <windows.h>
#include <windowsx.h>
#include <mmsystem.h>
#include <memory.h>
#include <stdlib.h>
#include <mmreg.h>
#include <msacm.h>
#include "muldiv32.h"
#include "appport.h"
#include "waveio.h"
#include "acmapp.h"
#include "debug.h"
TCHAR gszBogus[] = TEXT("????");
TCHAR BCODE gszAcmAppHelpFormat[] = TEXT("choo_win.hlp"); TCHAR BCODE gszAcmAppHelpFilter[] = TEXT("fil_win.hlp");
LPTSTR gpszAcmAppHelp; UINT guMsgHelp;
//==========================================================================;
//
//
//
//
//==========================================================================;
//--------------------------------------------------------------------------;
//
// BOOL AcmAppDlgProcFormatStyle
//
// Description:
//
//
// Arguments:
// HWND hwnd: Handle to window.
//
// UINT uMsg: Message being sent to the window.
//
// WPARAM wParam: Specific argument to message.
//
// LPARAM lParam: Specific argument to message.
//
// Return (BOOL):
// The return value is specific to the message that was received. For
// the most part, it is FALSE if this dialog procedure does not handle
// a message.
//
//--------------------------------------------------------------------------;
BOOL FNEXPORT AcmAppDlgProcFormatStyle ( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { PACMFORMATCHOOSE pafc; HFONT hfont; UINT uId; BOOL f; DWORD fdwStyle;
pafc = (PACMFORMATCHOOSE)(UINT)GetWindowLong(hwnd, DWL_USER);
switch (uMsg) { case WM_INITDIALOG: pafc = (PACMFORMATCHOOSE)(UINT)lParam;
SetWindowLong(hwnd, DWL_USER, lParam);
hfont = ghfontApp;
//
//
//
fdwStyle = pafc->fdwStyle;
f = (0 != (ACMFORMATCHOOSE_STYLEF_SHOWHELP & fdwStyle)); CheckDlgButton(hwnd, IDD_AAFORMATSTYLE_CHECK_SHOWHELP, f);
f = (0 != (ACMFORMATCHOOSE_STYLEF_ENABLEHOOK & fdwStyle)); CheckDlgButton(hwnd, IDD_AAFORMATSTYLE_CHECK_ENABLEHOOK, f);
f = (0 != (ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATE & fdwStyle)); CheckDlgButton(hwnd, IDD_AAFORMATSTYLE_CHECK_ENABLETEMPLATE, f);
f = (0 != (ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATEHANDLE & fdwStyle)); CheckDlgButton(hwnd, IDD_AAFORMATSTYLE_CHECK_ENABLETEMPLATEHANDLE, f);
f = (0 != (ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT & fdwStyle)); CheckDlgButton(hwnd, IDD_AAFORMATSTYLE_CHECK_INITTOWFXSTRUCT, f);
return (TRUE);
case WM_COMMAND: uId = GET_WM_COMMAND_ID(wParam, lParam); switch (uId) { case IDOK: fdwStyle = 0L;
f = IsDlgButtonChecked(hwnd, IDD_AAFORMATSTYLE_CHECK_SHOWHELP); if (f) fdwStyle |= ACMFORMATCHOOSE_STYLEF_SHOWHELP;
f = IsDlgButtonChecked(hwnd, IDD_AAFORMATSTYLE_CHECK_ENABLEHOOK); if (f) fdwStyle |= ACMFORMATCHOOSE_STYLEF_ENABLEHOOK;
f = IsDlgButtonChecked(hwnd, IDD_AAFORMATSTYLE_CHECK_ENABLETEMPLATE); if (f) fdwStyle |= ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATE;
f = IsDlgButtonChecked(hwnd, IDD_AAFORMATSTYLE_CHECK_ENABLETEMPLATEHANDLE); if (f) fdwStyle |= ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATEHANDLE;
f = IsDlgButtonChecked(hwnd, IDD_AAFORMATSTYLE_CHECK_INITTOWFXSTRUCT); if (f) fdwStyle |= ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT;
pafc->fdwStyle = fdwStyle;
// -- fall through -- //
case IDCANCEL: EndDialog(hwnd, (IDOK == uId)); break; } break; }
return (FALSE); } // AcmAppDlgProcFormatStyle()
//--------------------------------------------------------------------------;
//
// BOOL AcmAppDlgProcFilterStyle
//
// Description:
//
//
// Arguments:
// HWND hwnd: Handle to window.
//
// UINT uMsg: Message being sent to the window.
//
// WPARAM wParam: Specific argument to message.
//
// LPARAM lParam: Specific argument to message.
//
// Return (BOOL):
// The return value is specific to the message that was received. For
// the most part, it is FALSE if this dialog procedure does not handle
// a message.
//
//--------------------------------------------------------------------------;
BOOL FNEXPORT AcmAppDlgProcFilterStyle ( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { PACMFILTERCHOOSE pafc; HFONT hfont; UINT uId; BOOL f; DWORD fdwStyle;
pafc = (PACMFILTERCHOOSE)(UINT)GetWindowLong(hwnd, DWL_USER);
switch (uMsg) { case WM_INITDIALOG: pafc = (PACMFILTERCHOOSE)(UINT)lParam;
SetWindowLong(hwnd, DWL_USER, lParam);
hfont = ghfontApp;
//
//
//
fdwStyle = pafc->fdwStyle;
f = (0 != (ACMFILTERCHOOSE_STYLEF_SHOWHELP & fdwStyle)); CheckDlgButton(hwnd, IDD_AAFILTERSTYLE_CHECK_SHOWHELP, f);
f = (0 != (ACMFILTERCHOOSE_STYLEF_ENABLEHOOK & fdwStyle)); CheckDlgButton(hwnd, IDD_AAFILTERSTYLE_CHECK_ENABLEHOOK, f);
f = (0 != (ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATE & fdwStyle)); CheckDlgButton(hwnd, IDD_AAFILTERSTYLE_CHECK_ENABLETEMPLATE, f);
f = (0 != (ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATEHANDLE & fdwStyle)); CheckDlgButton(hwnd, IDD_AAFILTERSTYLE_CHECK_ENABLETEMPLATEHANDLE, f);
f = (0 != (ACMFILTERCHOOSE_STYLEF_INITTOFILTERSTRUCT & fdwStyle)); CheckDlgButton(hwnd, IDD_AAFILTERSTYLE_CHECK_INITTOFILTERSTRUCT, f);
return (TRUE);
case WM_COMMAND: uId = GET_WM_COMMAND_ID(wParam, lParam); switch (uId) { case IDOK: fdwStyle = 0L;
f = IsDlgButtonChecked(hwnd, IDD_AAFILTERSTYLE_CHECK_SHOWHELP); if (f) fdwStyle |= ACMFILTERCHOOSE_STYLEF_SHOWHELP;
f = IsDlgButtonChecked(hwnd, IDD_AAFILTERSTYLE_CHECK_ENABLEHOOK); if (f) fdwStyle |= ACMFILTERCHOOSE_STYLEF_ENABLEHOOK;
f = IsDlgButtonChecked(hwnd, IDD_AAFILTERSTYLE_CHECK_ENABLETEMPLATE); if (f) fdwStyle |= ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATE;
f = IsDlgButtonChecked(hwnd, IDD_AAFILTERSTYLE_CHECK_ENABLETEMPLATEHANDLE); if (f) fdwStyle |= ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATEHANDLE;
f = IsDlgButtonChecked(hwnd, IDD_AAFILTERSTYLE_CHECK_INITTOFILTERSTRUCT); if (f) fdwStyle |= ACMFILTERCHOOSE_STYLEF_INITTOFILTERSTRUCT;
pafc->fdwStyle = fdwStyle;
// -- fall through -- //
case IDCANCEL: EndDialog(hwnd, (IDOK == uId)); break; } break; }
return (FALSE); } // AcmAppDlgProcFilterStyle()
//--------------------------------------------------------------------------;
//
// BOOL AcmAppDlgProcFilterEnum
//
// Description:
//
//
// Arguments:
// HWND hwnd: Handle to window.
//
// UINT uMsg: Message being sent to the window.
//
// WPARAM wParam: Specific argument to message.
//
// LPARAM lParam: Specific argument to message.
//
// Return (BOOL):
// The return value is specific to the message that was received. For
// the most part, it is FALSE if this dialog procedure does not handle
// a message.
//
//--------------------------------------------------------------------------;
BOOL FNEXPORT AcmAppDlgProcFilterEnum ( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { TCHAR ach[14]; PWAVEFILTER pwfltr; HWND hedit; HFONT hfont; UINT uId; BOOL f; DWORD fdwEnum;
pwfltr = (PWAVEFILTER)(UINT)GetWindowLong(hwnd, DWL_USER);
switch (uMsg) { case WM_INITDIALOG: pwfltr = (PWAVEFILTER)(UINT)lParam;
SetWindowLong(hwnd, DWL_USER, lParam);
hfont = ghfontApp;
//
// the initial fdwEnum flags are passed in fdwFilter
// because i'm too lazy to make another structure..
//
fdwEnum = pwfltr->fdwFilter;
f = (0 != (ACM_FILTERENUMF_DWFILTERTAG & fdwEnum)); CheckDlgButton(hwnd, IDD_AAFILTERENUM_CHECK_DWFILTERTAG, f);
hedit = GetDlgItem(hwnd, IDD_AAFILTERENUM_EDIT_DWFILTERTAG); SetWindowFont(hedit, hfont, FALSE); AppSetWindowText(hedit, TEXT("%u"), pwfltr->dwFilterTag);
return (TRUE);
case WM_COMMAND: uId = GET_WM_COMMAND_ID(wParam, lParam); switch (uId) { case IDOK: fdwEnum = 0L;
f = IsDlgButtonChecked(hwnd, IDD_AAFILTERENUM_CHECK_DWFILTERTAG); if (f) fdwEnum |= ACM_FILTERENUMF_DWFILTERTAG;
hedit = GetDlgItem(hwnd, IDD_AAFILTERENUM_EDIT_DWFILTERTAG); Edit_GetText(hedit, ach, SIZEOF(ach)); pwfltr->dwFilterTag = _tcstoul(ach, NULL, 10);
pwfltr->fdwFilter = fdwEnum;
// -- fall through -- //
case IDCANCEL: EndDialog(hwnd, (IDOK == uId)); break; } break; }
return (FALSE); } // AcmAppDlgProcFilterEnum()
//--------------------------------------------------------------------------;
//
// BOOL AcmAppDlgProcFormatEnum
//
// Description:
//
//
// Arguments:
// HWND hwnd: Handle to window.
//
// UINT uMsg: Message being sent to the window.
//
// WPARAM wParam: Specific argument to message.
//
// LPARAM lParam: Specific argument to message.
//
// Return (BOOL):
// The return value is specific to the message that was received. For
// the most part, it is FALSE if this dialog procedure does not handle
// a message.
//
//--------------------------------------------------------------------------;
BOOL FNEXPORT AcmAppDlgProcFormatEnum ( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { TCHAR ach[14]; PWAVEFORMATEX pwfx; HWND hedit; HFONT hfont; UINT uId; BOOL f; DWORD fdwEnum;
pwfx = (PWAVEFORMATEX)(UINT)GetWindowLong(hwnd, DWL_USER);
switch (uMsg) { case WM_INITDIALOG: pwfx = (PWAVEFORMATEX)(UINT)lParam;
SetWindowLong(hwnd, DWL_USER, lParam);
hfont = ghfontApp;
//
// the initial fdwEnum flags are passed in nAvgBytesPerSec
// because i'm too lazy to make another structure..
//
fdwEnum = pwfx->nAvgBytesPerSec;
f = (0 != (ACM_FORMATENUMF_WFORMATTAG & fdwEnum)); CheckDlgButton(hwnd, IDD_AAFORMATENUM_CHECK_WFORMATTAG, f);
f = (0 != (ACM_FORMATENUMF_NCHANNELS & fdwEnum)); CheckDlgButton(hwnd, IDD_AAFORMATENUM_CHECK_NCHANNELS, f);
f = (0 != (ACM_FORMATENUMF_NSAMPLESPERSEC & fdwEnum)); CheckDlgButton(hwnd, IDD_AAFORMATENUM_CHECK_NSAMPLESPERSEC, f);
f = (0 != (ACM_FORMATENUMF_WBITSPERSAMPLE & fdwEnum)); CheckDlgButton(hwnd, IDD_AAFORMATENUM_CHECK_WBITSPERSAMPLE, f);
f = (0 != (ACM_FORMATENUMF_CONVERT & fdwEnum)); CheckDlgButton(hwnd, IDD_AAFORMATENUM_CHECK_CONVERT, f);
f = (0 != (ACM_FORMATENUMF_SUGGEST & fdwEnum)); CheckDlgButton(hwnd, IDD_AAFORMATENUM_CHECK_SUGGEST, f);
f = (0 != (ACM_FORMATENUMF_HARDWARE & fdwEnum)); CheckDlgButton(hwnd, IDD_AAFORMATENUM_CHECK_HARDWARE, f);
f = (0 != (ACM_FORMATENUMF_INPUT & fdwEnum)); CheckDlgButton(hwnd, IDD_AAFORMATENUM_CHECK_INPUT, f);
f = (0 != (ACM_FORMATENUMF_OUTPUT & fdwEnum)); CheckDlgButton(hwnd, IDD_AAFORMATENUM_CHECK_OUTPUT, f);
hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_WFORMATTAG); SetWindowFont(hedit, hfont, FALSE); AppSetWindowText(hedit, TEXT("%u"), pwfx->wFormatTag);
hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_NCHANNELS); SetWindowFont(hedit, hfont, FALSE); AppSetWindowText(hedit, TEXT("%u"), pwfx->nChannels);
hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_NSAMPLESPERSEC); SetWindowFont(hedit, hfont, FALSE); AppSetWindowText(hedit, TEXT("%lu"), pwfx->nSamplesPerSec);
hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_WBITSPERSAMPLE); SetWindowFont(hedit, hfont, FALSE); AppSetWindowText(hedit, TEXT("%u"), pwfx->wBitsPerSample);
return (TRUE);
case WM_COMMAND: uId = GET_WM_COMMAND_ID(wParam, lParam); switch (uId) { case IDOK:
fdwEnum = 0L;
f = IsDlgButtonChecked(hwnd, IDD_AAFORMATENUM_CHECK_WFORMATTAG); if (f) fdwEnum |= ACM_FORMATENUMF_WFORMATTAG;
f = IsDlgButtonChecked(hwnd, IDD_AAFORMATENUM_CHECK_NCHANNELS); if (f) fdwEnum |= ACM_FORMATENUMF_NCHANNELS;
f = IsDlgButtonChecked(hwnd, IDD_AAFORMATENUM_CHECK_NSAMPLESPERSEC); if (f) fdwEnum |= ACM_FORMATENUMF_NSAMPLESPERSEC;
f = IsDlgButtonChecked(hwnd, IDD_AAFORMATENUM_CHECK_WBITSPERSAMPLE); if (f) fdwEnum |= ACM_FORMATENUMF_WBITSPERSAMPLE;
f = IsDlgButtonChecked(hwnd, IDD_AAFORMATENUM_CHECK_CONVERT); if (f) fdwEnum |= ACM_FORMATENUMF_CONVERT;
f = IsDlgButtonChecked(hwnd, IDD_AAFORMATENUM_CHECK_SUGGEST); if (f) fdwEnum |= ACM_FORMATENUMF_SUGGEST;
f = IsDlgButtonChecked(hwnd, IDD_AAFORMATENUM_CHECK_HARDWARE); if (f) fdwEnum |= ACM_FORMATENUMF_HARDWARE;
f = IsDlgButtonChecked(hwnd, IDD_AAFORMATENUM_CHECK_INPUT); if (f) fdwEnum |= ACM_FORMATENUMF_INPUT;
f = IsDlgButtonChecked(hwnd, IDD_AAFORMATENUM_CHECK_OUTPUT); if (f) fdwEnum |= ACM_FORMATENUMF_OUTPUT;
hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_WFORMATTAG); Edit_GetText(hedit, ach, SIZEOF(ach)); pwfx->wFormatTag = (WORD)_tcstoul(ach, NULL, 10);
hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_NCHANNELS); Edit_GetText(hedit, ach, SIZEOF(ach)); pwfx->nChannels = (WORD)_tcstoul(ach, NULL, 10);
hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_NSAMPLESPERSEC); Edit_GetText(hedit, ach, SIZEOF(ach)); pwfx->nSamplesPerSec = _tcstoul(ach, NULL, 10);
hedit = GetDlgItem(hwnd, IDD_AAFORMATENUM_EDIT_WBITSPERSAMPLE); Edit_GetText(hedit, ach, SIZEOF(ach)); pwfx->wBitsPerSample = (WORD)_tcstoul(ach, NULL, 10);
pwfx->nAvgBytesPerSec = fdwEnum;
// -- fall through -- //
case IDCANCEL: EndDialog(hwnd, (IDOK == uId)); break; } break; }
return (FALSE); } // AcmAppDlgProcFormatEnum()
//--------------------------------------------------------------------------;
//
// BOOL AcmAppDlgProcProperties
//
// Description:
//
//
// Arguments:
// HWND hwnd: Handle to window.
//
// UINT uMsg: Message being sent to the window.
//
// WPARAM wParam: Specific argument to message.
//
// LPARAM lParam: Specific argument to message.
//
// Return (BOOL):
// The return value is specific to the message that was received. For
// the most part, it is FALSE if this dialog procedure does not handle
// a message.
//
//--------------------------------------------------------------------------;
BOOL FNEXPORT AcmAppDlgProcProperties ( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { MMRESULT mmr; TCHAR ach[14]; PAACONVERTDESC paacd; HWND hcb; HFONT hfont; UINT uId; DWORD cb;
paacd = (PAACONVERTDESC)(UINT)GetWindowLong(hwnd, DWL_USER);
switch (uMsg) { case WM_INITDIALOG: paacd = (PAACONVERTDESC)(UINT)lParam;
SetWindowLong(hwnd, DWL_USER, lParam);
hfont = ghfontApp;
hcb = GetDlgItem(hwnd, IDD_AAPROPERTIES_COMBO_SOURCE); SetWindowFont(hcb, hfont, FALSE);
wsprintf(ach, TEXT("%lu"), paacd->cbSrcReadSize); ComboBox_AddString(hcb, ach);
wsprintf(ach, TEXT("%lu"), paacd->cbSrcData); ComboBox_AddString(hcb, ach);
wsprintf(ach, TEXT("%u"), paacd->pwfxSrc->nBlockAlign); ComboBox_AddString(hcb, ach);
ComboBox_AddString(hcb, TEXT("1")); ComboBox_AddString(hcb, TEXT("2147483648")); ComboBox_AddString(hcb, TEXT("4294967295"));
ComboBox_SetCurSel(hcb, 0);
mmr = acmStreamSize(paacd->has, paacd->cbSrcReadSize, &paacd->cbDstBufSize, ACM_STREAMSIZEF_SOURCE);
hcb = GetDlgItem(hwnd, IDD_AAPROPERTIES_COMBO_DESTINATION); SetWindowFont(hcb, hfont, FALSE);
wsprintf(ach, TEXT("%lu"), paacd->cbDstBufSize); ComboBox_AddString(hcb, ach);
wsprintf(ach, TEXT("%u"), paacd->pwfxDst->nBlockAlign); ComboBox_AddString(hcb, ach);
ComboBox_AddString(hcb, TEXT("1")); ComboBox_AddString(hcb, TEXT("2147483648")); ComboBox_AddString(hcb, TEXT("4294967295"));
ComboBox_SetCurSel(hcb, 0);
return (TRUE);
case WM_COMMAND: uId = GET_WM_COMMAND_ID(wParam, lParam); switch (uId) { case IDD_AAPROPERTIES_BTN_SOURCE: hcb = GetDlgItem(hwnd, IDD_AAPROPERTIES_COMBO_SOURCE); Edit_GetText(hcb, ach, SIZEOF(ach)); cb = _tcstoul(ach, NULL, 10);
mmr = acmStreamSize(paacd->has, cb, &cb, ACM_STREAMSIZEF_SOURCE);
wsprintf(ach, TEXT("%lu"), cb);
hcb = GetDlgItem(hwnd, IDD_AAPROPERTIES_COMBO_DESTINATION); Edit_SetText(hcb, ach); break;
case IDD_AAPROPERTIES_BTN_DESTINATION: hcb = GetDlgItem(hwnd, IDD_AAPROPERTIES_COMBO_DESTINATION); Edit_GetText(hcb, ach, SIZEOF(ach)); cb = _tcstoul(ach, NULL, 10);
mmr = acmStreamSize(paacd->has, cb, &cb, ACM_STREAMSIZEF_DESTINATION);
wsprintf(ach, TEXT("%lu"), cb);
hcb = GetDlgItem(hwnd, IDD_AAPROPERTIES_COMBO_SOURCE); Edit_SetText(hcb, ach); break;
case IDOK: hcb = GetDlgItem(hwnd, IDD_AAPROPERTIES_COMBO_SOURCE); Edit_GetText(hcb, ach, SIZEOF(ach)); paacd->cbSrcReadSize = _tcstoul(ach, NULL, 10); // -- fall through -- //
case IDCANCEL: EndDialog(hwnd, (IDOK == uId)); break; } break; }
return (FALSE); } // AcmAppDlgProcProperties()
//==========================================================================;
//
//
//
//
//==========================================================================;
//--------------------------------------------------------------------------;
//
// BOOL AcmAppChooserFormatSuggest
//
// Description:
//
//
// Arguments:
// HWND hwnd:
//
// PAACONVERTDESC paacd:
//
// Return (BOOL):
//
//
//--------------------------------------------------------------------------;
BOOL FNLOCAL AcmAppChooserFormatSuggest ( HWND hwnd, PAACONVERTDESC paacd ) { MMRESULT mmr; LPWAVEFORMATEX pwfx; DWORD cbwfx; DWORD cbwfxSrc;
//
// this should never fail
//
mmr = acmMetrics(NULL, ACM_METRIC_MAX_SIZE_FORMAT, &cbwfx); if (MMSYSERR_NOERROR != mmr) { DPF(0, "!AcmAppChooserFormatSuggest() acmMetrics failed mmr=%u!", mmr); return (FALSE); }
//
// just in case no ACM driver is installed for the source format and
// the source has a larger format size than the largest enabled ACM
// driver...
//
cbwfxSrc = SIZEOF_WAVEFORMATEX(paacd->pwfxSrc); cbwfx = max(cbwfx, cbwfxSrc);
pwfx = (LPWAVEFORMATEX)GlobalAllocPtr(GHND, cbwfx); if (NULL == pwfx) { DPF(0, "!AcmAppChooserFormatSuggest() GlobalAllocPtr(%lu) failed!", cbwfx); return (FALSE); }
//
// 'suggest anything'
//
mmr = acmFormatSuggest(NULL, paacd->pwfxSrc, pwfx, cbwfx, 0L); if (MMSYSERR_NOERROR != mmr) { AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION, TEXT("AcmAppChooserFormatSuggest() there is no suggested destination format. Defaulting to source format."));
_fmemcpy(pwfx, paacd->pwfxSrc, (UINT)cbwfxSrc); }
//
//
//
if (NULL != paacd->pwfxDst) { GlobalFreePtr(paacd->pwfxDst); }
paacd->pwfxDst = pwfx; AcmAppGetFormatDescription(pwfx, paacd->szDstFormatTag, paacd->szDstFormat);
return (TRUE); } // AcmAppChooserFormatSuggest()
//--------------------------------------------------------------------------;
//
// BOOL AcmAppChooserSaveFile
//
// Description:
//
//
// Arguments:
// HWND hwnd:
//
// PAACONVERTDESC paacd:
//
// Return (BOOL):
//
//
//--------------------------------------------------------------------------;
BOOL FNLOCAL AcmAppChooserSaveFile ( HWND hwnd, PAACONVERTDESC paacd ) { TCHAR szFilePath[APP_MAX_FILE_PATH_CHARS]; TCHAR szFileTitle[APP_MAX_FILE_TITLE_CHARS]; HWND hedit; BOOL f;
hedit = GetDlgItem(hwnd, IDD_AACHOOSER_EDIT_FILE_OUTPUT); Edit_GetText(hedit, paacd->szFilePathDst, SIZEOF(paacd->szFilePathDst));
lstrcpy(szFilePath, paacd->szFilePathDst);
f = AppGetFileName(hwnd, szFilePath, szFileTitle, APP_GETFILENAMEF_SAVE); if (f) { lstrcpy(paacd->szFilePathDst, szFilePath); Edit_SetText(hedit, paacd->szFilePathDst); }
return (f); } // AcmAppChooserSaveFile()
//--------------------------------------------------------------------------;
//
// BOOL AcmAppChooserProperties
//
// Description:
//
//
// Arguments:
// HWND hwnd:
//
// PAACONVERTDESC paacd:
//
// Return (BOOL):
//
//
//--------------------------------------------------------------------------;
BOOL FNLOCAL AcmAppChooserProperties ( HWND hwnd, PAACONVERTDESC paacd ) { MMRESULT mmr; BOOL f;
//
//
//
if (NULL != paacd->hadid) { mmr = acmDriverOpen(&paacd->had, paacd->hadid, 0L); if (MMSYSERR_NOERROR != mmr) { return (FALSE); } }
mmr = acmStreamOpen(&paacd->has, paacd->had, paacd->pwfxSrc, paacd->pwfxDst, paacd->fApplyFilter ? paacd->pwfltr : (LPWAVEFILTER)NULL, 0L, 0L, paacd->fdwOpen);
if (MMSYSERR_NOERROR == mmr) { f = DialogBoxParam(ghinst, DLG_AAPROPERTIES, hwnd, AcmAppDlgProcProperties, (LPARAM)(UINT)paacd);
acmStreamClose(paacd->has, 0L); paacd->has = NULL; }
if (NULL != paacd->had) { acmDriverClose(paacd->had, 0L); paacd->had = NULL; }
return (f); } // AcmAppChooserProperties()
//--------------------------------------------------------------------------;
//
// UINT AcmAppChooserFormatHook
//
// Description:
//
//
// Arguments:
// HWND hwnd:
//
// UINT uMsg:
//
// WPARAM wParam:
//
// LPARAM lParam:
//
// Return (UINT):
//
//
//--------------------------------------------------------------------------;
UINT FNWCALLBACK AcmAppChooserFormatHook ( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { static BOOL fVerify; LPWAVEFORMATEX pwfx; WAVEFORMATEX wfx; TCHAR szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS]; TCHAR szFormat[ACMFORMATDETAILS_FORMAT_CHARS]; PAACONVERTDESC paacd; UINT uId; int n; BOOL f;
paacd = (PAACONVERTDESC)(UINT)GetWindowLong(hwnd, DWL_USER);
switch (uMsg) { case WM_INITDIALOG: paacd = (PAACONVERTDESC)(UINT)lParam;
SetWindowLong(hwnd, DWL_USER, lParam);
DPF(1, "AcmAppChooserFormatHook(%.04Xh, WM_INITDIALOG, %u, %lu): %.04Xh", hwnd, wParam, lParam, paacd);
fVerify = TRUE;
return (TRUE);
case MM_ACM_FORMATCHOOSE: switch (wParam) { case FORMATCHOOSE_FORMATTAG_VERIFY: if (!fVerify) break;
wfx.wFormatTag = LOWORD(lParam);
AcmAppGetFormatDescription(&wfx, szFormatTag, NULL);
n = AppMsgBox(hwnd, MB_YESNOCANCEL | MB_ICONQUESTION, TEXT("Add format tag [%lu], '%s'?"), lParam, (LPTSTR)szFormatTag);
fVerify = (IDCANCEL != n);
if (!fVerify) break;
f = (IDYES == n);
SetWindowLong(hwnd, DWL_MSGRESULT, f); return (TRUE);
case FORMATCHOOSE_FORMAT_VERIFY: if (!fVerify) break;
pwfx = (LPWAVEFORMATEX)lParam;
AcmAppGetFormatDescription(pwfx, szFormatTag, szFormat);
n = AppMsgBox(hwnd, MB_YESNOCANCEL | MB_ICONQUESTION, TEXT("Add format '%s' for format tag [%u], '%s'?"), (LPTSTR)szFormat, pwfx->wFormatTag, (LPTSTR)szFormatTag);
fVerify = (IDCANCEL != n);
if (!fVerify) break;
f = (IDYES == n);
SetWindowLong(hwnd, DWL_MSGRESULT, f); return (TRUE);
case FORMATCHOOSE_CUSTOM_VERIFY: if (!fVerify) break;
pwfx = (LPWAVEFORMATEX)lParam;
AcmAppGetFormatDescription(pwfx, szFormatTag, szFormat);
n = AppMsgBox(hwnd, MB_YESNOCANCEL | MB_ICONQUESTION, TEXT("Add CUSTOM format '%s' for format tag [%u], '%s'?"), (LPTSTR)szFormat, pwfx->wFormatTag, (LPTSTR)szFormatTag);
fVerify = (IDCANCEL != n);
if (!fVerify) break;
f = (IDYES == n);
SetWindowLong(hwnd, DWL_MSGRESULT, f); return (TRUE); } break;
case WM_COMMAND: uId = GET_WM_COMMAND_ID(wParam, lParam); switch (uId) { case IDOK: case IDCANCEL: break; } break; }
return (FALSE); } // AcmAppChooserFormatHook()
//--------------------------------------------------------------------------;
//
// UINT AcmAppChooserFilterHook
//
// Description:
//
//
// Arguments:
// HWND hwnd:
//
// UINT uMsg:
//
// WPARAM wParam:
//
// LPARAM lParam:
//
// Return (UINT):
//
//
//--------------------------------------------------------------------------;
UINT FNWCALLBACK AcmAppChooserFilterHook ( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { static BOOL fVerify; WAVEFILTER wfltr; LPWAVEFILTER pwfltr; TCHAR szFilterTag[ACMFILTERTAGDETAILS_FILTERTAG_CHARS]; TCHAR szFilter[ACMFILTERDETAILS_FILTER_CHARS]; PAACONVERTDESC paacd; UINT uId; int n; BOOL f;
paacd = (PAACONVERTDESC)(UINT)GetWindowLong(hwnd, DWL_USER);
switch (uMsg) { case WM_INITDIALOG: paacd = (PAACONVERTDESC)(UINT)lParam;
SetWindowLong(hwnd, DWL_USER, lParam);
DPF(1, "AcmAppChooserFilterHook(%.04Xh, WM_INITDIALOG, %u, %lu): %.04Xh", hwnd, wParam, lParam, paacd);
fVerify = TRUE;
return (TRUE);
case MM_ACM_FILTERCHOOSE: switch (wParam) { case FILTERCHOOSE_FILTERTAG_VERIFY: if (!fVerify) break;
wfltr.dwFilterTag = lParam;
AcmAppGetFilterDescription(&wfltr, szFilterTag, NULL);
n = AppMsgBox(hwnd, MB_YESNOCANCEL | MB_ICONQUESTION, TEXT("Add filter tag [%lu], '%s'?"), lParam, (LPTSTR)szFilterTag);
fVerify = (IDCANCEL != n);
if (!fVerify) break;
f = (IDYES == n);
SetWindowLong(hwnd, DWL_MSGRESULT, f); return (TRUE);
case FILTERCHOOSE_FILTER_VERIFY: if (!fVerify) break;
pwfltr = (LPWAVEFILTER)lParam;
AcmAppGetFilterDescription(pwfltr, szFilterTag, szFilter);
n = AppMsgBox(hwnd, MB_YESNOCANCEL | MB_ICONQUESTION, TEXT("Add filter '%s' for filter tag [%lu], '%s'?"), (LPTSTR)szFilter, pwfltr->dwFilterTag, (LPTSTR)szFilterTag);
fVerify = (IDCANCEL != n);
if (!fVerify) break;
f = (IDYES == n);
SetWindowLong(hwnd, DWL_MSGRESULT, f); return (TRUE);
case FILTERCHOOSE_CUSTOM_VERIFY: if (!fVerify) break;
pwfltr = (LPWAVEFILTER)lParam;
AcmAppGetFilterDescription(pwfltr, szFilterTag, szFilter);
n = AppMsgBox(hwnd, MB_YESNOCANCEL | MB_ICONQUESTION, TEXT("Add CUSTOM filter '%s' for filter tag [%lu], '%s'?"), (LPTSTR)szFilter, pwfltr->dwFilterTag, (LPTSTR)szFilterTag);
fVerify = (IDCANCEL != n);
if (!fVerify) break;
f = (IDYES == n);
SetWindowLong(hwnd, DWL_MSGRESULT, f); return (TRUE); } break;
case WM_COMMAND: uId = GET_WM_COMMAND_ID(wParam, lParam); switch (uId) { case IDOK: case IDCANCEL: break; } break; }
return (FALSE); } // AcmAppChooserFilterHook()
//--------------------------------------------------------------------------;
//
// BOOL AcmAppChooserFormat
//
// Description:
//
//
// Arguments:
// HWND hwnd:
//
// PAACONVERTDESC paacd:
//
// BOOL fOptions:
//
// Return (BOOL):
//
//
//--------------------------------------------------------------------------;
BOOL FNLOCAL AcmAppChooserFormat ( HWND hwnd, PAACONVERTDESC paacd, BOOL fOptions ) { ACMFORMATCHOOSE afc; MMRESULT mmr; LPWAVEFORMATEX pwfx; DWORD cbwfx; DWORD cbwfxSrc; DWORD fdwSuggest; DWORD fdwStyle; DWORD fdwEnum; WAVEFORMATEX wfxEnum; BOOL f; HRSRC hrsrc;
//
//
//
fdwSuggest = 0L; fdwStyle = 0L; fdwEnum = 0L;
if (fOptions) { wfxEnum.wFormatTag = paacd->pwfxSrc->wFormatTag; wfxEnum.nChannels = paacd->pwfxSrc->nChannels; wfxEnum.nSamplesPerSec = paacd->pwfxSrc->nSamplesPerSec; wfxEnum.wBitsPerSample = paacd->pwfxSrc->wBitsPerSample;
wfxEnum.nBlockAlign = 0; wfxEnum.nAvgBytesPerSec = fdwEnum; wfxEnum.cbSize = 0;
f = DialogBoxParam(ghinst, DLG_AAFORMATENUM, hwnd, AcmAppDlgProcFormatEnum, (LPARAM)(UINT)&wfxEnum); if (!f) { return (FALSE); }
fdwEnum = wfxEnum.nAvgBytesPerSec;
wfxEnum.nAvgBytesPerSec = 0L; }
if (fOptions) { afc.fdwStyle = fdwStyle;
f = DialogBoxParam(ghinst, DLG_AAFORMATSTYLE, hwnd, AcmAppDlgProcFormatStyle, (LPARAM)(UINT)&afc); if (!f) { return (FALSE); }
fdwStyle = afc.fdwStyle; }
//
// this should never fail
//
mmr = acmMetrics(NULL, ACM_METRIC_MAX_SIZE_FORMAT, &cbwfx); if (MMSYSERR_NOERROR != mmr) { DPF(0, "!AcmAppChooserFormat() acmMetrics failed mmr=%u!", mmr); return (FALSE); }
//
// just in case no ACM driver is installed for the source format and
// the source has a larger format size than the largest enabled ACM
// driver...
//
cbwfxSrc = SIZEOF_WAVEFORMATEX(paacd->pwfxSrc); cbwfx = max(cbwfx, cbwfxSrc);
pwfx = (LPWAVEFORMATEX)GlobalAllocPtr(GHND, cbwfx); if (NULL == pwfx) { DPF(0, "!AcmAppChooserFormat() GlobalAllocPtr(%lu) failed!", cbwfx); return (FALSE); }
//
//
//
//
if (0 != (fdwStyle & ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT)) { if (NULL != paacd->pwfxDst) { _fmemcpy(pwfx, paacd->pwfxDst, SIZEOF_WAVEFORMATEX(paacd->pwfxDst)); } else { _fmemcpy(pwfx, paacd->pwfxSrc, (UINT)cbwfxSrc); } }
//
//
//
//
if (0 == (ACMFORMATCHOOSE_STYLEF_SHOWHELP & fdwStyle)) { guMsgHelp = 0; } else { guMsgHelp = RegisterWindowMessage(ACMHELPMSGSTRING); if (0 == guMsgHelp) { fdwStyle &= ~ACMFORMATCHOOSE_STYLEF_SHOWHELP; } else { gpszAcmAppHelp = gszAcmAppHelpFormat; } }
//
// initialize the ACMFORMATCHOOSE members
//
memset(&afc, 0, sizeof(afc));
afc.cbStruct = sizeof(afc); afc.fdwStyle = fdwStyle; afc.hwndOwner = hwnd; afc.pwfx = pwfx; afc.cbwfx = cbwfx; afc.pszTitle = TEXT("Destination Format Choice");
afc.szFormatTag[0] = '\0'; afc.szFormat[0] = '\0'; afc.pszName = NULL; afc.cchName = 0;
afc.fdwEnum = fdwEnum; if (0L == (afc.fdwEnum & (ACM_FORMATENUMF_WFORMATTAG | ACM_FORMATENUMF_NCHANNELS | ACM_FORMATENUMF_NSAMPLESPERSEC | ACM_FORMATENUMF_WBITSPERSAMPLE | ACM_FORMATENUMF_CONVERT | ACM_FORMATENUMF_SUGGEST))) { afc.pwfxEnum = NULL; } else { if (0 == (afc.fdwEnum & (ACM_FORMATENUMF_CONVERT | ACM_FORMATENUMF_SUGGEST))) { //
// if _CONVERT and _SUGGEST are not specified, then we only
// need to pass in a format structure large enough to describe
// everything up to (but not including) the cbSize--it's fine
// to pass more, but it is not necessary. in other words, a
// PCMWAVEFORMAT would do nicely...
//
afc.pwfxEnum = &wfxEnum; } else { //
// for the _CONVERT and _SUGGEST flags, we must pass a valid
// format--and since we're looking for destinations that apply
// to our source format, we simply reference it..
//
afc.pwfxEnum = paacd->pwfxSrc; } }
//
//
//
hrsrc = NULL;
if (0L == (afc.fdwStyle & (ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATE | ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATEHANDLE))) { afc.hInstance = NULL; afc.pszTemplateName = NULL; } else { if (0L != (afc.fdwStyle & ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATEHANDLE)) { //
// ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATEHANDLE
//
hrsrc = FindResource(ghinst, DLG_AAFORMATCHOOSE_TEMPLATE, RT_DIALOG);
afc.hInstance = (HINSTANCE)LoadResource(ghinst, hrsrc); afc.pszTemplateName = NULL; } else { afc.hInstance = ghinst; afc.pszTemplateName = DLG_AAFORMATCHOOSE_TEMPLATE; } }
if (0L == (afc.fdwStyle & ACMFORMATCHOOSE_STYLEF_ENABLEHOOK)) { afc.lCustData = 0L; afc.pfnHook = NULL; } else { afc.lCustData = (LPARAM)(UINT)paacd; afc.pfnHook = AcmAppChooserFormatHook; }
//
//
//
mmr = acmFormatChoose(&afc);
if (NULL != hrsrc) { FreeResource((HGLOBAL)afc.hInstance); }
//
//
//
if (0 != guMsgHelp) { WinHelp(hwnd, gszAcmAppHelpFormat, HELP_QUIT, 0L); guMsgHelp = 0; }
if (MMSYSERR_NOERROR != mmr) { if (ACMERR_CANCELED != mmr) { TCHAR ach[40];
AcmAppGetErrorString(mmr, ach); AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION, TEXT("acmFormatChoose() failed with error %s, [%u]."), (LPTSTR)ach, mmr); }
GlobalFreePtr(pwfx); return (FALSE); }
//
//
//
if (NULL != paacd->pwfxDst) { GlobalFreePtr(paacd->pwfxDst); }
paacd->pwfxDst = pwfx; lstrcpy(paacd->szDstFormatTag, afc.szFormatTag); lstrcpy(paacd->szDstFormat, afc.szFormat);
return (TRUE); } // AcmAppChooserFormat()
//--------------------------------------------------------------------------;
//
// BOOL AcmAppChooserFilter
//
// Description:
//
//
// Arguments:
// HWND hwnd:
//
// PAACONVERTDESC paacd:
//
// BOOL fOptions:
//
// Return (BOOL):
//
//
//--------------------------------------------------------------------------;
BOOL FNLOCAL AcmAppChooserFilter ( HWND hwnd, PAACONVERTDESC paacd, BOOL fOptions ) { ACMFILTERCHOOSE afc; MMRESULT mmr; LPWAVEFILTER pwfltr; DWORD cbwfltr; DWORD fdwStyle; DWORD fdwEnum; WAVEFILTER wfltrEnum; BOOL f; HRSRC hrsrc;
//
//
//
fdwStyle = 0L; fdwEnum = 0L;
if (fOptions) { _fmemset(&wfltrEnum, 0, sizeof(wfltrEnum));
wfltrEnum.cbStruct = sizeof(wfltrEnum); wfltrEnum.dwFilterTag = paacd->pwfxSrc->wFormatTag;
wfltrEnum.fdwFilter = fdwEnum;
f = DialogBoxParam(ghinst, DLG_AAFILTERENUM, hwnd, AcmAppDlgProcFilterEnum, (LPARAM)(UINT)&wfltrEnum); if (!f) { return (FALSE); }
fdwEnum = wfltrEnum.fdwFilter;
wfltrEnum.fdwFilter = 0L; }
if (fOptions) { afc.fdwStyle = fdwStyle;
f = DialogBoxParam(ghinst, DLG_AAFILTERSTYLE, hwnd, AcmAppDlgProcFilterStyle, (LPARAM)(UINT)&afc); if (!f) { return (FALSE); }
fdwStyle = afc.fdwStyle; }
//
// this should never fail
//
mmr = acmMetrics(NULL, ACM_METRIC_MAX_SIZE_FILTER, &cbwfltr); if (MMSYSERR_NOERROR != mmr) { DPF(0, "!AcmAppChooserFilter() acmMetrics failed mmr=%u!", mmr); return (FALSE); }
//
//
//
cbwfltr = max(cbwfltr, sizeof(WAVEFILTER)); pwfltr = (LPWAVEFILTER)GlobalAllocPtr(GHND, cbwfltr); if (NULL == pwfltr) { DPF(0, "!AcmAppChooserFilter() GlobalAllocPtr(%lu) failed!", cbwfltr); return (FALSE); }
//
//
//
if ((NULL != paacd->pwfltr) && (0L == fdwEnum)) { fdwStyle |= ACMFILTERCHOOSE_STYLEF_INITTOFILTERSTRUCT;
_fmemcpy(pwfltr, paacd->pwfltr, (UINT)paacd->pwfltr->cbStruct); }
//
//
//
//
if (0 == (ACMFILTERCHOOSE_STYLEF_SHOWHELP & fdwStyle)) { guMsgHelp = 0; } else { guMsgHelp = RegisterWindowMessage(ACMHELPMSGSTRING); if (0 == guMsgHelp) { fdwStyle &= ~ACMFILTERCHOOSE_STYLEF_SHOWHELP; } else { gpszAcmAppHelp = gszAcmAppHelpFilter; } }
//
// initialize the ACMFILTERCHOOSE members
//
memset(&afc, 0, sizeof(afc));
afc.cbStruct = sizeof(afc); afc.fdwStyle = fdwStyle; afc.hwndOwner = hwnd; afc.pwfltr = pwfltr; afc.cbwfltr = cbwfltr; afc.pszTitle = TEXT("Apply Filter Choice");
afc.szFilterTag[0] = '\0'; afc.szFilter[0] = '\0'; afc.pszName = NULL; afc.cchName = 0;
afc.fdwEnum = fdwEnum; if (0L == (afc.fdwEnum & ACM_FILTERENUMF_DWFILTERTAG)) { afc.pwfltrEnum = NULL; } else { afc.pwfltrEnum = &wfltrEnum; }
if (0L == (afc.fdwStyle & (ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATE | ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATEHANDLE))) { afc.hInstance = NULL; afc.pszTemplateName = NULL; } else { if (0L != (afc.fdwStyle & ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATEHANDLE)) { //
// ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATEHANDLE
//
hrsrc = FindResource(ghinst, DLG_AAFILTERCHOOSE_TEMPLATE, RT_DIALOG);
afc.hInstance = (HINSTANCE)LoadResource(ghinst, hrsrc); afc.pszTemplateName = NULL; } else { afc.hInstance = ghinst; afc.pszTemplateName = DLG_AAFILTERCHOOSE_TEMPLATE; } }
if (0L == (afc.fdwStyle & ACMFILTERCHOOSE_STYLEF_ENABLEHOOK)) { afc.lCustData = 0L; afc.pfnHook = NULL; } else { afc.lCustData = (LPARAM)(UINT)paacd; afc.pfnHook = AcmAppChooserFilterHook; }
//
//
//
mmr = acmFilterChoose(&afc);
if (NULL != hrsrc) { FreeResource((HGLOBAL)afc.hInstance); }
//
//
//
if (0 != guMsgHelp) { WinHelp(hwnd, gszAcmAppHelpFilter, HELP_QUIT, 0L); guMsgHelp = 0; }
if (MMSYSERR_NOERROR != mmr) { if (ACMERR_CANCELED != mmr) { AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION, TEXT("acmFilterChoose() failed with error = %u!"), mmr); } GlobalFreePtr(pwfltr); return (FALSE); }
//
//
//
if (NULL != paacd->pwfltr) { GlobalFreePtr(paacd->pwfltr); }
paacd->pwfltr = pwfltr; lstrcpy(paacd->szFilterTag, afc.szFilterTag); lstrcpy(paacd->szFilter, afc.szFilter);
return (TRUE); } // AcmAppChooserFilter()
//--------------------------------------------------------------------------;
//
// BOOL AcmAppChooserDriverEnumCallback
//
// Description:
//
//
// Arguments:
// HACMDRIVERID hadid:
//
// DWORD dwInstance:
//
// DWORD fdwSupport:
//
// Return (BOOL):
//
//
//--------------------------------------------------------------------------;
BOOL FNEXPORT AcmAppChooserDriverEnumCallback ( HACMDRIVERID hadid, DWORD dwInstance, DWORD fdwSupport ) { MMRESULT mmr; HWND hcb; int n; ACMDRIVERDETAILS add;
//
// skip anything that does not support what we're after (for example,
// this will skip _HARDWARE only drivers that do not support stream
// functionality).
//
if (0 == (fdwSupport & (ACMDRIVERDETAILS_SUPPORTF_CODEC | ACMDRIVERDETAILS_SUPPORTF_CONVERTER | ACMDRIVERDETAILS_SUPPORTF_FILTER))) { return (TRUE); }
//
//
//
hcb = (HWND)(UINT)dwInstance;
add.cbStruct = sizeof(add); mmr = acmDriverDetails(hadid, &add, 0L); if (MMSYSERR_NOERROR != mmr) { lstrcpy(add.szLongName, gszBogus); }
AcmAppDebugLog(add.szLongName); AcmAppDebugLog(TEXT("\r\n")); n = ComboBox_AddString(hcb, add.szLongName); ComboBox_SetItemData(hcb, n, (LPARAM)(UINT)hadid);
//
// return TRUE to continue with enumeration (FALSE will stop the
// enumerator)
//
return (TRUE); } // AcmAppChooserDriverEnumCallback()
//--------------------------------------------------------------------------;
//
// BOOL AcmAppChooserUpdateDisplay
//
// Description:
//
//
// Arguments:
// HWND hwnd:
//
// PAACONVERTDESC paacd:
//
// Return (BOOL):
//
//
//--------------------------------------------------------------------------;
BOOL FNLOCAL AcmAppChooserUpdateDisplay ( HWND hwnd, PAACONVERTDESC paacd ) { HWND hedit; HWND htxt; HWND hcb; HWND hsb; int n; MMRESULT mmr; ACMDRIVERDETAILS add; TCHAR ach[40]; LPWAVEFILTER pwfltr; HACMDRIVERID hadid; BOOL f; DWORD fdwOpen; int nValue; int nMinPos; int nMaxPos; DWORD cbSrc; DWORD cbDst;
//
//
//
htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_FILE_INPUT); SetWindowText(htxt, paacd->szFilePathSrc);
AcmAppGetFormatDescription(paacd->pwfxSrc, paacd->szSrcFormatTag, paacd->szSrcFormat); AppFormatBigNumber(ach, paacd->cbSrcData); AppFormatBigNumber(&ach[20], paacd->cbSrcData / paacd->pwfxSrc->nBlockAlign);
htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_FORMAT_INPUT); AppSetWindowText(htxt, TEXT("%s: %s\r\nAlignment=%u, Data=%s bytes, %s blocks"), (LPTSTR)paacd->szSrcFormatTag, (LPTSTR)paacd->szSrcFormat, paacd->pwfxSrc->nBlockAlign, (LPTSTR)ach, (LPTSTR)&ach[20]); hedit = GetDlgItem(hwnd, IDD_AACHOOSER_EDIT_FILE_OUTPUT); Edit_GetText(hedit, paacd->szFilePathDst, SIZEOF(paacd->szFilePathDst));
//
//
//
nValue = (int)paacd->uBufferTimePerConvert; hsb = GetDlgItem(hwnd, IDD_AACHOOSER_SCROLL_TIME); GetScrollRange(hsb, SB_CTL, &nMinPos, &nMaxPos); if (nValue != GetScrollPos(hsb, SB_CTL)) { SetScrollPos(hsb, SB_CTL, nValue, TRUE);
if (nValue == nMaxPos) { lstrcpy(ach, TEXT("(ALL)")); } else if (nValue == nMinPos) { lstrcpy(ach, TEXT("(Auto)")); } else { wsprintf(ach, TEXT("%u.%.03u"), nValue / 1000, nValue % 1000); }
htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_TIME); SetWindowText(htxt, ach); }
//
//
//
if (nValue == nMaxPos) { cbSrc = paacd->cbSrcData; } else if (nValue == nMinPos) { //
// could do something real here--for now, just do '1/8th of
// a second'..
//
cbSrc = paacd->pwfxSrc->nAvgBytesPerSec; cbSrc = MulDivRN(cbSrc, 175, 1000); } else { cbSrc = paacd->pwfxSrc->nAvgBytesPerSec; cbSrc = MulDivRN(cbSrc, (UINT)nValue, 1000); }
paacd->cbSrcReadSize = cbSrc;
//
//
//
paacd->hadid = NULL;
hcb = GetDlgItem(hwnd, IDD_AACHOOSER_COMBO_DRIVER); n = ComboBox_GetCurSel(hcb); if (LB_ERR != n) { paacd->hadid = (HACMDRIVERID)(UINT)ComboBox_GetItemData(hcb, n); }
//
//
//
//
htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_FORMAT); if (NULL == paacd->pwfxDst) { SetWindowText(htxt, TEXT("(no format selected)")); } else { AppSetWindowText(htxt, TEXT("%s: %s\r\nAlignment=%u"), (LPTSTR)paacd->szDstFormatTag, (LPTSTR)paacd->szDstFormat, paacd->pwfxDst->nBlockAlign); }
//
//
//
//
htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_FILTER); if (NULL == paacd->pwfltr) { SetWindowText(htxt, TEXT("(no filter selected)")); } else { AppSetWindowText(htxt, TEXT("%s: %s"), (LPTSTR)paacd->szFilterTag, (LPTSTR)paacd->szFilter); }
hedit = GetDlgItem(hwnd, IDD_AACHOOSER_EDIT_DETAILS); MEditPrintF(hedit, NULL);
if (NULL == paacd->pwfxDst) { MEditPrintF(hedit, TEXT("hadid=%.04Xh\r\npwfxDst=%.08lXh\r\npwfltr=%.08lXh"), paacd->hadid, paacd->pwfxDst, paacd->pwfltr); return (FALSE); }
//
//
//
if (NULL != paacd->hadid) { mmr = acmDriverOpen(&paacd->had, paacd->hadid, 0L); if (MMSYSERR_NOERROR != mmr) { AcmAppGetErrorString(mmr, ach); MEditPrintF(hedit, TEXT("The selected driver (hadid=%.04Xh) cannot be opened. %s (%u)"), paacd->hadid, (LPSTR)ach, mmr); return (FALSE); } }
SetWindowRedraw(hedit, FALSE);
//
//
//
f = IsDlgButtonChecked(hwnd, IDD_AACHOOSER_CHECK_FILTER); pwfltr = (f ? paacd->pwfltr : (LPWAVEFILTER)NULL);
paacd->fApplyFilter = f;
fdwOpen = 0L; f = IsDlgButtonChecked(hwnd, IDD_AACHOOSER_CHECK_NONREALTIME); if (f) { fdwOpen |= ACM_STREAMOPENF_NONREALTIME; }
f = IsDlgButtonChecked(hwnd, IDD_AACHOOSER_CHECK_ASYNC); if (f) { fdwOpen |= ACM_STREAMOPENF_ASYNC; }
paacd->fdwOpen = fdwOpen;
//
//
//
MEditPrintF(hedit, TEXT("~%12s: "), (LPTSTR)TEXT("Stream Open")); mmr = acmStreamOpen(&paacd->has, paacd->had, paacd->pwfxSrc, paacd->pwfxDst, pwfltr, 0L, 0L, fdwOpen);
if (MMSYSERR_NOERROR == mmr) { TCHAR szSrc[20]; BOOL fSrcAligned; BOOL fDstAligned;
acmDriverID((HACMOBJ)paacd->has, &hadid, 0L);
add.cbStruct = sizeof(add); mmr = acmDriverDetails(hadid, &add, 0L); if (MMSYSERR_NOERROR != mmr) { lstrcpy(add.szLongName, gszBogus); }
MEditPrintF(hedit, TEXT("%s, %s"), (LPTSTR)gszYes, (LPTSTR)add.szLongName);
fSrcAligned = (0 == (cbSrc % paacd->pwfxSrc->nBlockAlign)); AppFormatBigNumber(szSrc, cbSrc);
mmr = acmStreamSize(paacd->has, cbSrc, &cbDst, ACM_STREAMSIZEF_SOURCE); if (MMSYSERR_NOERROR == mmr) { TCHAR szDst[20];
fDstAligned = (0 == (cbDst % paacd->pwfxDst->nBlockAlign)); AppFormatBigNumber(szDst, cbDst);
if (cbSrc < cbDst) { cbDst = MulDivRN(cbDst, 10, cbSrc); cbSrc = 10; } else { cbSrc = MulDivRN(cbSrc, 10, cbDst); cbDst = 10; }
MEditPrintF(hedit, TEXT("%12s: Src=%c%10s, Dst=%c%10s (%lu.%lu:%lu.%lu)"), (LPTSTR)TEXT("Buffer Size"), fSrcAligned ? '*' : ' ', (LPTSTR)szSrc, fDstAligned ? '*' : ' ', (LPTSTR)szDst, cbSrc / 10, cbSrc % 10, cbDst / 10, cbDst % 10); } else { AcmAppGetErrorString(mmr, ach); MEditPrintF(hedit, TEXT("%12s: Src=%c%10s, %s (%u)"), (LPTSTR)TEXT("Buffer Size"), fSrcAligned ? '*' : ' ', (LPTSTR)szSrc, (LPTSTR)ach, mmr); }
acmStreamClose(paacd->has, 0L); paacd->has = NULL; } else { AcmAppGetErrorString(mmr, ach); MEditPrintF(hedit, TEXT("%s, %s (%u)"), (LPTSTR)gszNo, (LPSTR)ach, mmr); }
//
//
//
MEditPrintF(hedit, TEXT("~%12s: "), (LPTSTR)TEXT("(Query)")); mmr = acmStreamOpen(NULL, paacd->had, paacd->pwfxSrc, paacd->pwfxDst, pwfltr, 0L, 0L, fdwOpen | ACM_STREAMOPENF_QUERY);
if (MMSYSERR_NOERROR == mmr) { MEditPrintF(hedit, gszYes); } else { AcmAppGetErrorString(mmr, ach); MEditPrintF(hedit, TEXT("%s, %s (%u)"), (LPTSTR)gszNo, (LPSTR)ach, mmr); }
if (NULL != paacd->had) { acmDriverClose(paacd->had, 0L); paacd->had = NULL; }
SetWindowRedraw(hedit, TRUE);
return (MMSYSERR_NOERROR == mmr); } // AcmAppChooserUpdateDisplay()
//--------------------------------------------------------------------------;
//
// BOOL AcmAppChooserScrollConvertTime
//
// Description:
//
//
// Arguments:
// HWND hwnd:
//
// HWND hsb:
//
// UINT uCode:
//
// int nPos:
//
// Return (BOOL):
//
//
//--------------------------------------------------------------------------;
BOOL FNLOCAL AcmAppChooserScrollConvertTime ( HWND hwnd, HWND hsb, UINT uCode, int nPos ) { PAACONVERTDESC paacd; int nMinPos; int nMaxPos; HWND htxt; TCHAR ach[40];
GetScrollRange(hsb, SB_CTL, &nMinPos, &nMaxPos);
if ((SB_THUMBPOSITION != uCode) && (SB_THUMBTRACK != uCode)) { nPos = GetScrollPos(hsb, SB_CTL); }
//
//
//
switch (uCode) { case SB_PAGEDOWN: if (GetKeyState(VK_CONTROL) < 0) nPos = min(nMaxPos, nPos + 100); else nPos = min(nMaxPos, nPos + 500); break;
case SB_LINEDOWN: if (GetKeyState(VK_CONTROL) < 0) nPos = min(nMaxPos, nPos + 1); else nPos = min(nMaxPos, nPos + 10); break;
case SB_PAGEUP: if (GetKeyState(VK_CONTROL) < 0) nPos = max(nMinPos, nPos - 100); else nPos = max(nMinPos, nPos - 500); break;
case SB_LINEUP: if (GetKeyState(VK_CONTROL) < 0) nPos = max(nMinPos, nPos - 1); else nPos = max(nMinPos, nPos - 10); break;
case SB_TOP: if (GetKeyState(VK_CONTROL) < 0) nPos = nMinPos; else nPos = 1000; break;
case SB_BOTTOM: nPos = nMaxPos; break;
case SB_THUMBPOSITION: case SB_THUMBTRACK: break;
default: return (FALSE); }
//
//
//
paacd = (PAACONVERTDESC)(UINT)GetWindowLong(hwnd, DWL_USER);
paacd->uBufferTimePerConvert = (UINT)nPos;
SetScrollPos(hsb, SB_CTL, nPos, TRUE);
if (nPos == nMaxPos) { lstrcpy(ach, TEXT("(ALL)")); } else if (nPos == nMinPos) { lstrcpy(ach, TEXT("(Auto)")); } else { wsprintf(ach, TEXT("%u.%.03u"), nPos / 1000, nPos % 1000); }
htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_TIME); SetWindowText(htxt, ach);
//
//
//
return (TRUE); } // AcmAppChooserScrollConvertTime()
//--------------------------------------------------------------------------;
//
// BOOL AcmAppDlgProcChooser
//
// Description:
//
//
// Arguments:
// HWND hwnd: Handle to window.
//
// UINT uMsg: Message being sent to the window.
//
// WPARAM wParam: Specific argument to message.
//
// LPARAM lParam: Specific argument to message.
//
// Return (BOOL):
// The return value is specific to the message that was received. For
// the most part, it is FALSE if this dialog procedure does not handle
// a message.
//
//--------------------------------------------------------------------------;
BOOL FNEXPORT AcmAppDlgProcChooser ( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { PAACONVERTDESC paacd; HWND hedit; HWND htxt; HWND hcb; HWND hsb; HFONT hfont; UINT uId; UINT uCmd; BOOL f;
//
//
//
if ((0 != guMsgHelp) && (uMsg == guMsgHelp)) { WinHelp(hwnd, gpszAcmAppHelp, HELP_CONTENTS, 0L); return (TRUE); }
paacd = (PAACONVERTDESC)(UINT)GetWindowLong(hwnd, DWL_USER);
//
//
//
switch (uMsg) { case WM_INITDIALOG: paacd = (PAACONVERTDESC)(UINT)lParam;
SetWindowLong(hwnd, DWL_USER, lParam);
if (NULL == paacd->pwfxSrc) { AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION, TEXT("You must select a source file to convert.")); EndDialog(hwnd, FALSE); return (TRUE); }
if (NULL == paacd->pwfxDst) { AcmAppChooserFormatSuggest(hwnd, paacd); }
hfont = GetStockFont(ANSI_VAR_FONT);
htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_FILE_INPUT); SetWindowFont(htxt, hfont, FALSE);
htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_FORMAT_INPUT); SetWindowFont(htxt, hfont, FALSE); hedit = GetDlgItem(hwnd, IDD_AACHOOSER_EDIT_FILE_OUTPUT); SetWindowFont(hedit, hfont, FALSE); Edit_SetText(hedit, paacd->szFilePathDst);
hcb = GetDlgItem(hwnd, IDD_AACHOOSER_COMBO_DRIVER); SetWindowFont(hcb, hfont, FALSE);
htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_FORMAT); SetWindowFont(htxt, hfont, FALSE);
htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_FILTER); SetWindowFont(htxt, hfont, FALSE);
hfont = ghfontApp;
htxt = GetDlgItem(hwnd, IDD_AACHOOSER_TXT_TIME); SetWindowFont(htxt, hfont, FALSE);
hedit = GetDlgItem(hwnd, IDD_AACHOOSER_EDIT_DETAILS); SetWindowFont(hedit, hfont, FALSE);
hsb = GetDlgItem(hwnd, IDD_AACHOOSER_SCROLL_TIME); SetScrollRange(hsb, SB_CTL, 0, 10000, FALSE);
//
//
//
CheckDlgButton(hwnd, IDD_AACHOOSER_CHECK_NONREALTIME, TRUE);
SendMessage(hwnd, WM_ACMAPP_ACM_NOTIFY, 0, 0L); return (TRUE);
case WM_ACMAPP_ACM_NOTIFY: AppHourGlass(TRUE); hcb = GetDlgItem(hwnd, IDD_AACHOOSER_COMBO_DRIVER);
SetWindowRedraw(hcb, FALSE); ComboBox_ResetContent(hcb);
ComboBox_AddString(hcb, TEXT("[ACM Driver Mapper]"));
AcmAppDebugLog(NULL); acmDriverEnum(AcmAppChooserDriverEnumCallback, (DWORD)(UINT)hcb, 0L);
ComboBox_SetCurSel(hcb, 0); SetWindowRedraw(hcb, TRUE);
f = AcmAppChooserUpdateDisplay(hwnd, paacd); EnableWindow(GetDlgItem(hwnd, IDOK), f); EnableWindow(GetDlgItem(hwnd, IDD_AACHOOSER_BTN_PROPERTIES), f);
AppHourGlass(FALSE); break;
case WM_HSCROLL: f = (BOOL)HANDLE_WM_HSCROLL(hwnd, wParam, lParam, AcmAppChooserScrollConvertTime); f = TRUE; if (f) { AppHourGlass(TRUE);
f = AcmAppChooserUpdateDisplay(hwnd, paacd); EnableWindow(GetDlgItem(hwnd, IDOK), f); EnableWindow(GetDlgItem(hwnd, IDD_AACHOOSER_BTN_PROPERTIES), f);
AppHourGlass(FALSE); } return (TRUE);
case WM_COMMAND: uId = GET_WM_COMMAND_ID(wParam, lParam); f = FALSE;
switch (uId) { case IDD_AACHOOSER_BTN_BROWSE: f = AcmAppChooserSaveFile(hwnd, paacd); break;
case IDD_AACHOOSER_BTN_PROPERTIES: f = AcmAppChooserProperties(hwnd, paacd); break;
case IDD_AACHOOSER_BTN_FORMAT_OPTIONS: case IDD_AACHOOSER_BTN_FORMAT: f = (IDD_AACHOOSER_BTN_FORMAT_OPTIONS == uId); f = AcmAppChooserFormat(hwnd, paacd, f); break;
case IDD_AACHOOSER_BTN_FILTER_OPTIONS: case IDD_AACHOOSER_BTN_FILTER: f = (IDD_AACHOOSER_BTN_FILTER_OPTIONS == uId); f = AcmAppChooserFilter(hwnd, paacd, f); break;
case IDD_AACHOOSER_COMBO_DRIVER: uCmd = GET_WM_COMMAND_CMD(wParam, lParam); switch (uCmd) { case CBN_SELCHANGE: f = TRUE; break; } break;
case IDD_AACHOOSER_CHECK_FILTER: case IDD_AACHOOSER_CHECK_NONREALTIME: case IDD_AACHOOSER_CHECK_ASYNC: f = TRUE; break;
case IDOK: hedit = GetDlgItem(hwnd, IDD_AACHOOSER_EDIT_FILE_OUTPUT); Edit_GetText(hedit, paacd->szFilePathDst, SIZEOF(paacd->szFilePathDst)); case IDCANCEL: EndDialog(hwnd, (IDOK == uId)); break; }
//
//
//
if (f) { AppHourGlass(TRUE);
f = AcmAppChooserUpdateDisplay(hwnd, paacd); EnableWindow(GetDlgItem(hwnd, IDOK), f); EnableWindow(GetDlgItem(hwnd, IDD_AACHOOSER_BTN_PROPERTIES), f);
AppHourGlass(FALSE); } break; }
return (FALSE); } // AcmAppDlgProcChooser()
|