Simple Media Player for C++
The following code demonstrates a simple media player application. It utilizes most of the functions available in the ltmmPlay object.
g_pPlay->get_SourceType (&l); if(l == ltmmPlay_Source_Array) { _stprintf(sz, _T("Stopped - [array]")); } else if(l == ltmmPlay_Source_HGlobal) { _stprintf(sz, _T("Stopped - [hglobal]")); } else { g_pPlay->get_SourceFile (&bstr); _stprintf(sz, _T("Stopped - [%ls]"), bstr); SysFreeString(bstr); } SetWindowText(hwnd, sz); break; case ltmmPlay_State_Paused: g_pPlay->get_SourceType (&l); if(l == ltmmPlay_Source_Array) { _stprintf(sz, _T("Paused - [array]")); } else if(l == ltmmPlay_Source_HGlobal) { _stprintf(sz, _T("Paused - [hglobal]")); } else { g_pPlay->get_SourceFile (&bstr); _stprintf(sz, _T("Paused - [%ls]"), bstr); SysFreeString(bstr); } SetWindowText(hwnd, sz); break; case ltmmPlay_State_Running: _stprintf(sz, _T("Playing")); SetWindowText(hwnd, sz); break; } break; case ltmmPlay_Notify_Error: _stprintf(sz, _T("Error 0x%.8X. Playback stopped."), lParam); MessageBox(hwnd, sz, _T("Play"), MB_ICONEXCLAMATION | MB_OK); break; } return 0; break; case WM_KEYDOWN: if(wParam == VK_ESCAPE) { // if fullscreen mode then exit it g_pPlay->get_FullScreenMode (&f); if(f) { g_pPlay->put_FullScreenMode(VARIANT_FALSE); return 0; } } break; case WM_DESTROY: FreeSource(); // no more notifications g_pPlay->SetNotifyWindow ((long) NULL, 0); PostQuitMessage(0); break; case WM_COMMAND: switch(LOWORD(wParam)) { case ID_CONTROL_POSITIONVIEW_TIME: g_nPositionView = POSITIONVIEW_TIME; break; case ID_CONTROL_POSITIONVIEW_FRAME: g_nPositionView = POSITIONVIEW_FRAME; break; case ID_CONTROL_POSITIONVIEW_TRACKING: g_nPositionView = POSITIONVIEW_TRACKING; break; case ID_CONTROL_AUTOSTART: // toggle auto start g_pPlay->get_AutoStart (&f); g_pPlay->put_AutoStart (f ? VARIANT_FALSE : VARIANT_TRUE); return 0; break; case ID_CONTROL_PLAY: // play file g_pPlay->Run (); return 0; break; case ID_CONTROL_PAUSE: // pause playback g_pPlay->Pause (); return 0; break; case ID_CONTROL_STOP: // stop playback g_pPlay->Stop (); return 0; break; case ID_CONTROL_HALFSPEED: // set to half the normal playback speed g_pPlay->put_Rate (0.5); return 0; break; case ID_CONTROL_NORMALSPEED: // set to normal speed g_pPlay->put_Rate (1.0); return 0; break; case ID_CONTROL_SEEKSTART: // seek to file start g_pPlay->SeekStart (); return 0; break; case ID_CONTROL_SEEKEND: // seek to file end g_pPlay->SeekEnd (); return 0; break; case ID_CONTROL_SEEKSELECTIONSTART: // seek to the start of the current selection g_pPlay->SeekSelectionStart (); return 0; break; case ID_CONTROL_SEEKSELECTIONEND: // seek to the end of the current selection g_pPlay->SeekSelectionEnd (); return 0; break; case ID_CONTROL_SETSELECTIONSTART: // set the start of the selection to the current position g_pPlay->MarkSelectionStart (); return 0; break; case ID_CONTROL_SETSELECTIONEND: // set the end of the selection to the current position g_pPlay->MarkSelectionEnd (); return 0; break; case ID_CONTROL_CLEARSELECTION: // clear the current selection g_pPlay->get_Duration(&d); g_pPlay->put_SelectionStart (0.0); g_pPlay->put_SelectionEnd (d); return 0; break; case ID_CONTROL_NEXTFRAME: // goto the next frame g_pPlay->NextFrame (); return 0; break; case ID_CONTROL_PREVIOUSFRAME: // goto the previous frame g_pPlay->PreviousFrame (); return 0; break; case ID_CONTROL_FIRSTFRAME: // go to the first frame g_pPlay->put_CurrentFramePosition (0); return 0; break; case ID_CONTROL_LASTFRAME: // go to the last frame g_pPlay->get_FrameDuration (&l); g_pPlay->put_CurrentFramePosition (l - 1); return 0; break; case ID_CONTROL_STEPFORWARD1SEC: // step forward 1 second g_pPlay->get_CurrentPosition (&d); g_pPlay->put_CurrentPosition (d + 1.0); return 0; break; case ID_CONTROL_STEPFORWARD10: // step forward 10% g_pPlay->get_CurrentTrackingPosition (&l); g_pPlay->put_CurrentTrackingPosition (l + 1000); return 0; break; case ID_CONTROL_FITTOWINDOW: // fit the video to the window g_pPlay->put_VideoWindowSizeMode (ltmmFit); return 0; break; case ID_CONTROL_STRETCHTOWINDOW: // stretch the video to the window g_pPlay->put_VideoWindowSizeMode (ltmmStretch); return 0; break; case ID_CONTROL_MUTE: // toggle mute g_pPlay->get_Mute(&f); g_pPlay->put_Mute (f ? VARIANT_FALSE : VARIANT_TRUE); return 0; break; case ID_CONTROL_INCREASEVOLUME: // increase the volume g_pPlay->get_Volume (&l); g_pPlay->put_Volume (min(0, l + 300)); return 0; break; case ID_CONTROL_DECREASEVOLUME: // decrease the volume g_pPlay->get_Volume (&l); g_pPlay->put_Volume (max(-10000, l - 300)); return 0; break; case ID_CONTROL_PANRIGHT: // pan balance to the right g_pPlay->get_Balance (&l); g_pPlay->put_Balance (min(10000, l + 300)); return 0; break; case ID_CONTROL_PANLEFT: // pan balance to the left g_pPlay->get_Balance (&l); g_pPlay->put_Balance (max(-10000, l - 300)); return 0; break; case ID_CONTROL_LOOP: // toggle looping g_pPlay->get_PlayCount (&l); g_pPlay->put_PlayCount (l ? 0 : 1); return 0; break; case ID_CONTROL_FULLSCREEN: // toggle fullscreen mode g_pPlay->ToggleFullScreenMode (); return 0; break; case ID_CONTROL_AUTOREWIND: // toggle auto rewind g_pPlay->get_AutoRewind (&f); g_pPlay->put_AutoRewind (f ? VARIANT_FALSE : VARIANT_TRUE); return 0; break; case ID_CONTROL_PROCESSORS_VIDEO: // invoke video processor dialog box g_pPlay->ShowDialog(ltmmPlay_Dlg_VideoProcessors, (long) hwnd); return 0; break; case ID_CONTROL_PROCESSORS_AUDIO: // invoke audio processor dialog box g_pPlay->ShowDialog(ltmmPlay_Dlg_AudioProcessors, (long) hwnd); return 0; break; case ID_CONTROL_SOURCE_FILE: // set the source file FreeSource(); bstr = SysAllocString(L"c:\\source.avi"); g_pPlay->put_SourceFile (bstr); SysFreeString(bstr); SnapFrameToVideo(); return 0; break; case ID_CONTROL_SOURCE_ARRAY: // set the source array FreeSource(); SetSourceArray(); SnapFrameToVideo(); return 0; break; case ID_CONTROL_SOURCE_HGLOBAL: // set the source hglobal FreeSource(); SetSourceHGlobal(); SnapFrameToVideo(); return 0; break; case ID_CONTROL_MEDIAINFORMATION: // display available media information p = sz; g_pPlay->get_Title (&bstr); p += _stprintf(p, _T("Title = '%ls'"), bstr ? bstr : L""); SysFreeString(bstr); g_pPlay->get_Author (&bstr); p += _stprintf(p, _T(", Author = '%ls'"), bstr ? bstr : L""); SysFreeString(bstr); g_pPlay->get_Copyright (&bstr); p += _stprintf(p, _T(", Copyright = '%ls'"), bstr ? bstr : L""); SysFreeString(bstr); g_pPlay->get_Description (&bstr); p += _stprintf(p, _T(", Description = '%ls'"), bstr ? bstr : L""); SysFreeString(bstr); g_pPlay->get_Rating (&bstr); p += _stprintf(p, _T(", Rating = '%ls'"), bstr ? bstr : L""); SysFreeString(bstr); MessageBox(hwnd, sz, _T("Media Information"), MB_OK); return 0; break; } break; case WM_LBUTTONDOWN: // perform play/pause if the user clicks in the video window g_pPlay->get_VideoWindowLeft (&x); g_pPlay->get_VideoWindowTop (&y); g_pPlay->get_VideoWindowWidth (&cx); g_pPlay->get_VideoWindowHeight (&cy); SetRect(&rc, x, y, x + cx, y + cy); pt.x = (short) LOWORD(lParam); pt.y = (short) HIWORD(lParam); if(PtInRect(&rc, pt)) { g_pPlay->get_State (&l); if(l == ltmmPlay_State_Stopped || l == ltmmPlay_State_Paused) g_pPlay->Run (); else if(l == ltmmPlay_State_Running) g_pPlay->Pause (); } return 0; break; } return DefWindowProc(hwnd, message, wParam, lParam); }int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; HRESULT hr; WNDCLASSEX wcex; g_hInstance = hInstance; // initialize COM library hr = CoInitialize(NULL); if(FAILED(hr)) goto error; // register the video frame window class wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = PlayWndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = g_hInstance; wcex.hIcon = NULL; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1); wcex.lpszMenuName = (LPCSTR)IDR_MENU; wcex.lpszClassName = SZ_WNDCLASS_PLAY; wcex.hIconSm = NULL; if(!RegisterClassEx(&wcex)) goto error; // create the play object hr = CoCreateInstance(CLSID_ltmmPlay, NULL, CLSCTX_INPROC_SERVER, IID_IltmmPlay, (void**) &g_pPlay); if(FAILED(hr)) goto error; // create the video frame window if(!CreateWindow(SZ_WNDCLASS_PLAY, _T("Play"), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, g_hInstance, NULL)) goto error; ShowWindow(g_hwndPlay, nCmdShow); UpdateWindow(g_hwndPlay); // process until done while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } error: if(g_pPlay) g_pPlay->Release(); CoUninitialize(); return 0; }