[MPLAY32] Add entries for found mci devices in the "Device" menu. By Ricardo Hanke. CORE-9385

svn path=/trunk/; revision=66833
This commit is contained in:
Amine Khaldi 2015-03-20 10:44:36 +00:00
parent dfeca474ec
commit 10ae1b40b3
24 changed files with 163 additions and 15 deletions

View file

@ -26,6 +26,7 @@ BEGIN
END END
POPUP "&Device" POPUP "&Device"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Properties", IDM_DEVPROPS MENUITEM "&Properties", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Volume Control", IDM_VOLUMECTL MENUITEM "&Volume Control", IDM_VOLUMECTL

View file

@ -27,6 +27,7 @@ BEGIN
END END
POPUP "&Zařízení" POPUP "&Zařízení"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Vlastnosti", IDM_DEVPROPS MENUITEM "&Vlastnosti", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Ovládání &hlasitosti", IDM_VOLUMECTL MENUITEM "Ovládání &hlasitosti", IDM_VOLUMECTL

View file

@ -22,6 +22,7 @@ BEGIN
END END
POPUP "&Gerät" POPUP "&Gerät"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Eigenschaften", IDM_DEVPROPS MENUITEM "&Eigenschaften", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Lautstärkeregelung", IDM_VOLUMECTL MENUITEM "&Lautstärkeregelung", IDM_VOLUMECTL

View file

@ -22,6 +22,7 @@ BEGIN
END END
POPUP "&Device" POPUP "&Device"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Properties", IDM_DEVPROPS MENUITEM "&Properties", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Volume Control", IDM_VOLUMECTL MENUITEM "&Volume Control", IDM_VOLUMECTL

View file

@ -22,6 +22,7 @@ BEGIN
END END
POPUP "&Dispositivo" POPUP "&Dispositivo"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Propiedades", IDM_DEVPROPS MENUITEM "&Propiedades", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Control de &volumen", IDM_VOLUMECTL MENUITEM "Control de &volumen", IDM_VOLUMECTL

View file

@ -22,6 +22,7 @@ BEGIN
END END
POPUP "Périp&hérique" POPUP "Périp&hérique"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Propriétés", IDM_DEVPROPS MENUITEM "&Propriétés", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Contrôle du &volume", IDM_VOLUMECTL MENUITEM "Contrôle du &volume", IDM_VOLUMECTL

View file

@ -22,6 +22,7 @@ BEGIN
END END
POPUP "&Device" POPUP "&Device"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Properties", IDM_DEVPROPS MENUITEM "&Properties", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Volume Control", IDM_VOLUMECTL MENUITEM "&Volume Control", IDM_VOLUMECTL

View file

@ -22,6 +22,7 @@ BEGIN
END END
POPUP "&Device" POPUP "&Device"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Properties", IDM_DEVPROPS MENUITEM "&Properties", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Volume Control", IDM_VOLUMECTL MENUITEM "&Volume Control", IDM_VOLUMECTL

View file

@ -22,6 +22,7 @@ BEGIN
END END
POPUP "&Device" POPUP "&Device"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Properties", IDM_DEVPROPS MENUITEM "&Properties", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Volume Control", IDM_VOLUMECTL MENUITEM "&Volume Control", IDM_VOLUMECTL

View file

@ -22,6 +22,7 @@ BEGIN
END END
POPUP "&Device" POPUP "&Device"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Properties", IDM_DEVPROPS MENUITEM "&Properties", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Volume Control", IDM_VOLUMECTL MENUITEM "&Volume Control", IDM_VOLUMECTL

View file

@ -22,6 +22,7 @@ BEGIN
END END
POPUP "&Device" POPUP "&Device"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Properties", IDM_DEVPROPS MENUITEM "&Properties", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Volume Control", IDM_VOLUMECTL MENUITEM "&Volume Control", IDM_VOLUMECTL

View file

@ -30,6 +30,7 @@ BEGIN
END END
POPUP "&Urządzenie" POPUP "&Urządzenie"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "Właś&ciwości", IDM_DEVPROPS MENUITEM "Właś&ciwości", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Regulacja głośności", IDM_VOLUMECTL MENUITEM "&Regulacja głośności", IDM_VOLUMECTL

