[ros-diffs] [dchapyshev] 39947: - Add simple multimedia player

dchapyshev at svn.reactos.org dchapyshev at svn.reactos.org
Wed Mar 11 11:22:16 CET 2009


Author: dchapyshev
Date: Wed Mar 11 13:22:15 2009
New Revision: 39947

URL: http://svn.reactos.org/svn/reactos?rev=39947&view=rev
Log:
- Add simple multimedia player

Added:
    trunk/reactos/base/applications/mplay32/   (with props)
    trunk/reactos/base/applications/mplay32/lang/   (with props)
    trunk/reactos/base/applications/mplay32/lang/en-US.rc   (with props)
    trunk/reactos/base/applications/mplay32/mplay32.c   (with props)
    trunk/reactos/base/applications/mplay32/mplay32.h   (with props)
    trunk/reactos/base/applications/mplay32/mplay32.rbuild   (with props)
    trunk/reactos/base/applications/mplay32/mplay32.rc   (with props)
    trunk/reactos/base/applications/mplay32/resource.h   (with props)
    trunk/reactos/base/applications/mplay32/resources/   (with props)
    trunk/reactos/base/applications/mplay32/resources/backward.bmp   (with props)
    trunk/reactos/base/applications/mplay32/resources/eject.bmp   (with props)
    trunk/reactos/base/applications/mplay32/resources/forward.bmp   (with props)
    trunk/reactos/base/applications/mplay32/resources/mplay32.ico   (with props)
    trunk/reactos/base/applications/mplay32/resources/pause.bmp   (with props)
    trunk/reactos/base/applications/mplay32/resources/play.bmp   (with props)
    trunk/reactos/base/applications/mplay32/resources/seekback.bmp   (with props)
    trunk/reactos/base/applications/mplay32/resources/seekforw.bmp   (with props)
    trunk/reactos/base/applications/mplay32/resources/stop.bmp   (with props)
    trunk/reactos/base/applications/mplay32/rsrc.rc   (with props)
Modified:
    trunk/reactos/base/applications/applications.rbuild

Modified: trunk/reactos/base/applications/applications.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/applications.rbuild?rev=39947&r1=39946&r2=39947&view=diff
==============================================================================
--- trunk/reactos/base/applications/applications.rbuild [iso-8859-1] (original)
+++ trunk/reactos/base/applications/applications.rbuild [iso-8859-1] Wed Mar 11 13:22:15 2009
@@ -33,6 +33,9 @@
 	</directory>
 	<directory name="logoff">
 		<xi:include href="logoff/logoff.rbuild" />
+	</directory>
+	<directory name="mplay32">
+		<xi:include href="mplay32/mplay32.rbuild" />
 	</directory>
 	<directory name="msconfig">
 		<xi:include href="msconfig/msconfig.rbuild" />

Propchange: trunk/reactos/base/applications/mplay32/
------------------------------------------------------------------------------
--- bugtraq:logregex (added)
+++ bugtraq:logregex Wed Mar 11 13:22:15 2009
@@ -1,0 +1,2 @@
+([Ii]ssue|[Bb]ug)s? #?(\d+)(,? ?#?(\d+))*(,? ?(and |or )?#?(\d+))?
+(\d+)

Propchange: trunk/reactos/base/applications/mplay32/
------------------------------------------------------------------------------
    bugtraq:message = See issue #%BUGID% for more details.

Propchange: trunk/reactos/base/applications/mplay32/
------------------------------------------------------------------------------
    bugtraq:url = http://www.reactos.org/bugzilla/show_bug.cgi?id=%BUGID%

Propchange: trunk/reactos/base/applications/mplay32/
------------------------------------------------------------------------------
    tsvn:logminsize = 10

Propchange: trunk/reactos/base/applications/mplay32/lang/
------------------------------------------------------------------------------
--- bugtraq:logregex (added)
+++ bugtraq:logregex Wed Mar 11 13:22:15 2009
@@ -1,0 +1,2 @@
+([Ii]ssue|[Bb]ug)s? #?(\d+)(,? ?#?(\d+))*(,? ?(and |or )?#?(\d+))?
+(\d+)

