HINSTANCE hInstance = NULL;
HWND hTrackBar = NULL;
HWND hToolBar = NULL;
+HMENU hMainMenu = NULL;
TCHAR szAppTitle[256] = _T("");
TCHAR szPrevFile[MAX_PATH] = _T("\0");
WORD wDeviceId;
BOOL bIsPaused = FALSE;
UINT MaxFilePos = 0;
-/* Known types table */
-static const TYPEBYEXT ExtTypes[] =
-{
- { _T(".wav"), WAVE_FILE },
- { _T(".wave"), WAVE_FILE },
- { _T(".mid"), MIDI_FILE },
- { _T(".midi"), MIDI_FILE },
- { _T(".cda"), AUDIOCD_FILE },
- { _T(".avi"), AVI_FILE },
- { _T("\0"), 0 }
-};
/* ToolBar Buttons */
static const TBBUTTON Buttons[] =
{TBICON_FORWARD, IDC_FORWARD, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}
};
+void EnableMenuItems(void)
+{
+ MCI_GENERIC_PARMS mciGeneric;
+ DWORD dwError;
+
+ EnableMenuItem(hMainMenu, IDM_CLOSE_FILE, MF_BYCOMMAND | MF_ENABLED);
+
+ dwError = mciSendCommand(wDeviceId, MCI_CONFIGURE, MCI_TEST, (DWORD_PTR)&mciGeneric);
+ if (dwError == 0)
+ {
+ EnableMenuItem(hMainMenu, IDM_DEVPROPS, MF_BYCOMMAND | MF_ENABLED);
+ }
+}
+
+void DisableMenuItems(void)
+{
+ EnableMenuItem(hMainMenu, IDM_CLOSE_FILE, MF_BYCOMMAND | MF_GRAYED);
+ EnableMenuItem(hMainMenu, IDM_DEVPROPS, MF_BYCOMMAND | MF_GRAYED);
+}
+
static VOID
SetImageList(HWND hwnd)
{
(LPARAM)hImageList));
}
+static VOID
+ShowMCIError(HWND hwnd, DWORD dwError)
+{
+ TCHAR szErrorMessage[256];
+ TCHAR szTempMessage[300];
+
+ if (mciGetErrorString(dwError, szErrorMessage, sizeof(szErrorMessage) / sizeof(TCHAR)) == FALSE)
+ {
+ LoadString(hInstance, IDS_DEFAULTMCIERRMSG, szErrorMessage, sizeof(szErrorMessage) / sizeof(TCHAR));
+ }
+
+ _stprintf(szTempMessage, _T("MMSYS%u: %s"), dwError, szErrorMessage);
+ MessageBox(hwnd, szTempMessage, szAppTitle, MB_OK | MB_ICONEXCLAMATION);
+}
+
static VOID
InitControls(HWND hwnd)
{
SendMessage(hToolBar, TB_ADDBUTTONS, NumButtons, (LPARAM)Buttons);
}
-static UINT
-IsSupportedFileExtension(LPTSTR lpFileName)
+static BOOL
+IsSupportedFileExtension(LPTSTR lpFileName, LPTSTR lpDeviceName, LPDWORD dwSize)
{
- TCHAR szExt[MAX_PATH];
- INT DotPos = 0, i, j;
-
- for (i = _tcslen(lpFileName); i >= 0; --i)
- {
- if (lpFileName[i] == '.')
- {
- DotPos = _tcslen(lpFileName) - i;
- break;
- }
- }
+ HKEY hKey;
+ DWORD dwType;
+ TCHAR *pathend;
- if (!DotPos) return UNSUPPORTED_FILE;
+ pathend = _tcsrchr(lpFileName, '.');
- szExt[DotPos + 1] = _T('\0');
- for (i = _tcslen(lpFileName), j = DotPos; j >= 0; --i, --j)
+ if (pathend == NULL)
{
- szExt[j] = lpFileName[i];
+ return FALSE;
}
- for (i = 0; ; i++)
+ pathend++;
+
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\MCI Extensions"), 0, KEY_READ, &hKey) == ERROR_SUCCESS)
{
- if (ExtTypes[i].uType == UNSUPPORTED_FILE)
+ if (RegQueryValueEx(hKey, pathend, NULL, &dwType, (LPBYTE)lpDeviceName, dwSize) == ERROR_SUCCESS)
{
- return UNSUPPORTED_FILE;
- }
+ RegCloseKey(hKey);
+ if (dwType != REG_SZ)
+ {
+ return FALSE;
+ }
- if (_tcscmp(ExtTypes[i].szExt, szExt) == 0)
- {
- return ExtTypes[i].uType;
+ return TRUE;
}
+
+ RegCloseKey(hKey);
}
- return UNSUPPORTED_FILE;
+ return FALSE;
}
static DWORD
bIsOpened = FALSE;
}
+ DisableMenuItems();
+
return TRUE;
}
dwError = mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT | MCI_WAIT, (DWORD_PTR)&mciOpen);
if (dwError != 0)
{
- MessageBox(0, _T("Can't open device! (1)"), NULL, MB_OK);
+ ShowMCIError(hwnd, dwError);
return dwError;
}
dwError = mciSendCommand(mciOpen.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_WAIT, (DWORD_PTR)&mciStatus);
if (dwError != 0)
{
- MessageBox(0, _T("Can't open device! (2)"), NULL, MB_OK);
+ ShowMCIError(hwnd, dwError);
return dwError;
}
wDeviceId = mciOpen.wDeviceID;
bIsOpened = TRUE;
_tcscpy(szPrevFile, lpFileName);
+
+ EnableMenuItems();
+
return TRUE;
}
dwError = mciSendCommand(wDeviceId, MCI_SEEK, MCI_WAIT | MCI_TO, (DWORD_PTR)&mciSeek);
if (dwError != 0)
{
- MessageBox(hwnd, _T("SeekPlayback: Can't seek!"), NULL, MB_OK);
+ ShowMCIError(hwnd, dwError);
}
mciPlay.dwCallback = (DWORD_PTR)hwnd;
dwError = mciSendCommand(wDeviceId, MCI_PLAY, MCI_NOTIFY, (DWORD_PTR)&mciPlay);
if (dwError != 0)
{
- MessageBox(hwnd, _T("SeekPlayback: Can't play!"), NULL, MB_OK);
+ ShowMCIError(hwnd, dwError);
}
}
}
dwError = mciSendCommand(wDeviceId, MCI_PAUSE, MCI_WAIT, (DWORD_PTR)&mciGeneric);
if (dwError != 0)
{
- MessageBox(hwnd, _T("Can't pause!"), NULL, MB_OK);
+ ShowMCIError(hwnd, dwError);
}
bIsPaused = TRUE;
}
dwError = mciSendCommand(wDeviceId, MCI_RESUME, MCI_WAIT, (DWORD_PTR)&mciGeneric);
if (dwError != 0)
{
- MessageBox(hwnd, _T("Can't resume!"), NULL, MB_OK);
+ ShowMCIError(hwnd, dwError);
}
bIsPaused = FALSE;
}
}
+static VOID
+ShowDeviceProperties(HWND hwnd)
+{
+ MCI_GENERIC_PARMS mciGeneric;
+ DWORD dwError;
+
+ dwError = mciSendCommand(wDeviceId, MCI_CONFIGURE, MCI_WAIT, (DWORD_PTR)&mciGeneric);
+ if (dwError != 0)
+ {
+ MessageBox(0, _T("Can't display the device properties!"), NULL, MB_OK);
+ }
+}
+
VOID CALLBACK
PlayTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
{
MCI_PLAY_PARMS mciPlay;
TCHAR szLocalFileName[MAX_PATH];
- UINT FileType;
+ TCHAR szDeviceName[MAX_PATH];
+ DWORD dwSize;
+ BOOL IsSupported;
MCIERROR mciError;
if (lpFileName == NULL)
return;
}
- FileType = IsSupportedFileExtension(szLocalFileName);
+ dwSize = sizeof(szDeviceName) - 2;
+ _tcsnset(szDeviceName, _T('\0'), dwSize / sizeof(TCHAR));
+ IsSupported = IsSupportedFileExtension(szLocalFileName, szDeviceName, &dwSize);
- switch (FileType)
+ if (IsSupported == TRUE)
{
- case UNSUPPORTED_FILE:
- MessageBox(hwnd, _T("Unsupported format!"), NULL, MB_OK);
- return;
- case WAVE_FILE:
- OpenMciDevice(hwnd, _T("waveaudio"), szLocalFileName);
- break;
- case MIDI_FILE:
- OpenMciDevice(hwnd, _T("sequencer"), szLocalFileName);
- break;
- case AUDIOCD_FILE:
- OpenMciDevice(hwnd, _T("cdaudio"), szLocalFileName);
- break;
- case AVI_FILE:
- OpenMciDevice(hwnd, _T("avivideo"), szLocalFileName);
- break;
+ OpenMciDevice(hwnd, szDeviceName, szLocalFileName);
}
SetTimer(hwnd, IDT_PLAYTIMER, 100, (TIMERPROC) PlayTimerProc);
mciError = mciSendCommand(wDeviceId, MCI_PLAY, MCI_NOTIFY | MCI_FROM /*| MCI_TO*/, (DWORD_PTR)&mciPlay);
if (mciError != 0)
{
- MessageBox(hwnd, _T("Can't play!"), NULL, MB_OK);
+ ShowMCIError(hwnd, mciError);
}
}
{
case WM_CREATE:
InitControls(hwnd);
+ hMainMenu = GetMenu(hwnd);
+ break;
+
+ case WM_DROPFILES:
+ {
+ HDROP drophandle;
+ TCHAR droppedfile[MAX_PATH];
+
+ drophandle = (HDROP)wParam;
+ DragQueryFile(drophandle, 0, droppedfile, sizeof(droppedfile));
+ DragFinish(drophandle);
+ PlayFile(hwnd, droppedfile);
break;
+ }
case WM_NOTIFY:
{
_tcscpy(szPrevFile, _T("\0"));
break;
+ case IDM_DEVPROPS:
+ ShowDeviceProperties(hwnd);
+ break;
+
+ case IDM_VOLUMECTL:
+ ShellExecute(hwnd, NULL, _T("SNDVOL32.EXE"), NULL, NULL, SW_SHOWNORMAL);
+ break;
+
case IDM_ABOUT:
{
HICON mplayIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN));
TCHAR szClassName[] = _T("ROSMPLAY32");
HWND hwnd;
MSG msg;
+ DWORD dwError;
hInstance = hInst;
hInstance,
NULL);
+ DragAcceptFiles(hwnd, TRUE);
+
+ DisableMenuItems();
+
+ dwError = SearchPath(NULL, _T("SNDVOL32.EXE"), NULL, 0, NULL, NULL);
+ if (dwError == 0)
+ {
+ EnableMenuItem(hMainMenu, IDM_VOLUMECTL, MF_BYCOMMAND | MF_GRAYED);
+ }
+
/* Show it */
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);