From edc8b4e89446f9c2cd0297632d95254a50f7f6f2 Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Wed, 11 Mar 2009 10:22:15 +0000 Subject: [PATCH] - Add simple multimedia player svn path=/trunk/; revision=39947 --- reactos/base/applications/applications.rbuild | 3 + .../base/applications/mplay32/lang/en-US.rc | 29 + reactos/base/applications/mplay32/mplay32.c | 700 ++++++++++++++++++ reactos/base/applications/mplay32/mplay32.h | 19 + .../base/applications/mplay32/mplay32.rbuild | 12 + reactos/base/applications/mplay32/mplay32.rc | 24 + reactos/base/applications/mplay32/resource.h | 55 ++ .../mplay32/resources/backward.bmp | Bin 0 -> 1334 bytes .../applications/mplay32/resources/eject.bmp | Bin 0 -> 1334 bytes .../mplay32/resources/forward.bmp | Bin 0 -> 1334 bytes .../mplay32/resources/mplay32.ico | Bin 0 -> 40070 bytes .../applications/mplay32/resources/pause.bmp | Bin 0 -> 1334 bytes .../applications/mplay32/resources/play.bmp | Bin 0 -> 1334 bytes .../mplay32/resources/seekback.bmp | Bin 0 -> 1334 bytes .../mplay32/resources/seekforw.bmp | Bin 0 -> 1334 bytes .../applications/mplay32/resources/stop.bmp | Bin 0 -> 1334 bytes reactos/base/applications/mplay32/rsrc.rc | 4 + 17 files changed, 846 insertions(+) create mode 100644 reactos/base/applications/mplay32/lang/en-US.rc create mode 100644 reactos/base/applications/mplay32/mplay32.c create mode 100644 reactos/base/applications/mplay32/mplay32.h create mode 100644 reactos/base/applications/mplay32/mplay32.rbuild create mode 100644 reactos/base/applications/mplay32/mplay32.rc create mode 100644 reactos/base/applications/mplay32/resource.h create mode 100644 reactos/base/applications/mplay32/resources/backward.bmp create mode 100644 reactos/base/applications/mplay32/resources/eject.bmp create mode 100644 reactos/base/applications/mplay32/resources/forward.bmp create mode 100644 reactos/base/applications/mplay32/resources/mplay32.ico create mode 100644 reactos/base/applications/mplay32/resources/pause.bmp create mode 100644 reactos/base/applications/mplay32/resources/play.bmp create mode 100644 reactos/base/applications/mplay32/resources/seekback.bmp create mode 100644 reactos/base/applications/mplay32/resources/seekforw.bmp create mode 100644 reactos/base/applications/mplay32/resources/stop.bmp create mode 100644 reactos/base/applications/mplay32/rsrc.rc diff --git a/reactos/base/applications/applications.rbuild b/reactos/base/applications/applications.rbuild index 71c4efd561d..6c4d2540178 100644 --- a/reactos/base/applications/applications.rbuild +++ b/reactos/base/applications/applications.rbuild @@ -34,6 +34,9 @@ + + + diff --git a/reactos/base/applications/mplay32/lang/en-US.rc b/reactos/base/applications/mplay32/lang/en-US.rc new file mode 100644 index 00000000000..94600281031 --- /dev/null +++ b/reactos/base/applications/mplay32/lang/en-US.rc @@ -0,0 +1,29 @@ +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +IDR_MAINMENU MENU +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Open...", IDM_OPEN_FILE + MENUITEM "&Close", IDM_CLOSE_FILE + MENUITEM SEPARATOR + MENUITEM "&Exit", IDM_EXIT + END + POPUP "&Help" + BEGIN + MENUITEM "&About...", IDM_ABOUT + END +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_ALL_TYPES_FILTER "All Supported (*.wav, *.cda, *.midi, *.mid, *.avi)\0*.wav;*.cda;*.midi;*.mid;*.avi\0" + IDS_TOOLTIP_PLAY "Play" + IDS_TOOLTIP_STOP "Stop" + IDS_TOOLTIP_EJECT "Eject" + IDS_TOOLTIP_BACKWARD "Skip Backward" + IDS_TOOLTIP_SEEKBACK "Seek Backward" + IDS_TOOLTIP_SEEKFORW "Seek Forward" + IDS_TOOLTIP_FORWARD "Skip Forward" + IDS_APPTITLE "ReactOS Multimedia Player" +END diff --git a/reactos/base/applications/mplay32/mplay32.c b/reactos/base/applications/mplay32/mplay32.c new file mode 100644 index 00000000000..405525d9c84 --- /dev/null +++ b/reactos/base/applications/mplay32/mplay32.c @@ -0,0 +1,700 @@ +/* + * PROJECT: ReactOS Multimedia Player + * FILE: base\applications\mplay32\mplay32.c + * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org) + */ + +#include "mplay32.h" + +#define MAIN_WINDOW_HEIGHT 125 +#define MAIN_WINDOW_MIN_WIDTH 250 + +HINSTANCE hInstance = NULL; +HWND hTrackBar = NULL; +HWND hToolBar = NULL; +TCHAR szAppTitle[256] = _T(""); +TCHAR szPrevFile[MAX_PATH] = _T("\0"); +WORD wDeviceId; +BOOL bIsOpened = FALSE; +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[] = +{ /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */ + {TBICON_PLAY, IDC_PLAY, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, + {TBICON_STOP, IDC_STOP, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, + {TBICON_EJECT, IDC_EJECT, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, + {15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, + {TBICON_BACKWARD, IDC_BACKWARD, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, + {TBICON_SEEKBACK, IDC_SEEKBACK, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, + {TBICON_SEEKFORW, IDC_SEEKFORW, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, + {TBICON_FORWARD, IDC_FORWARD, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0} +}; + +static VOID +SetImageList(HWND hwnd) +{ + HIMAGELIST hImageList; + + hImageList = ImageList_Create(16, 16, ILC_MASK | ILC_COLOR24, 1, 1); + + if (!hImageList) + { + MessageBox(hwnd, _T("ImageList it is not created!"), NULL, MB_OK); + return; + } + + ImageList_AddMasked(hImageList, + LoadImage(hInstance, MAKEINTRESOURCE(IDB_PLAYICON), IMAGE_BITMAP, 16, 16, LR_DEFAULTCOLOR), + RGB(255, 255, 255)); + + ImageList_AddMasked(hImageList, + LoadImage(hInstance, MAKEINTRESOURCE(IDB_STOPICON), IMAGE_BITMAP, 16, 16, LR_DEFAULTCOLOR), + RGB(255, 255, 255)); + + ImageList_AddMasked(hImageList, + LoadImage(hInstance, MAKEINTRESOURCE(IDB_EJECTICON), IMAGE_BITMAP, 16, 16, LR_DEFAULTCOLOR), + RGB(255, 255, 255)); + + ImageList_AddMasked(hImageList, + LoadImage(hInstance, MAKEINTRESOURCE(IDB_BACKWARDICON), IMAGE_BITMAP, 16, 16, LR_DEFAULTCOLOR), + RGB(255, 255, 255)); + + ImageList_AddMasked(hImageList, + LoadImage(hInstance, MAKEINTRESOURCE(IDB_SEEKBACKICON), IMAGE_BITMAP, 16, 16, LR_DEFAULTCOLOR), + RGB(255, 255, 255)); + + ImageList_AddMasked(hImageList, + LoadImage(hInstance, MAKEINTRESOURCE(IDB_SEEKFORWICON), IMAGE_BITMAP, 16, 16, LR_DEFAULTCOLOR), + RGB(255, 255, 255)); + + ImageList_AddMasked(hImageList, + LoadImage(hInstance, MAKEINTRESOURCE(IDB_FORWARDICON), IMAGE_BITMAP, 16, 16, LR_DEFAULTCOLOR), + RGB(255, 255, 255)); + + ImageList_Destroy((HIMAGELIST)SendMessage(hToolBar, + TB_SETIMAGELIST, + 0, + (LPARAM)hImageList)); +} + +static VOID +InitControls(HWND hwnd) +{ + INT NumButtons = sizeof(Buttons) / sizeof(Buttons[0]); + + InitCommonControls(); + + /* Create trackbar */ + hTrackBar = CreateWindowEx(0, + TRACKBAR_CLASS, + NULL, + TBS_ENABLESELRANGE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_CLIPSIBLINGS, + 0, + 0, + 340, + 30, + hwnd, + NULL, + hInstance, + NULL); + if (!hTrackBar) + { + MessageBox(hwnd, _T("TrackBar it is not created!"), NULL, MB_OK); + return; + } + + /* Create toolbar */ + hToolBar = CreateWindowEx(0, + TOOLBARCLASSNAME, + NULL, + WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_CLIPSIBLINGS | + TBSTYLE_FLAT | CCS_BOTTOM | TBSTYLE_TOOLTIPS, + 0, + 40, + 340, + 30, + hwnd, + NULL, + hInstance, + NULL); + if (!hToolBar) + { + MessageBox(hwnd, _T("ToolBar it is not created!"), NULL, MB_OK); + return; + } + + SetImageList(hwnd); + SendMessage(hToolBar, TB_ADDBUTTONS, NumButtons, (LPARAM)Buttons); +} + +static UINT +IsSupportedFileExtension(LPWSTR lpFileName) +{ + TCHAR szExt[MAX_PATH]; + INT DotPos = 0, i, j; + + for (i = _tcslen(lpFileName); i >= 0; --i) + { + if (lpFileName[i] == '.') + { + DotPos = _tcslen(lpFileName) - i; + break; + } + } + + if (!DotPos) return UNSUPPORTED_FILE; + + szExt[DotPos + 1] = _T('\0'); + for (i = _tcslen(lpFileName), j = DotPos; j >= 0; --i, --j) + { + szExt[j] = lpFileName[i]; + } + + for (i = 0; ; i++) + { + if (ExtTypes[i].uType == UNSUPPORTED_FILE) + { + return UNSUPPORTED_FILE; + } + + if (_tcscmp(ExtTypes[i].szExt, szExt) == 0) + { + return ExtTypes[i].uType; + } + } + + return UNSUPPORTED_FILE; +} + +static DWORD +CloseMciDevice(VOID) +{ + MCI_GENERIC_PARMS mciGeneric; + DWORD dwError; + + if (bIsOpened) + { + dwError = mciSendCommand(wDeviceId, MCI_CLOSE, MCI_WAIT, (DWORD)(LPMCI_GENERIC_PARMS)&mciGeneric); + if (dwError) return dwError; + bIsOpened = FALSE; + } + + return TRUE; +} + +static DWORD +OpenMciDevice(LPTSTR lpType, LPTSTR lpFileName) +{ + MCI_STATUS_PARMS mciStatus; + MCI_OPEN_PARMS mciOpen; + DWORD dwError; + + if (bIsOpened) + { + CloseMciDevice(); + } + + mciOpen.lpstrDeviceType = lpType; + mciOpen.lpstrElementName = lpFileName; + mciOpen.dwCallback = 0; + mciOpen.wDeviceID = 0; + mciOpen.lpstrAlias = NULL; + + dwError = mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT | MCI_WAIT, (DWORD)(LPVOID)&mciOpen); + if (dwError != 0) + { + MessageBox(0, _T("Can't open device! (1)"), NULL, MB_OK); + return dwError; + } + + mciStatus.dwItem = MCI_STATUS_LENGTH; + + dwError = mciSendCommand(mciOpen.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_WAIT, (DWORD)(LPVOID)&mciStatus); + if (dwError != 0) + { + MessageBox(0, _T("Can't open device! (2)"), NULL, MB_OK); + return dwError; + } + + SendMessage(hTrackBar, TBM_SETRANGE, (WPARAM) TRUE, (LPARAM) MAKELONG(1, mciStatus.dwReturn)); + SendMessage(hTrackBar, TBM_SETPAGESIZE, 0, 10); + SendMessage(hTrackBar, TBM_SETLINESIZE, 0, 1); + SendMessage(hTrackBar, TBM_SETPOS, (WPARAM) TRUE, (LPARAM) 1); + + if (mciStatus.dwReturn < 10000) + { + SendMessage(hTrackBar, TBM_SETTICFREQ, (WPARAM) 100, (LPARAM) 0); + } + else if (mciStatus.dwReturn < 100000) + { + SendMessage(hTrackBar, TBM_SETTICFREQ, (WPARAM) 1000, (LPARAM) 0); + } + else if (mciStatus.dwReturn < 1000000) + { + SendMessage(hTrackBar, TBM_SETTICFREQ, (WPARAM) 10000, (LPARAM) 0); + } + else + { + SendMessage(hTrackBar, TBM_SETTICFREQ, (WPARAM) 100000, (LPARAM) 0); + } + + MaxFilePos = mciStatus.dwReturn; + wDeviceId = mciOpen.wDeviceID; + bIsOpened = TRUE; + lstrcpy(szPrevFile, lpFileName); + return TRUE; +} + +static VOID +StopPlayback(HWND hwnd) +{ + if (bIsOpened) + { + SendMessage(hTrackBar, TBM_SETPOS, (WPARAM) TRUE, (LPARAM) 1); + KillTimer(hwnd, IDT_PLAYTIMER); + CloseMciDevice(); + } +} + +static VOID +SeekPlayback(HWND hwnd, DWORD dwNewPos) +{ + MCI_SEEK_PARMS mciSeek; + MCI_PLAY_PARMS mciPlay; + DWORD dwError; + + if (bIsOpened) + { + mciSeek.dwTo = dwNewPos; + dwError = mciSendCommand(wDeviceId, MCI_SEEK, MCI_WAIT | MCI_TO, (DWORD)(LPVOID)&mciSeek); + if (dwError != 0) + { + MessageBox(hwnd, _T("SeekPlayback: Can't seek!"), NULL, MB_OK); + } + + mciPlay.dwCallback = (DWORD)hwnd; + dwError = mciSendCommand(wDeviceId, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID)&mciPlay); + if (dwError != 0) + { + MessageBox(hwnd, _T("SeekPlayback: Can't play!"), NULL, MB_OK); + } + } +} + +static VOID +SeekBackPlayback(HWND hwnd) +{ + MCI_STATUS_PARMS mciStatus; + DWORD dwNewPos; + + if (!bIsOpened) return; + + mciStatus.dwItem = MCI_STATUS_POSITION; + mciSendCommand(wDeviceId, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatus); + + dwNewPos = mciStatus.dwReturn - 1; + + if((UINT)dwNewPos <= 1) + { + StopPlayback(hwnd); + } + else + { + SeekPlayback(hwnd, dwNewPos); + } +} + +static VOID +SeekForwPlayback(HWND hwnd) +{ + MCI_STATUS_PARMS mciStatus; + DWORD dwNewPos; + + if (!bIsOpened) return; + + mciStatus.dwItem = MCI_STATUS_POSITION; + mciSendCommand(wDeviceId, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatus); + + dwNewPos = mciStatus.dwReturn + 1; + + if((UINT)dwNewPos >= MaxFilePos) + { + StopPlayback(hwnd); + } + else + { + SeekPlayback(hwnd, dwNewPos); + } +} + +static VOID +PausePlayback(HWND hwnd) +{ + MCI_GENERIC_PARMS mciGeneric; + DWORD dwError; + + if (bIsOpened) + { + dwError = mciSendCommand(wDeviceId, MCI_PAUSE, MCI_WAIT, (DWORD)(LPMCI_GENERIC_PARMS)&mciGeneric); + if (dwError != 0) + { + MessageBox(hwnd, _T("Can't pause!"), NULL, MB_OK); + } + bIsPaused = TRUE; + } +} + +static VOID +ResumePlayback(HWND hwnd) +{ + MCI_GENERIC_PARMS mciGeneric; + DWORD dwError; + + if (bIsPaused) + { + dwError = mciSendCommand(wDeviceId, MCI_RESUME, MCI_WAIT, (DWORD)(LPMCI_GENERIC_PARMS)&mciGeneric); + if (dwError != 0) + { + MessageBox(hwnd, _T("Can't resume!"), NULL, MB_OK); + } + bIsPaused = FALSE; + } +} + +VOID CALLBACK +PlayTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) +{ + MCI_STATUS_PARMS mciStatus; + DWORD dwPos; + + if (!bIsOpened) KillTimer(hwnd, IDT_PLAYTIMER); + + mciStatus.dwItem = MCI_STATUS_POSITION; + mciSendCommand(wDeviceId, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)(LPVOID)&mciStatus); + dwPos = mciStatus.dwReturn; + + if((UINT)dwPos >= MaxFilePos) + { + StopPlayback(hwnd); + } + else + { + SendMessage(hTrackBar, TBM_SETPOS, (WPARAM) TRUE, (LPARAM) dwPos); + } +} + +static VOID +PlayFile(HWND hwnd, LPWSTR lpFileName) +{ + MCI_PLAY_PARMS mciPlay; + TCHAR szLocalFileName[MAX_PATH]; + UINT FileType; + DWORD dwError; + + if (lpFileName == NULL) + { + if (szPrevFile[0] == _T('\0')) + return; + + lstrcpy(szLocalFileName, szPrevFile); + } + else + { + lstrcpy(szLocalFileName, lpFileName); + } + + if (GetFileAttributes(szLocalFileName) == INVALID_FILE_ATTRIBUTES) + { + MessageBox(hwnd, _T("Wrong path to a file!"), NULL, MB_OK); + return; + } + + FileType = IsSupportedFileExtension(szLocalFileName); + + switch (FileType) + { + case UNSUPPORTED_FILE: + MessageBox(hwnd, _T("Unsupported format!"), NULL, MB_OK); + return; + case WAVE_FILE: + OpenMciDevice(_T("waveaudio"), szLocalFileName); + break; + case MIDI_FILE: + OpenMciDevice(_T("sequencer"), szLocalFileName); + break; + case AUDIOCD_FILE: + OpenMciDevice(_T("cdaudio"), szLocalFileName); + break; + case AVI_FILE: + OpenMciDevice(_T("avivideo"), szLocalFileName); + break; + } + + SetTimer(hwnd, IDT_PLAYTIMER, 100, (TIMERPROC) PlayTimerProc); + + dwError = mciSendCommand(wDeviceId, MCI_SEEK, MCI_WAIT | MCI_SEEK_TO_START, 0); + + mciPlay.dwCallback = (DWORD)hwnd; + mciPlay.dwFrom = 0; + mciPlay.dwTo = MaxFilePos; + + dwError = mciSendCommand(wDeviceId, MCI_PLAY, MCI_NOTIFY | MCI_FROM | MCI_TO, (DWORD)(LPVOID)&mciPlay); + if (dwError != 0) + { + MessageBox(hwnd, _T("Can't play!"), NULL, MB_OK); + } +} + +static VOID +OpenFileDialog(HWND hwnd) +{ + OPENFILENAME OpenFileName; + TCHAR szFile[MAX_PATH + 1] = _T("\0"); + TCHAR szFilter[MAX_PATH], szCurrentDir[MAX_PATH]; + + ZeroMemory(&OpenFileName, sizeof(OpenFileName)); + + LoadString(hInstance, IDS_ALL_TYPES_FILTER, szFilter, sizeof(szFilter) / sizeof(TCHAR)); + + if (!GetCurrentDirectory(sizeof(szCurrentDir) / sizeof(TCHAR), szCurrentDir)) + { + lstrcpy(szCurrentDir, _T("c:\\")); + } + + OpenFileName.lStructSize = sizeof(OpenFileName); + OpenFileName.hwndOwner = hwnd; + OpenFileName.hInstance = hInstance; + OpenFileName.lpstrFilter = szFilter; + OpenFileName.lpstrFile = szFile; + OpenFileName.nMaxFile = sizeof(szFile) / sizeof((szFile)[0]); + OpenFileName.lpstrInitialDir = szCurrentDir; + OpenFileName.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_SHAREAWARE; + OpenFileName.lpstrDefExt = _T("\0"); + + if (GetOpenFileName(&OpenFileName)) + { + PlayFile(hwnd, OpenFileName.lpstrFile); + } +} + +LRESULT CALLBACK +MainWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + case WM_CREATE: + InitControls(hwnd); + break; + + case WM_NOTIFY: + { + LPNMHDR pnmhdr = (LPNMHDR)lParam; + + switch (pnmhdr->code) + { + case TTN_GETDISPINFO: + { + LPTOOLTIPTEXT lpttt = (LPTOOLTIPTEXT)lParam; + UINT idButton = (UINT)lpttt->hdr.idFrom; + + switch (idButton) + { + case IDC_PLAY: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_PLAY); + break; + case IDC_STOP: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_STOP); + break; + case IDC_EJECT: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_EJECT); + break; + case IDC_BACKWARD: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_BACKWARD); + break; + case IDC_SEEKBACK: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_SEEKBACK); + break; + case IDC_SEEKFORW: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_SEEKFORW); + break; + case IDC_FORWARD: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_FORWARD); + break; + } + break; + } + } + } + break; + + case WM_SIZING: + { + LPRECT pRect = (LPRECT)lParam; + + if (pRect->right - pRect->left < MAIN_WINDOW_MIN_WIDTH) + pRect->right = pRect->left + MAIN_WINDOW_MIN_WIDTH; + + if (pRect->bottom - pRect->top != MAIN_WINDOW_HEIGHT) + pRect->bottom = pRect->top + MAIN_WINDOW_HEIGHT; + + return TRUE; + } + + case WM_SIZE: + { + RECT Rect; + UINT Size; + + if (hToolBar && hTrackBar) + { + SendMessage(hToolBar, TB_AUTOSIZE, 0, 0); + SendMessage(hToolBar, TB_GETITEMRECT, 1, (LPARAM)&Rect); + + Size = GetSystemMetrics(SM_CYMENU) + Rect.bottom; + MoveWindow(hTrackBar, 0, 0, LOWORD(lParam), HIWORD(lParam) - Size, TRUE); + } + return 0L; + } + + case WM_HSCROLL: + { + if (hTrackBar == (HWND) lParam) + { + DWORD dwNewPos = (DWORD) SendMessage(hTrackBar, TBM_GETPOS, 0, 0); + SeekPlayback(hwnd, dwNewPos); + } + } + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDC_PLAY: + if (bIsOpened) + { + if (bIsPaused) + ResumePlayback(hwnd); + else + PausePlayback(hwnd); + } + else + { + if (szPrevFile[0] == _T('\0')) + OpenFileDialog(hwnd); + else + PlayFile(hwnd, NULL); + } + break; + + case IDC_STOP: + StopPlayback(hwnd); + break; + + case IDC_EJECT: + break; + + case IDC_BACKWARD: + break; + + case IDC_SEEKBACK: + SeekBackPlayback(hwnd); + break; + + case IDC_SEEKFORW: + SeekForwPlayback(hwnd); + break; + + case IDC_FORWARD: + break; + + case IDM_OPEN_FILE: + OpenFileDialog(hwnd); + return 0; + + case IDM_CLOSE_FILE: + StopPlayback(hwnd); + lstrcpy(szPrevFile, _T("\0")); + break; + + case IDM_ABOUT: + ShellAbout(hwnd, szAppTitle, 0, 0); + break; + + case IDM_EXIT: + PostMessage(hwnd, WM_CLOSE, 0, 0); + return 0; + } + break; + + case WM_DESTROY: + StopPlayback(hwnd); + PostQuitMessage(0); + return 0; + } + + return DefWindowProc(hwnd, Message, wParam, lParam); +} + +INT WINAPI +_tWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR lpCmdLine, INT nCmdShow) +{ + WNDCLASSEX WndClass = {0}; + TCHAR szClassName[] = _T("ROSMPLAY32"); + HWND hwnd; + MSG msg; + + hInstance = hInst; + + LoadString(hInstance, IDS_APPTITLE, szAppTitle, sizeof(szAppTitle) / sizeof(TCHAR)); + + WndClass.cbSize = sizeof(WNDCLASSEX); + WndClass.lpszClassName = szClassName; + WndClass.lpfnWndProc = MainWndProc; + WndClass.hInstance = hInstance; + WndClass.style = CS_HREDRAW | CS_VREDRAW; + WndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN)); + WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); + WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); + WndClass.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU); + + RegisterClassEx(&WndClass); + + hwnd = CreateWindow(szClassName, + szAppTitle, + WS_SYSMENU | WS_MINIMIZEBOX | WS_THICKFRAME | WS_OVERLAPPED | WS_CAPTION | WS_CLIPCHILDREN, + CW_USEDEFAULT, + CW_USEDEFAULT, + 350, + MAIN_WINDOW_HEIGHT, + NULL, + NULL, + hInstance, + NULL); + + /* Show it */ + ShowWindow(hwnd, SW_SHOW); + UpdateWindow(hwnd); + + /* Message Loop */ + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + return 0; +} diff --git a/reactos/base/applications/mplay32/mplay32.h b/reactos/base/applications/mplay32/mplay32.h new file mode 100644 index 00000000000..c6e5307faa5 --- /dev/null +++ b/reactos/base/applications/mplay32/mplay32.h @@ -0,0 +1,19 @@ +#include +#include +#include + +#include "resource.h" + +#define IDT_PLAYTIMER 1000 + +#define UNSUPPORTED_FILE 0 +#define WAVE_FILE 1 +#define MIDI_FILE 2 +#define AUDIOCD_FILE 3 +#define AVI_FILE 4 + +typedef struct +{ + TCHAR szExt[MAX_PATH]; + UINT uType; +} TYPEBYEXT; diff --git a/reactos/base/applications/mplay32/mplay32.rbuild b/reactos/base/applications/mplay32/mplay32.rbuild new file mode 100644 index 00000000000..9ee483440b1 --- /dev/null +++ b/reactos/base/applications/mplay32/mplay32.rbuild @@ -0,0 +1,12 @@ + + . + advapi32 + comctl32 + comdlg32 + kernel32 + user32 + winmm + shell32 + mplay32.c + mplay32.rc + diff --git a/reactos/base/applications/mplay32/mplay32.rc b/reactos/base/applications/mplay32/mplay32.rc new file mode 100644 index 00000000000..9b4597a7ab2 --- /dev/null +++ b/reactos/base/applications/mplay32/mplay32.rc @@ -0,0 +1,24 @@ +#include +#include "resource.h" + +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Multimedia Player\0" +#define REACTOS_STR_INTERNAL_NAME "mplay32\0" +#define REACTOS_STR_ORIGINAL_FILENAME "mplay32.exe\0" +#include + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +/* Icons */ +IDI_MAIN ICON DISCARDABLE "resources/mplay32.ico" + +/* Bitmaps */ +IDB_PLAYICON BITMAP "resources/play.bmp" +IDB_STOPICON BITMAP "resources/stop.bmp" +IDB_EJECTICON BITMAP "resources/eject.bmp" +IDB_BACKWARDICON BITMAP "resources/backward.bmp" +IDB_SEEKBACKICON BITMAP "resources/seekback.bmp" +IDB_SEEKFORWICON BITMAP "resources/seekforw.bmp" +IDB_FORWARDICON BITMAP "resources/forward.bmp" +IDB_PAUSEICON BITMAP "resources/pause.bmp" + +#include "rsrc.rc" diff --git a/reactos/base/applications/mplay32/resource.h b/reactos/base/applications/mplay32/resource.h new file mode 100644 index 00000000000..f4dfddf95e4 --- /dev/null +++ b/reactos/base/applications/mplay32/resource.h @@ -0,0 +1,55 @@ +#ifndef __RESOURCE_H_ +#define __RESOURCE_H_ + +/* Icons */ +#define IDI_MAIN 10 + +/* Bitmaps */ +#define IDB_PLAYICON 50 +#define IDB_STOPICON 51 +#define IDB_EJECTICON 52 +#define IDB_BACKWARDICON 53 +#define IDB_SEEKBACKICON 54 +#define IDB_SEEKFORWICON 55 +#define IDB_FORWARDICON 56 +#define IDB_PAUSEICON 57 + +/* Strings */ +#define IDS_APPTITLE 100 +#define IDS_TOOLTIP_PLAY 101 +#define IDS_TOOLTIP_STOP 102 +#define IDS_TOOLTIP_EJECT 103 +#define IDS_TOOLTIP_BACKWARD 104 +#define IDS_TOOLTIP_SEEKBACK 105 +#define IDS_TOOLTIP_SEEKFORW 106 +#define IDS_TOOLTIP_FORWARD 107 +#define IDS_ALL_TYPES_FILTER 108 + +/* Menu */ +#define IDR_MAINMENU 500 + +/* Menu items */ +#define IDM_OPEN_FILE 1000 +#define IDM_CLOSE_FILE 1001 +#define IDM_EXIT 1002 +#define IDM_ABOUT 1003 + +/* ToolBar Icons */ +#define TBICON_PLAY 0 +#define TBICON_STOP 1 +#define TBICON_EJECT 2 +#define TBICON_BACKWARD 3 +#define TBICON_SEEKBACK 4 +#define TBICON_SEEKFORW 5 +#define TBICON_FORWARD 6 + +/* ToolBar Buttons */ +#define IDC_PLAY 1500 +#define IDC_STOP 1501 +#define IDC_EJECT 1502 +#define IDC_BACKWARD 1503 +#define IDC_SEEKBACK 1504 +#define IDC_SEEKFORW 1505 +#define IDC_FORWARD 1506 + +#endif /* __RESOURCE_H_ */ diff --git a/reactos/base/applications/mplay32/resources/backward.bmp b/reactos/base/applications/mplay32/resources/backward.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8e932b63f85743aee879d980ec7dec43cb1dfe75 GIT binary patch literal 1334 zcmZ?rHDhG}12Yx|1`Qxf0E!tII3N;0@{k+^GcW=i^Ys)&DE&>;BibH2rUEYx&>Y(e{7Bq>2A0PMY+8($p#c zCr_F3f5LPiJ!AU+DYIt&pSfV(|Je)Y{hz;h(f^ezSN>nSZr%Sio7Vqdw`t@5O;G@xzx)3Vh~Izw@c+ZdkN-b>`uP9jmrwtH{QUX<=dYjtfBpLP z|M&0T|9}7a^ZySJ|NHmvKL`LrX%vr!!LUsO?xX?<2??+kRS*dzBwRpzZDkdAcSB`K zcXuHdA$J``Jx6JG1x-gOcXxglemM;rM>i2AD@Qj`cXu8a9wR$5V;3zua}yT|yTW1|dAi)dfiwj%3I;(ugJ)c?fP6|M^7)|4S>%{@2vk{;zFp_+Q`D@V~pa`+x6*zW;p_`~Odz zJn8@J`E&ozT`=$e;$=(zuiv=g|HjRm{%_m9{r~R0d;cFka^(NfqeuUrICb*>sZ*!^ zpF4N%|Ah+|{$ILu>HoEB*Z$wRbLap4`}hApc=+J|!-o(5KYR7!|MS-`|G#+i>i@^j zpZ?D2r%U ztX^11UmXba!~`JPmADji)Ks;UITRs$V;NR$O$}W(NhsIYSd`bmfL{d8HCEx1kmglF U@QoEX*yNG8#>R58C|m>w08>(!E&u=k literal 0 HcmV?d00001 diff --git a/reactos/base/applications/mplay32/resources/forward.bmp b/reactos/base/applications/mplay32/resources/forward.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0e688e236d6cb6b70d8c611920cbbe80ff13e4c0 GIT binary patch literal 1334 zcmZ?rHDhG}12Yx|1`Qxf0E!tII3N;0@{k+^GcW=i^Ys)&DE&>;BibH2rUEYx&>Y(e{7Bq>2A0PMY+8($p#c zCr_F3f5LPiJ!AU+DYIt&pSfV(|Je)Y{hz;h(f^ezSN>nKY5o6on>PO6v~|n>tvk2> z-@SLw|6|9F{XcQ$)c=bYFaE!9`Qrb}*RK4(diCo6yN~Vz@q_Z+ow1r(KV0`jHoH56Q> z?R6EkU4@*4TwO(7>@Ac;T&n9pn{$nDDNEXJi~$mYc6>dM3*@9N6JD5K}<3g*k|0Br^n Lu54^Tc@hBtLe;>` literal 0 HcmV?d00001 diff --git a/reactos/base/applications/mplay32/resources/mplay32.ico b/reactos/base/applications/mplay32/resources/mplay32.ico new file mode 100644 index 0000000000000000000000000000000000000000..65f1ab9c47feea9d56a639b4524e6ec0e6bac162 GIT binary patch literal 40070 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 ZEZ*J*G7L-*zPGooB#>nQCSgLv(Exf1+ED-i literal 0 HcmV?d00001 diff --git a/reactos/base/applications/mplay32/resources/seekforw.bmp b/reactos/base/applications/mplay32/resources/seekforw.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fc627a1a9b144916f27311cf1ece3bce41477d69 GIT binary patch literal 1334 zcmZ?rHDhG}12Yx|1`Qxf0E!tII3N;0@{k+^GcW=i^Ys z)&Fbi>;Bg@HvF$|Y5L#T+Va1#t>u4nN8A4ilP3P3IBC-ViBl*4pEPyK|H)IP{GTu# zNY9x5e+mfCn)!b^5YJpN@Bi$D^Zw6Yyy*YRl`H?RUAON4noaBfuiLco|JI$`|L@+r z=l{V&2mc>BeE9#dW5@oVICJX%xr^ujU$}7L|HX?J|6jO#@&Dy(SN>nUdiDSH>(~EZ zzj@>T-ADI<_`&~Y&!7E&^78rrXRluTfA#wH|5tBb|9|`b-T!w${Ql#I{~tbn{Qu$8 z$NwL{eER?6=g({UUzkmP!|NGCM|9^n^-@kwVK>!$Pqj)q7hD{pqCKafF zH9$xZQ$)!KNGdC7g2lbP#auOH&Ai23_2jg`BK%&ib_!BJ(m`EX2PnerVPWm0&+B1s z@9oX$?&$1l2_oHWg%rKL+1x#CxP*bEJ)fYqskb+?3lE2yH>;-ryQ&GuKqdwm X18;8@MhQc(@!pcUKrWDk@JJ>BUA5X# literal 0 HcmV?d00001 diff --git a/reactos/base/applications/mplay32/resources/stop.bmp b/reactos/base/applications/mplay32/resources/stop.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7c6eb63098e5f9344ec0de74635a98ca5630472b GIT binary patch literal 1334 zcmeH{M^8dQ6onrOiXD4FEZDF+8-9R$R~C#S9YF*E%OCU)7=whT^o}4rKqG9(@xg$5 z_MGI*Jzs8Sl9}Ah;gM3rG^7+VjDk;+rUi_cHu&{bRX!Rxyh9={K7 z4YTn2S+F5L*l++Jks$oh5CX9%QtrRcS#TBZZf;L Xw!L>igp|8zA*31VKN(f4(MJ6P>ztO? literal 0 HcmV?d00001 diff --git a/reactos/base/applications/mplay32/rsrc.rc b/reactos/base/applications/mplay32/rsrc.rc new file mode 100644 index 00000000000..2cc4165ff8b --- /dev/null +++ b/reactos/base/applications/mplay32/rsrc.rc @@ -0,0 +1,4 @@ +#include +#include "resource.h" + +#include "lang/en-US.rc"