return mciError;
}
+static BOOL
+DeviceUsesFiles(LPTSTR lpDeviceName)
+{
+ MCIERROR mciError;
+ MCI_OPEN_PARMS mciOpen;
+ MCI_GETDEVCAPS_PARMS mciDevCaps;
+ MCI_GENERIC_PARMS mciGeneric;
+
+ mciOpen.dwCallback = 0;
+ mciOpen.wDeviceID = 0;
+ mciOpen.lpstrDeviceType = lpDeviceName;
+ mciOpen.lpstrElementName = NULL;
+ mciOpen.lpstrAlias = NULL;
+
+ mciError = mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE | MCI_WAIT, (DWORD_PTR)&mciOpen);
+ if (mciError != 0)
+ return FALSE;
+
+ mciDevCaps.dwCallback = 0;
+ mciDevCaps.dwReturn = 0;
+ mciDevCaps.dwItem = MCI_GETDEVCAPS_USES_FILES;
+
+ mciError = mciSendCommand(mciOpen.wDeviceID, MCI_GETDEVCAPS, MCI_WAIT | MCI_GETDEVCAPS_ITEM, (DWORD_PTR)&mciDevCaps);
+ if (mciError != 0)
+ return FALSE;
+
+ mciGeneric.dwCallback = 0;
+ mciSendCommand(mciOpen.wDeviceID, MCI_CLOSE, MCI_WAIT, (DWORD_PTR)&mciGeneric);
+
+ return (BOOL)mciDevCaps.dwReturn;
+}
+
static MCIERROR
CloseMciDevice(VOID)
{
MCIERROR mciError;
MCI_STATUS_PARMS mciStatus;
MCI_OPEN_PARMS mciOpen;
- DWORD dwFlags = MCI_OPEN_ELEMENT | MCI_WAIT;
+ DWORD dwFlags = MCI_WAIT;
LPTSTR lpStr;
if (wDeviceId)
if (lpType)
dwFlags |= MCI_OPEN_TYPE;
+ if (lpFileName)
+ dwFlags |= MCI_OPEN_ELEMENT;
+
mciError = mciSendCommand(0, MCI_OPEN, dwFlags, (DWORD_PTR)&mciOpen);
if (mciError != 0)
return mciError;
/* NOTE: Everything above this line may be done instead in OpenMediaFile() */
- lpStr = _tcsrchr(lpFileName, _T('\\'));
- if (lpStr) // Get only the file name (skip the last path separator)
- lpStr++;
+ if (lpFileName)
+ {
+ lpStr = _tcsrchr(lpFileName, _T('\\'));
+ if (lpStr) // Get only the file name (skip the last path separator)
+ lpStr++;
+ else
+ lpStr = lpFileName;
+ }
else
- lpStr = lpFileName;
+ lpStr = lpType;
StringCbCopy(szCurrentFile, sizeof(szCurrentFile), lpStr);
}
static VOID
-OpenMediaFile(HWND hwnd, LPTSTR lpFileName)
+OpenMediaFile(HWND hwnd, LPTSTR lpFileName, LPTSTR lpType)
{
MCIERROR mciError;
if (wDeviceId)
CloseMediaFile(hwnd);
- mciError = OpenMciDevice(hwnd, NULL, lpFileName);
+ mciError = OpenMciDevice(hwnd, lpType, lpFileName);
if (mciError != 0)
{
ShowMCIError(hwnd, mciError);
StartPlayback(hwnd);
}
+static DWORD
+InsertDeviceMenuItem(HMENU hMenu, UINT uItem, BOOL fByPosition, UINT uItemID, DWORD dwDeviceIndex)
+{
+ MENUITEMINFO lpmii;
+ MCIERROR mciError;
+ TCHAR szDeviceName[MAX_MCISTR];
+ TCHAR szFriendlyName[MAX_MCISTR];
+
+ mciError = GetDeviceName(dwDeviceIndex, szDeviceName, sizeof(szDeviceName));
+ if (mciError)
+ {
+ return mciError;
+ }
+
+ mciError = GetDeviceFriendlyName(szDeviceName, szFriendlyName, sizeof(szFriendlyName));
+ if (mciError)
+ {
+ return mciError;
+ }
+
+ if (DeviceUsesFiles(szDeviceName))
+ {
+ StringCbCat(szFriendlyName, sizeof(szFriendlyName), _T("..."));
+ }
+
+ ZeroMemory(&lpmii, sizeof(MENUITEMINFO));
+ lpmii.cbSize = sizeof(lpmii);
+ lpmii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID;
+ lpmii.wID = uItemID;
+ lpmii.fType = MF_STRING;
+ lpmii.dwTypeData = szFriendlyName;
+ lpmii.dwItemData = dwDeviceIndex;
+ InsertMenuItem(hMenu, uItem, fByPosition, &lpmii);
+
+ return 0;
+}
+
static VOID
-BuildFileFilter(VOID)
+BuildFileFilterAndDeviceMenu(VOID)
{
TCHAR szDeviceName[MAX_MCISTR];
TCHAR szFriendlyName[MAX_MCISTR];
DWORD dwFilterSize;
DWORD dwDeviceSize;
DWORD dwExtensionLen;
+ DWORD dwPosition = 0;
DWORD i;
DWORD j;
UINT uSizeRemain;
continue;
}
+ /* Insert a menu item under the "Device" menu for every found MCI device */
+ InsertDeviceMenuItem(GetSubMenu(hMainMenu, 3), dwPosition, TRUE, IDM_DEVICE_FIRST + dwPosition, j);
+ dwPosition++;
+
/* Copy the default extension list, that may be overwritten after... */
StringCbCopy(szExtensionList, dwMaskLen * sizeof(TCHAR), szDefaultExtension);
}
static VOID
-OpenFileDialog(HWND hwnd)
+OpenFileDialog(HWND hwnd, DWORD dwFilterIndex, LPTSTR lpType)
{
OPENFILENAME OpenFileName;
TCHAR szFile[MAX_PATH + 1] = _T("");
OpenFileName.lpstrInitialDir = szCurrentDir;
OpenFileName.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_SHAREAWARE;
OpenFileName.lpstrDefExt = _T("\0");
+ OpenFileName.nFilterIndex = dwFilterIndex;
if (!GetOpenFileName(&OpenFileName))
return;
- OpenMediaFile(hwnd, OpenFileName.lpstrFile);
+ OpenMediaFile(hwnd, OpenFileName.lpstrFile, lpType);
+}
+
+static VOID
+HandleDeviceMenuItem(HWND hwnd, UINT uItem)
+{
+ MENUITEMINFO lpmii;
+ TCHAR szDeviceName[MAX_MCISTR];
+ MCIERROR mciError;
+
+ ZeroMemory(&lpmii, sizeof(MENUITEMINFO));
+ lpmii.cbSize = sizeof(lpmii);
+ lpmii.fMask = MIIM_DATA;
+ GetMenuItemInfo(hMainMenu, uItem, FALSE, &lpmii);
+
+ mciError = GetDeviceName(lpmii.dwItemData, szDeviceName, sizeof(szDeviceName));
+ if (mciError)
+ {
+ ShowMCIError(hwnd, mciError);
+ return;
+ }
+
+ if (DeviceUsesFiles(szDeviceName))
+ {
+ OpenFileDialog(hwnd, uItem - IDM_DEVICE_FIRST + 1, szDeviceName);
+ return;
+ }
+
+ mciError = OpenMciDevice(hwnd, szDeviceName, NULL);
+ if (mciError)
+ {
+ ShowMCIError(hwnd, mciError);
+ }
+
+ return;
}
LRESULT CALLBACK
drophandle = (HDROP)wParam;
DragQueryFile(drophandle, 0, droppedfile, ARRAYSIZE(droppedfile));
DragFinish(drophandle);
- OpenMediaFile(hwnd, droppedfile);
+ OpenMediaFile(hwnd, droppedfile, NULL);
break;
}
case WM_COMMAND:
{
+ if (LOWORD(wParam) >= IDM_DEVICE_FIRST)
+ {
+ HandleDeviceMenuItem(hwnd, LOWORD(wParam));
+ break;
+ }
+
switch (LOWORD(wParam))
{
case IDC_PLAY:
if (wDeviceId)
TogglePlaybackState(hwnd);
else
- OpenFileDialog(hwnd);
+ OpenFileDialog(hwnd, 1, NULL);
break;
}
break;
case IDM_OPEN_FILE:
- OpenFileDialog(hwnd);
+ OpenFileDialog(hwnd, 1, NULL);
return 0;
case IDM_CLOSE_FILE:
hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(ID_ACCELERATORS));
- BuildFileFilter();
+ BuildFileFilterAndDeviceMenu();
DragAcceptFiles(hwnd, TRUE);
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
- OpenMediaFile(hwnd, lpCmdLine);
+ OpenMediaFile(hwnd, lpCmdLine, NULL);
/* Message Loop */
while (GetMessage(&msg, NULL, 0, 0))