Propchange: trunk/reactos/base/applications/mplay32/lang/
------------------------------------------------------------------------------
    bugtraq:message = See issue #%BUGID% for more details.

Propchange: trunk/reactos/base/applications/mplay32/lang/
------------------------------------------------------------------------------
    bugtraq:url = http://www.reactos.org/bugzilla/show_bug.cgi?id=%BUGID%

Propchange: trunk/reactos/base/applications/mplay32/lang/
------------------------------------------------------------------------------
    tsvn:logminsize = 10

Added: trunk/reactos/base/applications/mplay32/lang/en-US.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mplay32/lang/en-US.rc?rev=39947&view=auto
==============================================================================
--- trunk/reactos/base/applications/mplay32/lang/en-US.rc (added)
+++ trunk/reactos/base/applications/mplay32/lang/en-US.rc [iso-8859-1] Wed Mar 11 13:22:15 2009
@@ -1,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

Propchange: trunk/reactos/base/applications/mplay32/lang/en-US.rc
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/base/applications/mplay32/mplay32.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mplay32/mplay32.c?rev=39947&view=auto
==============================================================================
--- trunk/reactos/base/applications/mplay32/mplay32.c (added)
+++ trunk/reactos/base/applications/mplay32/mplay32.c [iso-8859-1] Wed Mar 11 13:22:15 2009
@@ -1,0 +1,700 @@
+/*
+ * PROJECT:         ReactOS Multimedia Player
+ * FILE:            base\applications\mplay32\mplay32.c
+ * PROGRAMMERS:     Dmitry Chapyshev (dmitry at 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;
+}

Propchange: trunk/reactos/base/applications/mplay32/mplay32.c
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/base/applications/mplay32/mplay32.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mplay32/mplay32.h?rev=39947&view=auto
==============================================================================
--- trunk/reactos/base/applications/mplay32/mplay32.h (added)
+++ trunk/reactos/base/applications/mplay32/mplay32.h [iso-8859-1] Wed Mar 11 13:22:15 2009
@@ -1,0 +1,19 @@
+#include <windows.h>
+#include <commctrl.h>
+#include <tchar.h>
+
+#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;

Propchange: trunk/reactos/base/applications/mplay32/mplay32.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/base/applications/mplay32/mplay32.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mplay32/mplay32.rbuild?rev=39947&view=auto
==============================================================================
--- trunk/reactos/base/applications/mplay32/mplay32.rbuild (added)
+++ trunk/reactos/base/applications/mplay32/mplay32.rbuild [iso-8859-1] Wed Mar 11 13:22:15 2009
@@ -1,0 +1,12 @@
+<module name="mplay32" type="win32gui" installbase="system32" installname="mplay32.exe" unicode="yes">
+	<include base="mplay32">.</include>
+	<library>advapi32</library>
+	<library>comctl32</library>
+	<library>comdlg32</library>
+	<library>kernel32</library>
+	<library>user32</library>
+	<library>winmm</library>
+	<library>shell32</library>
+	<file>mplay32.c</file>
+	<file>mplay32.rc</file>
+</module>

Propchange: trunk/reactos/base/applications/mplay32/mplay32.rbuild
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/base/applications/mplay32/mplay32.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mplay32/mplay32.rc?rev=39947&view=auto
==============================================================================
--- trunk/reactos/base/applications/mplay32/mplay32.rc (added)
+++ trunk/reactos/base/applications/mplay32/mplay32.rc [iso-8859-1] Wed Mar 11 13:22:15 2009
@@ -1,0 +1,24 @@
+#include <windows.h>
+#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 <reactos/version.rc>
+
+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"

Propchange: trunk/reactos/base/applications/mplay32/mplay32.rc
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/base/applications/mplay32/resource.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mplay32/resource.h?rev=39947&view=auto
==============================================================================
--- trunk/reactos/base/applications/mplay32/resource.h (added)
+++ trunk/reactos/base/applications/mplay32/resource.h [iso-8859-1] Wed Mar 11 13:22:15 2009
@@ -1,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_ */

