Initial commit: ROW Client source code
Game client codebase including: - CharacterActionControl: Character and creature management - GlobalScript: Network, items, skills, quests, utilities - RYLClient: Main client application with GUI and event handlers - Engine: 3D rendering engine (RYLGL) - MemoryManager: Custom memory allocation - Library: Third-party dependencies (DirectX, boost, etc.) - Tools: Development utilities 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,841 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// File: DMOEnumDlg.cpp
|
||||
//
|
||||
// Desc: DirectShow sample code - implementation of dialog for device
|
||||
// enumeration.
|
||||
//
|
||||
// Copyright (c) 2000-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "DMOEnum.h"
|
||||
#include "DMOEnumDlg.h"
|
||||
|
||||
#include "mfcdmoutil.h"
|
||||
#include "namedguid.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// CAboutDlg dialog used for App About
|
||||
|
||||
class CAboutDlg : public CDialog
|
||||
{
|
||||
public:
|
||||
CAboutDlg();
|
||||
|
||||
// Dialog Data
|
||||
//{{AFX_DATA(CAboutDlg)
|
||||
enum { IDD = IDD_ABOUTBOX };
|
||||
//}}AFX_DATA
|
||||
|
||||
// ClassWizard generated virtual function overrides
|
||||
//{{AFX_VIRTUAL(CAboutDlg)
|
||||
protected:
|
||||
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
||||
//}}AFX_VIRTUAL
|
||||
|
||||
// Implementation
|
||||
protected:
|
||||
//{{AFX_MSG(CAboutDlg)
|
||||
//}}AFX_MSG
|
||||
DECLARE_MESSAGE_MAP()
|
||||
};
|
||||
|
||||
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
|
||||
{
|
||||
//{{AFX_DATA_INIT(CAboutDlg)
|
||||
//}}AFX_DATA_INIT
|
||||
}
|
||||
|
||||
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
|
||||
{
|
||||
CDialog::DoDataExchange(pDX);
|
||||
//{{AFX_DATA_MAP(CAboutDlg)
|
||||
//}}AFX_DATA_MAP
|
||||
}
|
||||
|
||||
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
|
||||
//{{AFX_MSG_MAP(CAboutDlg)
|
||||
// No message handlers
|
||||
//}}AFX_MSG_MAP
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// CDMOEnumDlg dialog
|
||||
|
||||
CDMOEnumDlg::CDMOEnumDlg(CWnd* pParent /*=NULL*/)
|
||||
: CDialog(CDMOEnumDlg::IDD, pParent)
|
||||
{
|
||||
//{{AFX_DATA_INIT(CDMOEnumDlg)
|
||||
//}}AFX_DATA_INIT
|
||||
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
|
||||
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
|
||||
}
|
||||
|
||||
void CDMOEnumDlg::DoDataExchange(CDataExchange* pDX)
|
||||
{
|
||||
CDialog::DoDataExchange(pDX);
|
||||
//{{AFX_DATA_MAP(CDMOEnumDlg)
|
||||
DDX_Control(pDX, IDC_STATIC_OUT_TYPE, m_StrOutType);
|
||||
DDX_Control(pDX, IDC_STATIC_OUT_SUBYTPE, m_StrOutSubtype);
|
||||
DDX_Control(pDX, IDC_STATIC_IN_TYPE, m_StrInType);
|
||||
DDX_Control(pDX, IDC_STATIC_IN_SUBTYPE, m_StrInSubtype);
|
||||
DDX_Control(pDX, IDC_CHECK_OUT_SUPPORTS_QC, m_CheckOutQC);
|
||||
DDX_Control(pDX, IDC_CHECK_IN_SUPPORTS_QC, m_CheckInQC);
|
||||
DDX_Control(pDX, IDC_STATIC_IN_FORMAT, m_StrInFormat);
|
||||
DDX_Control(pDX, IDC_STATIC_OUT_FORMAT, m_StrOutFormat);
|
||||
DDX_Control(pDX, IDC_CHECK_OUT_FIXED, m_CheckOutFixedSize);
|
||||
DDX_Control(pDX, IDC_CHECK_OUT_WHOLE_SAMPLES, m_CheckOutWholeSamples);
|
||||
DDX_Control(pDX, IDC_CHECK_OUT_OPTIONAL, m_CheckOutOptional);
|
||||
DDX_Control(pDX, IDC_CHECK_OUT_ONESAMPLE, m_CheckOutOneSample);
|
||||
DDX_Control(pDX, IDC_CHECK_OUT_DISCARDABLE, m_CheckOutDiscardable);
|
||||
DDX_Control(pDX, IDC_CHECK_IN_WHOLE_SAMPLES, m_CheckInWholeSamples);
|
||||
DDX_Control(pDX, IDC_CHECK_IN_ONESAMPLE, m_CheckInOneSample);
|
||||
DDX_Control(pDX, IDC_CHECK_IN_HOLDSBUFFERS, m_CheckInHoldsBuffers);
|
||||
DDX_Control(pDX, IDC_CHECK_IN_FIXED, m_CheckInFixedSize);
|
||||
DDX_Control(pDX, IDC_STATIC_OUTPUT_STREAMS, m_nOutputStreams);
|
||||
DDX_Control(pDX, IDC_STATIC_INPUT_STREAMS, m_nInputStreams);
|
||||
DDX_Control(pDX, IDC_LIST_OUTPUT_STREAMS, m_ListOutputStreams);
|
||||
DDX_Control(pDX, IDC_LIST_INPUT_STREAMS, m_ListInputStreams);
|
||||
DDX_Control(pDX, IDC_STATIC_NUM_OTYPES, m_nOutputTypes);
|
||||
DDX_Control(pDX, IDC_STATIC_NUM_ITYPES, m_nInputTypes);
|
||||
DDX_Control(pDX, IDC_LIST_OUTPUT_TYPES, m_ListOutputTypes);
|
||||
DDX_Control(pDX, IDC_LIST_INPUT_TYPES, m_ListInputTypes);
|
||||
DDX_Control(pDX, IDC_CHECK_KEYED, m_bCheckKeyed);
|
||||
DDX_Control(pDX, IDC_STATIC_FILENAME, m_StrFilename);
|
||||
DDX_Control(pDX, IDC_STATIC_FILTERS, m_StrFilters);
|
||||
DDX_Control(pDX, IDC_STATIC_CLASSES, m_StrClasses);
|
||||
DDX_Control(pDX, IDC_LIST_FILTERS, m_FilterList);
|
||||
DDX_Control(pDX, IDC_LIST_DEVICES, m_DeviceList);
|
||||
//}}AFX_DATA_MAP
|
||||
}
|
||||
|
||||
BEGIN_MESSAGE_MAP(CDMOEnumDlg, CDialog)
|
||||
//{{AFX_MSG_MAP(CDMOEnumDlg)
|
||||
ON_WM_SYSCOMMAND()
|
||||
ON_WM_PAINT()
|
||||
ON_WM_QUERYDRAGICON()
|
||||
ON_LBN_SELCHANGE(IDC_LIST_DEVICES, OnSelchangeListDevices)
|
||||
ON_WM_CLOSE()
|
||||
ON_LBN_SELCHANGE(IDC_LIST_FILTERS, OnSelchangeListFilters)
|
||||
ON_BN_CLICKED(IDC_CHECK_KEYED, OnCheckKeyed)
|
||||
ON_LBN_SELCHANGE(IDC_LIST_INPUT_STREAMS, OnSelchangeListInputStreams)
|
||||
ON_LBN_SELCHANGE(IDC_LIST_OUTPUT_STREAMS, OnSelchangeListOutputStreams)
|
||||
//}}AFX_MSG_MAP
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// CDMOEnumDlg message handlers
|
||||
|
||||
void CDMOEnumDlg::OnSysCommand(UINT nID, LPARAM lParam)
|
||||
{
|
||||
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
|
||||
{
|
||||
CAboutDlg dlgAbout;
|
||||
dlgAbout.DoModal();
|
||||
}
|
||||
else
|
||||
{
|
||||
CDialog::OnSysCommand(nID, lParam);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// If you add a minimize button to your dialog, you will need the code below
|
||||
// to draw the icon. For MFC applications using the document/view model,
|
||||
// this is automatically done for you by the framework.
|
||||
|
||||
void CDMOEnumDlg::OnPaint()
|
||||
{
|
||||
if (IsIconic())
|
||||
{
|
||||
CPaintDC dc(this); // device context for painting
|
||||
|
||||
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
|
||||
|
||||
// Center icon in client rectangle
|
||||
int cxIcon = GetSystemMetrics(SM_CXICON);
|
||||
int cyIcon = GetSystemMetrics(SM_CYICON);
|
||||
CRect rect;
|
||||
GetClientRect(&rect);
|
||||
int x = (rect.Width() - cxIcon + 1) / 2;
|
||||
int y = (rect.Height() - cyIcon + 1) / 2;
|
||||
|
||||
// Draw the icon
|
||||
dc.DrawIcon(x, y, m_hIcon);
|
||||
}
|
||||
else
|
||||
{
|
||||
CDialog::OnPaint();
|
||||
}
|
||||
}
|
||||
|
||||
// The system calls this to obtain the cursor to display while the user drags
|
||||
// the minimized window.
|
||||
HCURSOR CDMOEnumDlg::OnQueryDragIcon()
|
||||
{
|
||||
return (HCURSOR) m_hIcon;
|
||||
}
|
||||
|
||||
|
||||
BOOL CDMOEnumDlg::OnInitDialog()
|
||||
{
|
||||
CDialog::OnInitDialog();
|
||||
|
||||
// Add "About..." menu item to system menu.
|
||||
|
||||
// IDM_ABOUTBOX must be in the system command range.
|
||||
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
|
||||
ASSERT(IDM_ABOUTBOX < 0xF000);
|
||||
|
||||
CMenu* pSysMenu = GetSystemMenu(FALSE);
|
||||
if (pSysMenu != NULL)
|
||||
{
|
||||
CString strAboutMenu;
|
||||
strAboutMenu.LoadString(IDS_ABOUTBOX);
|
||||
if (!strAboutMenu.IsEmpty())
|
||||
{
|
||||
pSysMenu->AppendMenu(MF_SEPARATOR);
|
||||
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
|
||||
}
|
||||
}
|
||||
|
||||
// Set the icon for this dialog. The framework does this automatically
|
||||
// when the application's main window is not a dialog
|
||||
SetIcon(m_hIcon, TRUE); // Set big icon
|
||||
SetIcon(m_hIcon, FALSE); // Set small icon
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DirectShow-specific initialization code
|
||||
|
||||
CoInitialize(NULL);
|
||||
m_pDMO=0;
|
||||
m_pGB=0;
|
||||
|
||||
// Include keyed DMOs in our search by default
|
||||
m_bCheckKeyed.SetCheck(TRUE);
|
||||
|
||||
// Enumerate and display the DMO category list
|
||||
FillCategoryList();
|
||||
|
||||
return TRUE; // return TRUE unless you set the focus to a control
|
||||
}
|
||||
|
||||
|
||||
void CDMOEnumDlg::FillCategoryList(void)
|
||||
{
|
||||
// Clear listboxes
|
||||
ClearDeviceList();
|
||||
ClearFilterList();
|
||||
|
||||
// Fill the category list box with the categories to display,
|
||||
// using the names stored in the DMO_CATEGORY_INFO array.
|
||||
// See DMOEnumDlg.H for a category description.
|
||||
for (int i=0; i < NUM_CATEGORIES; i++)
|
||||
m_DeviceList.AddString(dmo_categories[i].szName);
|
||||
|
||||
// Update listbox title with number of classes
|
||||
SetNumClasses(NUM_CATEGORIES);
|
||||
|
||||
// Select the first category to show useful information
|
||||
m_DeviceList.SetCurSel(0);
|
||||
OnSelchangeListDevices();
|
||||
}
|
||||
|
||||
void CDMOEnumDlg::SetNumClasses(int nClasses)
|
||||
{
|
||||
TCHAR szClasses[64];
|
||||
|
||||
wsprintf(szClasses, TEXT("%s (%d found)\0"), STR_CLASSES, nClasses);
|
||||
m_StrClasses.SetWindowText(szClasses);
|
||||
}
|
||||
|
||||
void CDMOEnumDlg::SetNumFilters(int nFilters)
|
||||
{
|
||||
TCHAR szFilters[64];
|
||||
|
||||
if (nFilters)
|
||||
wsprintf(szFilters, TEXT("%s (%d found)\0"), STR_FILTERS, nFilters);
|
||||
else
|
||||
wsprintf(szFilters, TEXT("%s\0"), STR_FILTERS);
|
||||
|
||||
m_StrFilters.SetWindowText(szFilters);
|
||||
}
|
||||
|
||||
void CDMOEnumDlg::OnCheckKeyed()
|
||||
{
|
||||
// Reenumerate the related filters, since the list may
|
||||
// have changed to add or removed keyed filters.
|
||||
OnSelchangeListDevices();
|
||||
}
|
||||
|
||||
void CDMOEnumDlg::ClearDeviceList(void)
|
||||
{
|
||||
// Clean up
|
||||
m_DeviceList.ResetContent();
|
||||
SetNumClasses(0);
|
||||
}
|
||||
|
||||
void CDMOEnumDlg::ClearFilterList(void)
|
||||
{
|
||||
CLSID *pStoredId = NULL;
|
||||
|
||||
int nCount = m_FilterList.GetCount();
|
||||
|
||||
// Delete any CLSID pointers that were stored in the listbox item data
|
||||
for (int i=0; i < nCount; i++)
|
||||
{
|
||||
pStoredId = (CLSID *) m_FilterList.GetItemDataPtr(i);
|
||||
if (pStoredId != 0)
|
||||
{
|
||||
delete pStoredId;
|
||||
pStoredId = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// Clean up
|
||||
m_FilterList.ResetContent();
|
||||
SetNumFilters(0);
|
||||
m_StrFilename.SetWindowText(TEXT("<No DMO selected>"));
|
||||
}
|
||||
|
||||
void CDMOEnumDlg::ClearTypeLists(void)
|
||||
{
|
||||
// Clear the type boxes
|
||||
m_ListInputTypes.ResetContent();
|
||||
m_ListOutputTypes.ResetContent();
|
||||
|
||||
m_nInputTypes.SetWindowText(TEXT("0\0"));
|
||||
m_nOutputTypes.SetWindowText(TEXT("0\0"));
|
||||
}
|
||||
|
||||
void CDMOEnumDlg::OnClose()
|
||||
{
|
||||
// Free any stored CLSID pointers (in listbox item data ptr area)
|
||||
ReleaseDMO();
|
||||
ClearFilterList();
|
||||
ClearDeviceList();
|
||||
|
||||
CoUninitialize();
|
||||
CDialog::OnClose();
|
||||
}
|
||||
|
||||
void CDMOEnumDlg::ReleaseDMO(void)
|
||||
{
|
||||
SAFE_RELEASE(m_pDMO);
|
||||
SAFE_RELEASE(m_pGB);
|
||||
|
||||
// Clear any information set on the dialog for the last DMO
|
||||
ClearDMOInfo();
|
||||
}
|
||||
|
||||
void CDMOEnumDlg::ClearDMOInfo()
|
||||
{
|
||||
// Clear DMO-specific information
|
||||
m_ListInputStreams.ResetContent();
|
||||
m_ListOutputStreams.ResetContent();
|
||||
m_nInputStreams.SetWindowText(TEXT("In Streams: 0\0"));
|
||||
m_nOutputStreams.SetWindowText(TEXT("Out Streams: 0\0"));
|
||||
|
||||
// Input settings
|
||||
m_CheckInWholeSamples.SetCheck(FALSE);
|
||||
m_CheckInOneSample.SetCheck(FALSE);
|
||||
m_CheckInFixedSize.SetCheck(FALSE);
|
||||
m_CheckInHoldsBuffers.SetCheck(FALSE);
|
||||
m_StrInFormat.SetWindowText(STR_UNKNOWN);
|
||||
m_StrInType.SetWindowText(STR_UNKNOWN);
|
||||
m_StrInSubtype.SetWindowText(STR_UNKNOWN);
|
||||
m_CheckInQC.SetCheck(FALSE);
|
||||
|
||||
// Output settings
|
||||
m_CheckOutWholeSamples.SetCheck(FALSE);
|
||||
m_CheckOutOneSample.SetCheck(FALSE);
|
||||
m_CheckOutFixedSize.SetCheck(FALSE);
|
||||
m_CheckOutDiscardable.SetCheck(FALSE);
|
||||
m_CheckOutOptional.SetCheck(FALSE);
|
||||
m_StrOutFormat.SetWindowText(STR_UNKNOWN);
|
||||
m_StrOutType.SetWindowText(STR_UNKNOWN);
|
||||
m_StrOutSubtype.SetWindowText(STR_UNKNOWN);
|
||||
m_CheckOutQC.SetCheck(FALSE);
|
||||
}
|
||||
|
||||
|
||||
void CDMOEnumDlg::OnSelchangeListFilters()
|
||||
{
|
||||
const CLSID *clsid;
|
||||
|
||||
// Get the currently selected category name
|
||||
int nItem = m_FilterList.GetCurSel();
|
||||
|
||||
// Read the CLSID pointer from the list box's item data
|
||||
clsid = (CLSID *) m_FilterList.GetItemDataPtr(nItem);
|
||||
|
||||
// Find the filter filename in the registry (by CLSID)
|
||||
if (clsid != 0)
|
||||
{
|
||||
// Display the DMO's server filename
|
||||
ShowFilenameByCLSID(*clsid);
|
||||
|
||||
// Show media types/subtypes used by this DMO
|
||||
AddTypeInfo(clsid);
|
||||
|
||||
// Display DMO-specific information
|
||||
ReleaseDMO();
|
||||
ShowSelectedDMOInfo(clsid);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CDMOEnumDlg::OnSelchangeListDevices()
|
||||
{
|
||||
HRESULT hr;
|
||||
IEnumDMO *pEnum = NULL;
|
||||
DWORD dwFlags = m_bCheckKeyed.GetCheck() ? DMO_ENUMF_INCLUDE_KEYED : 0;
|
||||
|
||||
// Get the currently selected category name
|
||||
int nItem = m_DeviceList.GetCurSel();
|
||||
const GUID *clsid;
|
||||
|
||||
// Read the CLSID pointer from our hard-coded array of
|
||||
// documented filter categories
|
||||
clsid = dmo_categories[nItem].pclsid;
|
||||
|
||||
ClearTypeLists();
|
||||
ReleaseDMO();
|
||||
|
||||
// Enumerate all DMOs of the selected category
|
||||
hr = DMOEnum(*clsid, dwFlags, 0, NULL, 0, NULL, &pEnum);
|
||||
if (FAILED(hr))
|
||||
return;
|
||||
|
||||
// Enumerate all filters using the new category enumerator
|
||||
hr = EnumDMOs(pEnum);
|
||||
|
||||
// Now that the DMOs (if any) are enumerated and added
|
||||
// to the list, go ahead and select the first one.
|
||||
m_FilterList.SetCurSel(0);
|
||||
OnSelchangeListFilters();
|
||||
|
||||
SAFE_RELEASE(pEnum);
|
||||
}
|
||||
|
||||
|
||||
void CDMOEnumDlg::AddFilter(
|
||||
const TCHAR *szFilterName,
|
||||
const GUID *pCatGuid)
|
||||
{
|
||||
// Allocate a new CLSID, whose pointer will be stored in
|
||||
// the listbox. When the listbox is cleared, these will be deleted.
|
||||
CLSID *pclsid = new CLSID;
|
||||
|
||||
// Add the category name and a pointer to its CLSID to the list box
|
||||
int nSuccess = m_FilterList.AddString(szFilterName);
|
||||
int nIndexNew = m_FilterList.FindStringExact(-1, szFilterName);
|
||||
|
||||
if (pclsid)
|
||||
{
|
||||
*pclsid = *pCatGuid;
|
||||
nSuccess = m_FilterList.SetItemDataPtr(nIndexNew, pclsid);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
HRESULT CDMOEnumDlg::EnumDMOs(IEnumDMO *pEnumCat)
|
||||
{
|
||||
HRESULT hr=S_OK;
|
||||
ULONG cFetched;
|
||||
int nFilters=0;
|
||||
WCHAR *wszName;
|
||||
CLSID clsid;
|
||||
|
||||
// Clear the current filter list
|
||||
ClearFilterList();
|
||||
|
||||
// If there are no filters of a requested type, show default string
|
||||
if (!pEnumCat)
|
||||
{
|
||||
m_FilterList.AddString(TEXT("<< No entries >>"));
|
||||
SetNumFilters(nFilters);
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
// Enumerate all items associated with the moniker
|
||||
while(pEnumCat->Next(1, &clsid, &wszName, &cFetched) == S_OK)
|
||||
{
|
||||
nFilters++;
|
||||
CString str(wszName);
|
||||
|
||||
// Add this DMO's name and CLSID to the listbox
|
||||
AddFilter(str, &clsid);
|
||||
CoTaskMemFree(wszName);
|
||||
}
|
||||
|
||||
// If no DMOs matched the query, show a default item
|
||||
if (nFilters == 0)
|
||||
m_FilterList.AddString(TEXT("<< No entries >>"));
|
||||
|
||||
// Update count of enumerated filters
|
||||
SetNumFilters(nFilters);
|
||||
return hr;
|
||||
}
|
||||
|
||||
|
||||
void CDMOEnumDlg::GetTypeSubtypeString(TCHAR *szCLSID, DMO_PARTIAL_MEDIATYPE& aList)
|
||||
{
|
||||
HRESULT hr;
|
||||
CString strType, strSubtype;
|
||||
int j;
|
||||
|
||||
LPOLESTR szType, szSubtype;
|
||||
|
||||
// Convert binary CLSIDs to readable versions
|
||||
hr = StringFromCLSID(aList.type, &szType);
|
||||
if(FAILED(hr))
|
||||
return;
|
||||
hr = StringFromCLSID(aList.subtype, &szSubtype);
|
||||
if(FAILED(hr))
|
||||
return;
|
||||
|
||||
// Set default type/subtype strings to their actual GUID values
|
||||
strType = szType;
|
||||
strSubtype = szSubtype;
|
||||
|
||||
// Find type GUID's name in the named guids table
|
||||
j=0;
|
||||
while (rgng[j].pguid != 0)
|
||||
{
|
||||
if(aList.type == *(rgng[j].pguid))
|
||||
{
|
||||
strType = rgng[j].psz; // Save type name
|
||||
break;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
|
||||
// Find subtype GUID's name in the named guids table
|
||||
j=0;
|
||||
while (rgng[j].pguid != 0)
|
||||
{
|
||||
if(aList.subtype == *(rgng[j].pguid))
|
||||
{
|
||||
strSubtype = rgng[j].psz; // Save subtype name
|
||||
break;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
|
||||
// Build a string with the type/subtype information.
|
||||
// If a friendly name was found, it will be used.
|
||||
// Otherwise, the type/subtype's raw GUID will be displayed.
|
||||
wsprintf(szCLSID, TEXT("%s\t%s"), strType, strSubtype);
|
||||
}
|
||||
|
||||
|
||||
void CDMOEnumDlg::AddTypeInfo(const GUID *pCLSID)
|
||||
{
|
||||
const int NUM_PAIRS=20;
|
||||
HRESULT hr;
|
||||
DMO_PARTIAL_MEDIATYPE aInputTypes[NUM_PAIRS]={0},
|
||||
aOutputTypes[NUM_PAIRS]={0};
|
||||
ULONG ulNumInputsSupplied, ulNumOutputsSupplied;
|
||||
ULONG ulNumInputTypes=NUM_PAIRS, ulNumOutputTypes=NUM_PAIRS, i;
|
||||
TCHAR szCLSID[128];
|
||||
|
||||
// Clear the type/subtype GUID boxes
|
||||
ClearTypeLists();
|
||||
|
||||
// Read type/subtype information
|
||||
hr = DMOGetTypes(
|
||||
*pCLSID,
|
||||
ulNumInputTypes,
|
||||
&ulNumInputsSupplied,
|
||||
aInputTypes,
|
||||
ulNumOutputTypes,
|
||||
&ulNumOutputsSupplied,
|
||||
aOutputTypes);
|
||||
|
||||
if (FAILED(hr))
|
||||
return;
|
||||
|
||||
// Display the number of input/output type/subtype pairs found
|
||||
TCHAR szNum[10];
|
||||
wsprintf(szNum, TEXT("%d"), ulNumInputsSupplied);
|
||||
m_nInputTypes.SetWindowText(szNum);
|
||||
wsprintf(szNum, TEXT("%d"), ulNumOutputsSupplied);
|
||||
m_nOutputTypes.SetWindowText(szNum);
|
||||
|
||||
// Show input type/subtype pairs
|
||||
for (i=0; i<ulNumInputsSupplied; i++)
|
||||
{
|
||||
GetTypeSubtypeString(szCLSID, aInputTypes[i]);
|
||||
m_ListInputTypes.AddString(szCLSID);
|
||||
}
|
||||
|
||||
// Show output type/subtype pairs
|
||||
for (i=0; i<ulNumOutputsSupplied; i++)
|
||||
{
|
||||
GetTypeSubtypeString(szCLSID, aOutputTypes[i]);
|
||||
m_ListOutputTypes.AddString(szCLSID);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CDMOEnumDlg::ShowFilenameByCLSID(REFCLSID clsid)
|
||||
{
|
||||
HRESULT hr;
|
||||
LPOLESTR strCLSID;
|
||||
|
||||
// Convert binary CLSID to a readable version
|
||||
hr = StringFromCLSID(clsid, &strCLSID);
|
||||
if(SUCCEEDED(hr))
|
||||
{
|
||||
TCHAR szKey[512];
|
||||
CString strQuery(strCLSID);
|
||||
|
||||
// Create key name for reading filename registry
|
||||
wsprintf(szKey, TEXT("Software\\Classes\\CLSID\\%s\\InprocServer32\0"),
|
||||
strQuery);
|
||||
|
||||
// Free memory associated with strCLSID (allocated in StringFromCLSID)
|
||||
CoTaskMemFree(strCLSID);
|
||||
|
||||
HKEY hkeyFilter=0;
|
||||
int rc=0;
|
||||
|
||||
// Open the CLSID key that contains information about the filter
|
||||
rc = RegOpenKey(HKEY_LOCAL_MACHINE, szKey, &hkeyFilter);
|
||||
if (rc == ERROR_SUCCESS)
|
||||
{
|
||||
DWORD dwSize=MAX_PATH;
|
||||
BYTE pbFilename[MAX_PATH];
|
||||
|
||||
rc = RegQueryValueEx(hkeyFilter, NULL, // Read (Default) value
|
||||
NULL, NULL, pbFilename, &dwSize);
|
||||
|
||||
if (rc == ERROR_SUCCESS)
|
||||
{
|
||||
TCHAR szFilename[MAX_PATH];
|
||||
wsprintf(szFilename, TEXT("%s\0"), pbFilename);
|
||||
m_StrFilename.SetWindowText(szFilename);
|
||||
}
|
||||
else
|
||||
m_StrFilename.SetWindowText(TEXT("<Unknown>\0"));
|
||||
|
||||
rc = RegCloseKey(hkeyFilter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CDMOEnumDlg::GetFormatString(TCHAR *szFormat, DMO_MEDIA_TYPE *pType)
|
||||
{
|
||||
int i=0;
|
||||
|
||||
// Find format GUID's name in the named guids table
|
||||
while (rgng[i].pguid != 0)
|
||||
{
|
||||
if(pType->formattype == *(rgng[i].pguid))
|
||||
{
|
||||
wsprintf(szFormat, TEXT("%s\0"), rgng[i].psz);
|
||||
return;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
// If we got here, there was no match
|
||||
wsprintf(szFormat, TEXT("Format_None\0"));
|
||||
}
|
||||
|
||||
void CDMOEnumDlg::GetGUIDString(TCHAR *szString, GUID *pGUID)
|
||||
{
|
||||
int i=0;
|
||||
|
||||
// Find GUID's name in the named guids table
|
||||
while (rgng[i].pguid != 0)
|
||||
{
|
||||
if(*pGUID == *(rgng[i].pguid))
|
||||
{
|
||||
wsprintf(szString, TEXT("%s\0"), rgng[i].psz);
|
||||
return;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
// If we got here, there was no match
|
||||
wsprintf(szString, TEXT("GUID_NULL\0"));
|
||||
}
|
||||
|
||||
|
||||
void CDMOEnumDlg::ShowSelectedDMOInfo(const GUID *pCLSID)
|
||||
{
|
||||
HRESULT hr;
|
||||
TCHAR sz[64];
|
||||
|
||||
// Create an instance of the selected DMO
|
||||
hr = CoCreateInstance(*pCLSID, NULL,
|
||||
CLSCTX_INPROC, IID_IMediaObject,
|
||||
(void **)&m_pDMO);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
MessageBeep(0);
|
||||
return;
|
||||
}
|
||||
|
||||
// Read and display information about its input/output streams
|
||||
DWORD dwInStream=0, dwOutStream=0, dwCount;
|
||||
|
||||
hr = m_pDMO->GetStreamCount(&dwInStream, &dwOutStream);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
MessageBeep(0);
|
||||
return;
|
||||
}
|
||||
|
||||
// Display the number of streams used by this DMO
|
||||
wsprintf(sz, TEXT("In Streams: %d"), dwInStream);
|
||||
m_nInputStreams.SetWindowText(sz);
|
||||
wsprintf(sz, TEXT("Out Streams: %d"), dwOutStream);
|
||||
m_nOutputStreams.SetWindowText(sz);
|
||||
|
||||
// Fill stream list boxes
|
||||
for (dwCount=0; dwCount < dwInStream; dwCount++)
|
||||
{
|
||||
wsprintf(sz, TEXT("In %d"), dwCount);
|
||||
m_ListInputStreams.AddString(sz);
|
||||
}
|
||||
for (dwCount=0; dwCount < dwOutStream; dwCount++)
|
||||
{
|
||||
wsprintf(sz, TEXT("Out %d"), dwCount);
|
||||
m_ListOutputStreams.AddString(sz);
|
||||
}
|
||||
|
||||
// Select the first item in each list, if it exists
|
||||
if (dwInStream > 0)
|
||||
{
|
||||
m_ListInputStreams.SetCurSel(0);
|
||||
OnSelchangeListInputStreams();
|
||||
}
|
||||
if (dwOutStream > 0)
|
||||
{
|
||||
m_ListOutputStreams.SetCurSel(0);
|
||||
OnSelchangeListOutputStreams();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CDMOEnumDlg::OnSelchangeListInputStreams()
|
||||
{
|
||||
HRESULT hr;
|
||||
TCHAR sz[64];
|
||||
int nSel = m_ListInputStreams.GetCurSel();
|
||||
DWORD dwFlags=0;
|
||||
|
||||
//
|
||||
// Display relevant information about input stream
|
||||
//
|
||||
if (!m_pDMO)
|
||||
return;
|
||||
|
||||
// Read input stream information flags
|
||||
hr = m_pDMO->GetInputStreamInfo(nSel, &dwFlags);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
MessageBeep(0);
|
||||
return;
|
||||
}
|
||||
|
||||
// Set stream info checkboxes
|
||||
m_CheckInWholeSamples.SetCheck(dwFlags & DMO_INPUT_STREAMF_WHOLE_SAMPLES);
|
||||
m_CheckInOneSample.SetCheck(dwFlags & DMO_INPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER);
|
||||
m_CheckInFixedSize.SetCheck(dwFlags & DMO_INPUT_STREAMF_FIXED_SAMPLE_SIZE);
|
||||
m_CheckInHoldsBuffers.SetCheck(dwFlags & DMO_INPUT_STREAMF_HOLDS_BUFFERS);
|
||||
|
||||
// Read preferred input type information. The media type/subtypes
|
||||
// are arranged in order of preference, starting from zero.
|
||||
DMO_MEDIA_TYPE dmt={0};
|
||||
hr = m_pDMO->GetInputType(nSel, 0, &dmt);
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
GetFormatString(sz, &dmt);
|
||||
m_StrInFormat.SetWindowText(sz);
|
||||
GetGUIDString(sz, &dmt.majortype);
|
||||
m_StrInType.SetWindowText(sz);
|
||||
GetGUIDString(sz, &dmt.subtype);
|
||||
m_StrInSubtype.SetWindowText(sz);
|
||||
|
||||
MoFreeMediaType(&dmt);
|
||||
}
|
||||
|
||||
// Does this DMO support quality control?
|
||||
IDMOQualityControl *pQC=0;
|
||||
hr = m_pDMO->QueryInterface(IID_IDMOQualityControl, (void **) &pQC);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
m_CheckInQC.SetCheck(TRUE);
|
||||
pQC->Release();
|
||||
}
|
||||
}
|
||||
|
||||
void CDMOEnumDlg::OnSelchangeListOutputStreams()
|
||||
{
|
||||
HRESULT hr;
|
||||
TCHAR sz[64];
|
||||
int nSel = m_ListInputStreams.GetCurSel();
|
||||
DWORD dwFlags=0;
|
||||
|
||||
//
|
||||
// Display relevant information about output stream
|
||||
//
|
||||
if (!m_pDMO)
|
||||
return;
|
||||
|
||||
// Read output stream information flags
|
||||
hr = m_pDMO->GetOutputStreamInfo(nSel, &dwFlags);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
MessageBeep(0);
|
||||
return;
|
||||
}
|
||||
|
||||
// Set stream info checkboxes
|
||||
m_CheckOutWholeSamples.SetCheck(dwFlags & DMO_OUTPUT_STREAMF_WHOLE_SAMPLES);
|
||||
m_CheckOutOneSample.SetCheck(dwFlags & DMO_OUTPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER);
|
||||
m_CheckOutFixedSize.SetCheck(dwFlags & DMO_OUTPUT_STREAMF_FIXED_SAMPLE_SIZE);
|
||||
m_CheckOutDiscardable.SetCheck(dwFlags & DMO_OUTPUT_STREAMF_DISCARDABLE);
|
||||
m_CheckOutOptional.SetCheck(dwFlags & DMO_OUTPUT_STREAMF_OPTIONAL);
|
||||
|
||||
// Read preferred output type information
|
||||
DMO_MEDIA_TYPE dmt={0};
|
||||
hr = m_pDMO->GetOutputType(nSel, 0, &dmt);
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
GetFormatString(sz, &dmt);
|
||||
m_StrOutFormat.SetWindowText(sz);
|
||||
GetGUIDString(sz, &dmt.majortype);
|
||||
m_StrOutType.SetWindowText(sz);
|
||||
GetGUIDString(sz, &dmt.subtype);
|
||||
m_StrOutSubtype.SetWindowText(sz);
|
||||
|
||||
MoFreeMediaType(&dmt);
|
||||
}
|
||||
|
||||
// Does this DMO support quality control?
|
||||
IDMOQualityControl *pQC=0;
|
||||
hr = m_pDMO->QueryInterface(IID_IDMOQualityControl, (void **) &pQC);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
m_CheckOutQC.SetCheck(TRUE);
|
||||
pQC->Release();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user