View file

@ -24,6 +24,7 @@ BEGIN
END END
POPUP "&Device" POPUP "&Device"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Properties", IDM_DEVPROPS MENUITEM "&Properties", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Volume Control", IDM_VOLUMECTL MENUITEM "&Volume Control", IDM_VOLUMECTL

View file

@ -28,6 +28,7 @@ BEGIN
END END
POPUP "&Dispozitiv" POPUP "&Dispozitiv"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Proprietăți…", IDM_DEVPROPS MENUITEM "&Proprietăți…", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Control &volum…", IDM_VOLUMECTL MENUITEM "Control &volum…", IDM_VOLUMECTL

View file

@ -22,6 +22,7 @@ BEGIN
END END
POPUP "&Устройство" POPUP "&Устройство"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Свойства", IDM_DEVPROPS MENUITEM "&Свойства", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Громкость", IDM_VOLUMECTL MENUITEM "&Громкость", IDM_VOLUMECTL

View file

@ -27,6 +27,7 @@ BEGIN
END END
POPUP "&Device" POPUP "&Device"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Properties", IDM_DEVPROPS MENUITEM "&Properties", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Volume Control", IDM_VOLUMECTL MENUITEM "&Volume Control", IDM_VOLUMECTL

View file

@ -26,6 +26,7 @@ BEGIN
END END
POPUP "&Device" POPUP "&Device"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Properties", IDM_DEVPROPS MENUITEM "&Properties", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Volume Control", IDM_VOLUMECTL MENUITEM "&Volume Control", IDM_VOLUMECTL

View file

@ -29,6 +29,7 @@ BEGIN
END END
POPUP "&Device" POPUP "&Device"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Properties", IDM_DEVPROPS MENUITEM "&Properties", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Volume Control", IDM_VOLUMECTL MENUITEM "&Volume Control", IDM_VOLUMECTL

View file

@ -24,6 +24,7 @@ BEGIN
END END
POPUP "&Aygıt" POPUP "&Aygıt"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Husûsiyetler", IDM_DEVPROPS MENUITEM "&Husûsiyetler", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Ses Düzeyi Denetimi", IDM_VOLUMECTL MENUITEM "&Ses Düzeyi Denetimi", IDM_VOLUMECTL

View file

@ -30,6 +30,7 @@ BEGIN
END END
POPUP "&Device" POPUP "&Device"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Properties", IDM_DEVPROPS MENUITEM "&Properties", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Volume Control", IDM_VOLUMECTL MENUITEM "&Volume Control", IDM_VOLUMECTL

View file

@ -24,6 +24,7 @@ BEGIN
END END
POPUP "设备(&D)" POPUP "设备(&D)"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "属性(&P)", IDM_DEVPROPS MENUITEM "属性(&P)", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "音量控制(&V)", IDM_VOLUMECTL MENUITEM "音量控制(&V)", IDM_VOLUMECTL

View file

@ -30,6 +30,7 @@ BEGIN
END END
POPUP "&Device" POPUP "&Device"
BEGIN BEGIN
MENUITEM SEPARATOR
MENUITEM "&Properties", IDM_DEVPROPS MENUITEM "&Properties", IDM_DEVPROPS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Volume Control", IDM_VOLUMECTL MENUITEM "&Volume Control", IDM_VOLUMECTL

View file