Propchange: trunk/reactos/base/applications/mplay32/resource.h
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: trunk/reactos/base/applications/mplay32/resources/
------------------------------------------------------------------------------
--- bugtraq:logregex (added)
+++ bugtraq:logregex Wed Mar 11 13:22:15 2009
@@ -1,0 +1,2 @@
+([Ii]ssue|[Bb]ug)s? #?(\d+)(,? ?#?(\d+))*(,? ?(and |or )?#?(\d+))?
+(\d+)

Propchange: trunk/reactos/base/applications/mplay32/resources/
------------------------------------------------------------------------------
    bugtraq:message = See issue #%BUGID% for more details.

Propchange: trunk/reactos/base/applications/mplay32/resources/
------------------------------------------------------------------------------
    bugtraq:url = http://www.reactos.org/bugzilla/show_bug.cgi?id=%BUGID%

Propchange: trunk/reactos/base/applications/mplay32/resources/
------------------------------------------------------------------------------
    tsvn:logminsize = 10

Added: trunk/reactos/base/applications/mplay32/resources/backward.bmp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mplay32/resources/backward.bmp?rev=39947&view=auto
==============================================================================
Binary file - no diff available.

Propchange: trunk/reactos/base/applications/mplay32/resources/backward.bmp
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: trunk/reactos/base/applications/mplay32/resources/eject.bmp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mplay32/resources/eject.bmp?rev=39947&view=auto
==============================================================================
Binary file - no diff available.

Propchange: trunk/reactos/base/applications/mplay32/resources/eject.bmp
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: trunk/reactos/base/applications/mplay32/resources/forward.bmp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mplay32/resources/forward.bmp?rev=39947&view=auto
==============================================================================
Binary file - no diff available.

Propchange: trunk/reactos/base/applications/mplay32/resources/forward.bmp
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: trunk/reactos/base/applications/mplay32/resources/mplay32.ico
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mplay32/resources/mplay32.ico?rev=39947&view=auto
==============================================================================
Binary file - no diff available.

Propchange: trunk/reactos/base/applications/mplay32/resources/mplay32.ico
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: trunk/reactos/base/applications/mplay32/resources/pause.bmp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mplay32/resources/pause.bmp?rev=39947&view=auto
==============================================================================
Binary file - no diff available.

Propchange: trunk/reactos/base/applications/mplay32/resources/pause.bmp
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: trunk/reactos/base/applications/mplay32/resources/play.bmp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mplay32/resources/play.bmp?rev=39947&view=auto
==============================================================================
Binary file - no diff available.

Propchange: trunk/reactos/base/applications/mplay32/resources/play.bmp
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: trunk/reactos/base/applications/mplay32/resources/seekback.bmp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mplay32/resources/seekback.bmp?rev=39947&view=auto
==============================================================================
Binary file - no diff available.

Propchange: trunk/reactos/base/applications/mplay32/resources/seekback.bmp
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: trunk/reactos/base/applications/mplay32/resources/seekforw.bmp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mplay32/resources/seekforw.bmp?rev=39947&view=auto
==============================================================================
Binary file - no diff available.

Propchange: trunk/reactos/base/applications/mplay32/resources/seekforw.bmp
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: trunk/reactos/base/applications/mplay32/resources/stop.bmp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mplay32/resources/stop.bmp?rev=39947&view=auto
==============================================================================
Binary file - no diff available.

Propchange: trunk/reactos/base/applications/mplay32/resources/stop.bmp
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: trunk/reactos/base/applications/mplay32/rsrc.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/mplay32/rsrc.rc?rev=39947&view=auto
==============================================================================
--- trunk/reactos/base/applications/mplay32/rsrc.rc (added)
+++ trunk/reactos/base/applications/mplay32/rsrc.rc [iso-8859-1] Wed Mar 11 13:22:15 2009
@@ -1,0 +1,4 @@
+#include <windows.h>
+#include "resource.h"
+
+#include "lang/en-US.rc"

Propchange: trunk/reactos/base/applications/mplay32/rsrc.rc
------------------------------------------------------------------------------
    svn:eol-style = native



More information about the Ros-diffs mailing list