@ -483,6 +483,38 @@ GetDeviceFriendlyName(LPTSTR lpDeviceName, LPTSTR lpFriendlyName, DWORD dwFriend
return mciError; 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 static MCIERROR
CloseMciDevice(VOID) CloseMciDevice(VOID)
{ {
@ -509,7 +541,7 @@ OpenMciDevice(HWND hwnd, LPTSTR lpType, LPTSTR lpFileName)
MCIERROR mciError; MCIERROR mciError;
MCI_STATUS_PARMS mciStatus; MCI_STATUS_PARMS mciStatus;
MCI_OPEN_PARMS mciOpen; MCI_OPEN_PARMS mciOpen;
DWORD dwFlags = MCI_OPEN_ELEMENT | MCI_WAIT; DWORD dwFlags = MCI_WAIT;
LPTSTR lpStr; LPTSTR lpStr;
if (wDeviceId) if (wDeviceId)
@ -524,6 +556,9 @@ OpenMciDevice(HWND hwnd, LPTSTR lpType, LPTSTR lpFileName)
if (lpType) if (lpType)
dwFlags |= MCI_OPEN_TYPE; dwFlags |= MCI_OPEN_TYPE;
if (lpFileName)
dwFlags |= MCI_OPEN_ELEMENT;
mciError = mciSendCommand(0, MCI_OPEN, dwFlags, (DWORD_PTR)&mciOpen); mciError = mciSendCommand(0, MCI_OPEN, dwFlags, (DWORD_PTR)&mciOpen);
if (mciError != 0) if (mciError != 0)
return mciError; return mciError;
@ -562,11 +597,16 @@ OpenMciDevice(HWND hwnd, LPTSTR lpType, LPTSTR lpFileName)
/* NOTE: Everything above this line may be done instead in OpenMediaFile() */ /* NOTE: Everything above this line may be done instead in OpenMediaFile() */
lpStr = _tcsrchr(lpFileName, _T('\\')); if (lpFileName)
if (lpStr) // Get only the file name (skip the last path separator) {
lpStr++; lpStr = _tcsrchr(lpFileName, _T('\\'));
if (lpStr) // Get only the file name (skip the last path separator)
lpStr++;
else
lpStr = lpFileName;
}
else else
lpStr = lpFileName; lpStr = lpType;
StringCbCopy(szCurrentFile, sizeof(szCurrentFile), lpStr); StringCbCopy(szCurrentFile, sizeof(szCurrentFile), lpStr);
@ -852,7 +892,7 @@ CloseMediaFile(HWND hwnd)
} }
static VOID static VOID
OpenMediaFile(HWND hwnd, LPTSTR lpFileName) OpenMediaFile(HWND hwnd, LPTSTR lpFileName, LPTSTR lpType)
{ {
MCIERROR mciError; MCIERROR mciError;
@ -862,7 +902,7 @@ OpenMediaFile(HWND hwnd, LPTSTR lpFileName)
if (wDeviceId) if (wDeviceId)
CloseMediaFile(hwnd); CloseMediaFile(hwnd);
mciError = OpenMciDevice(hwnd, NULL, lpFileName); mciError = OpenMciDevice(hwnd, lpType, lpFileName);
if (mciError != 0) if (mciError != 0)
{ {
ShowMCIError(hwnd, mciError); ShowMCIError(hwnd, mciError);
@ -872,8 +912,45 @@ OpenMediaFile(HWND hwnd, LPTSTR lpFileName)
StartPlayback(hwnd); 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 static VOID
BuildFileFilter(VOID) BuildFileFilterAndDeviceMenu(VOID)
{ {
TCHAR szDeviceName[MAX_MCISTR]; TCHAR szDeviceName[MAX_MCISTR];
TCHAR szFriendlyName[MAX_MCISTR]; TCHAR szFriendlyName[MAX_MCISTR];
@ -891,6 +968,7 @@ BuildFileFilter(VOID)
DWORD dwFilterSize; DWORD dwFilterSize;
DWORD dwDeviceSize; DWORD dwDeviceSize;
DWORD dwExtensionLen; DWORD dwExtensionLen;
DWORD dwPosition = 0;
DWORD i; DWORD i;
DWORD j; DWORD j;
UINT uSizeRemain; UINT uSizeRemain;
@ -953,6 +1031,10 @@ BuildFileFilter(VOID)
continue; 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... */ /* Copy the default extension list, that may be overwritten after... */
StringCbCopy(szExtensionList, dwMaskLen * sizeof(TCHAR), szDefaultExtension); StringCbCopy(szExtensionList, dwMaskLen * sizeof(TCHAR), szDefaultExtension);
@ -1065,7 +1147,7 @@ CleanupFileFilter(VOID)
} }
static VOID static VOID
OpenFileDialog(HWND hwnd) OpenFileDialog(HWND hwnd, DWORD dwFilterIndex, LPTSTR lpType)
{ {
OPENFILENAME OpenFileName; OPENFILENAME OpenFileName;
TCHAR szFile[MAX_PATH + 1] = _T(""); TCHAR szFile[MAX_PATH + 1] = _T("");
@ -1087,11 +1169,46 @@ OpenFileDialog(HWND hwnd)
OpenFileName.lpstrInitialDir = szCurrentDir; OpenFileName.lpstrInitialDir = szCurrentDir;
OpenFileName.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_SHAREAWARE; OpenFileName.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_SHAREAWARE;
OpenFileName.lpstrDefExt = _T("\0"); OpenFileName.lpstrDefExt = _T("\0");
OpenFileName.nFilterIndex = dwFilterIndex;
if (!GetOpenFileName(&OpenFileName)) if (!GetOpenFileName(&OpenFileName))
return; 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 LRESULT CALLBACK
@ -1114,7 +1231,7 @@ MainWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
drophandle = (HDROP)wParam; drophandle = (HDROP)wParam;
DragQueryFile(drophandle, 0, droppedfile, ARRAYSIZE(droppedfile)); DragQueryFile(drophandle, 0, droppedfile, ARRAYSIZE(droppedfile));
DragFinish(drophandle); DragFinish(drophandle);
OpenMediaFile(hwnd, droppedfile); OpenMediaFile(hwnd, droppedfile, NULL);
break; break;
} }
@ -1241,6 +1358,12 @@ MainWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
case WM_COMMAND: case WM_COMMAND:
{ {
if (LOWORD(wParam) >= IDM_DEVICE_FIRST)
{
HandleDeviceMenuItem(hwnd, LOWORD(wParam));
break;
}
switch (LOWORD(wParam)) switch (LOWORD(wParam))
{ {
case IDC_PLAY: case IDC_PLAY:
@ -1249,7 +1372,7 @@ MainWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
if (wDeviceId) if (wDeviceId)
TogglePlaybackState(hwnd); TogglePlaybackState(hwnd);
else else
OpenFileDialog(hwnd); OpenFileDialog(hwnd, 1, NULL);
break; break;
} }
@ -1276,7 +1399,7 @@ MainWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
break; break;
case IDM_OPEN_FILE: case IDM_OPEN_FILE:
OpenFileDialog(hwnd); OpenFileDialog(hwnd, 1, NULL);
return 0; return 0;
case IDM_CLOSE_FILE: case IDM_CLOSE_FILE:
@ -1383,7 +1506,7 @@ _tWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR lpCmdLine, INT nCmdShow)
hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(ID_ACCELERATORS)); hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(ID_ACCELERATORS));
BuildFileFilter(); BuildFileFilterAndDeviceMenu();
DragAcceptFiles(hwnd, TRUE); DragAcceptFiles(hwnd, TRUE);
@ -1399,7 +1522,7 @@ _tWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR lpCmdLine, INT nCmdShow)
ShowWindow(hwnd, SW_SHOW); ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd); UpdateWindow(hwnd);
OpenMediaFile(hwnd, lpCmdLine); OpenMediaFile(hwnd, lpCmdLine, NULL);
/* Message Loop */ /* Message Loop */
while (GetMessage(&msg, NULL, 0, 0)) while (GetMessage(&msg, NULL, 0, 0))

View file

@ -52,6 +52,9 @@
#define IDM_REPEAT 1006 #define IDM_REPEAT 1006
#define IDM_SWITCHVIEW 1007 #define IDM_SWITCHVIEW 1007
/* The device specific items in the device menu start here */
#define IDM_DEVICE_FIRST 10000
/* ToolBar Icons */ /* ToolBar Icons */
#define TBICON_PLAY 0 #define TBICON_PLAY 0
#define TBICON_STOP 1 #define TBICON_STOP 1