1*f39251c4SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*f39251c4SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*f39251c4SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*f39251c4SAndrew Rist * distributed with this work for additional information 6*f39251c4SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*f39251c4SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*f39251c4SAndrew Rist * "License"); you may not use this file except in compliance 9*f39251c4SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*f39251c4SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*f39251c4SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*f39251c4SAndrew Rist * software distributed under the License is distributed on an 15*f39251c4SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*f39251c4SAndrew Rist * KIND, either express or implied. See the License for the 17*f39251c4SAndrew Rist * specific language governing permissions and limitations 18*f39251c4SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*f39251c4SAndrew Rist *************************************************************/ 21*f39251c4SAndrew Rist 22*f39251c4SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir #include <tools/prewin.h> 25cdf0e10cSrcweir #if defined _MSC_VER 26cdf0e10cSrcweir #pragma warning(push, 1) 27cdf0e10cSrcweir #pragma warning(disable: 4917) 28cdf0e10cSrcweir #endif 29cdf0e10cSrcweir #include <windows.h> 30cdf0e10cSrcweir #include <objbase.h> 31cdf0e10cSrcweir #include <strmif.h> 32cdf0e10cSrcweir #include <control.h> 33cdf0e10cSrcweir #include <uuids.h> 34cdf0e10cSrcweir #include <evcode.h> 35cdf0e10cSrcweir #if defined _MSC_VER 36cdf0e10cSrcweir #pragma warning(pop) 37cdf0e10cSrcweir #endif 38cdf0e10cSrcweir #include <tools/postwin.h> 39cdf0e10cSrcweir 40cdf0e10cSrcweir #include "player.hxx" 41cdf0e10cSrcweir #include "framegrabber.hxx" 42cdf0e10cSrcweir #include "window.hxx" 43cdf0e10cSrcweir 44cdf0e10cSrcweir #define AVMEDIA_WIN_PLAYER_IMPLEMENTATIONNAME "com.sun.star.comp.avmedia.Player_DirectX" 45cdf0e10cSrcweir #define AVMEDIA_WIN_PLAYER_SERVICENAME "com.sun.star.media.Player_DirectX" 46cdf0e10cSrcweir 47cdf0e10cSrcweir using namespace ::com::sun::star; 48cdf0e10cSrcweir 49cdf0e10cSrcweir namespace avmedia { namespace win { 50cdf0e10cSrcweir 51cdf0e10cSrcweir LRESULT CALLBACK MediaPlayerWndProc_2( HWND hWnd,UINT nMsg, WPARAM nPar1, LPARAM nPar2 ) 52cdf0e10cSrcweir { 53cdf0e10cSrcweir Player* pPlayer = (Player*) ::GetWindowLong( hWnd, 0 ); 54cdf0e10cSrcweir bool bProcessed = true; 55cdf0e10cSrcweir 56cdf0e10cSrcweir if( pPlayer ) 57cdf0e10cSrcweir { 58cdf0e10cSrcweir switch( nMsg ) 59cdf0e10cSrcweir { 60cdf0e10cSrcweir case( WM_GRAPHNOTIFY ): 61cdf0e10cSrcweir pPlayer->processEvent(); 62cdf0e10cSrcweir break; 63cdf0e10cSrcweir default: 64cdf0e10cSrcweir bProcessed = false; 65cdf0e10cSrcweir break; 66cdf0e10cSrcweir } 67cdf0e10cSrcweir } 68cdf0e10cSrcweir else 69cdf0e10cSrcweir bProcessed = false; 70cdf0e10cSrcweir 71cdf0e10cSrcweir return( bProcessed ? 0 : DefWindowProc( hWnd, nMsg, nPar1, nPar2 ) ); 72cdf0e10cSrcweir } 73cdf0e10cSrcweir 74cdf0e10cSrcweir 75cdf0e10cSrcweir bool isWindowsVistaOrHigher() 76cdf0e10cSrcweir { 77cdf0e10cSrcweir // POST: return true if we are at least on Windows Vista 78cdf0e10cSrcweir OSVERSIONINFO osvi; 79cdf0e10cSrcweir ZeroMemory(&osvi, sizeof(osvi)); 80cdf0e10cSrcweir osvi.dwOSVersionInfoSize = sizeof(osvi); 81cdf0e10cSrcweir GetVersionEx(&osvi); 82cdf0e10cSrcweir return osvi.dwMajorVersion >= 6; 83cdf0e10cSrcweir } 84cdf0e10cSrcweir 85cdf0e10cSrcweir // ---------------- 86cdf0e10cSrcweir // - Player - 87cdf0e10cSrcweir // ---------------- 88cdf0e10cSrcweir 89cdf0e10cSrcweir Player::Player( const uno::Reference< lang::XMultiServiceFactory >& rxMgr ) : 90cdf0e10cSrcweir Player_BASE(m_aMutex), 91cdf0e10cSrcweir mxMgr( rxMgr ), 92cdf0e10cSrcweir mpGB( NULL ), 93cdf0e10cSrcweir mpOMF( NULL ), 94cdf0e10cSrcweir mpMC( NULL ), 95cdf0e10cSrcweir mpME( NULL ), 96cdf0e10cSrcweir mpMS( NULL ), 97cdf0e10cSrcweir mpMP( NULL ), 98cdf0e10cSrcweir mpBA( NULL ), 99cdf0e10cSrcweir mpBV( NULL ), 100cdf0e10cSrcweir mpVW( NULL ), 101cdf0e10cSrcweir mpEV( NULL ), 102cdf0e10cSrcweir mnUnmutedVolume( 0 ), 103cdf0e10cSrcweir mnFrameWnd( 0 ), 104cdf0e10cSrcweir mbMuted( false ), 105cdf0e10cSrcweir mbLooping( false ), 106cdf0e10cSrcweir mbAddWindow(sal_True) 107cdf0e10cSrcweir { 108cdf0e10cSrcweir ::CoInitialize( NULL ); 109cdf0e10cSrcweir } 110cdf0e10cSrcweir 111cdf0e10cSrcweir // ------------------------------------------------------------------------------ 112cdf0e10cSrcweir 113cdf0e10cSrcweir Player::~Player() 114cdf0e10cSrcweir { 115cdf0e10cSrcweir if( mnFrameWnd ) 116cdf0e10cSrcweir ::DestroyWindow( (HWND) mnFrameWnd ); 117cdf0e10cSrcweir 118cdf0e10cSrcweir ::CoUninitialize(); 119cdf0e10cSrcweir } 120cdf0e10cSrcweir 121cdf0e10cSrcweir // ------------------------------------------------------------------------------ 122cdf0e10cSrcweir 123cdf0e10cSrcweir void SAL_CALL Player::disposing() 124cdf0e10cSrcweir { 125cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 126cdf0e10cSrcweir stop(); 127cdf0e10cSrcweir if( mpBA ) 128cdf0e10cSrcweir mpBA->Release(); 129cdf0e10cSrcweir 130cdf0e10cSrcweir if( mpBV ) 131cdf0e10cSrcweir mpBV->Release(); 132cdf0e10cSrcweir 133cdf0e10cSrcweir if( mpVW ) 134cdf0e10cSrcweir mpVW->Release(); 135cdf0e10cSrcweir 136cdf0e10cSrcweir if( mpMP ) 137cdf0e10cSrcweir mpMP->Release(); 138cdf0e10cSrcweir 139cdf0e10cSrcweir if( mpMS ) 140cdf0e10cSrcweir mpMS->Release(); 141cdf0e10cSrcweir 142cdf0e10cSrcweir if( mpME ) 143cdf0e10cSrcweir { 144cdf0e10cSrcweir mpME->SetNotifyWindow( 0, WM_GRAPHNOTIFY, 0); 145cdf0e10cSrcweir mpME->Release(); 146cdf0e10cSrcweir } 147cdf0e10cSrcweir 148cdf0e10cSrcweir 149cdf0e10cSrcweir if( mpMC ) 150cdf0e10cSrcweir mpMC->Release(); 151cdf0e10cSrcweir 152cdf0e10cSrcweir if( mpEV ) 153cdf0e10cSrcweir mpEV->Release(); 154cdf0e10cSrcweir 155cdf0e10cSrcweir if( mpOMF ) 156cdf0e10cSrcweir mpOMF->Release(); 157cdf0e10cSrcweir 158cdf0e10cSrcweir if( mpGB ) 159cdf0e10cSrcweir mpGB->Release(); 160cdf0e10cSrcweir } 161cdf0e10cSrcweir // ------------------------------------------------------------------------------ 162cdf0e10cSrcweir bool Player::create( const ::rtl::OUString& rURL ) 163cdf0e10cSrcweir { 164cdf0e10cSrcweir HRESULT hR; 165cdf0e10cSrcweir bool bRet = false; 166cdf0e10cSrcweir 167cdf0e10cSrcweir if( SUCCEEDED( hR = CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**) &mpGB ) ) ) 168cdf0e10cSrcweir { 169cdf0e10cSrcweir // Don't use the overlay mixer on Windows Vista 170cdf0e10cSrcweir // It disables the desktop composition as soon as RenderFile is called 171cdf0e10cSrcweir // also causes some other problems: video rendering is not reliable 172cdf0e10cSrcweir if( !isWindowsVistaOrHigher() && SUCCEEDED( CoCreateInstance( CLSID_OverlayMixer, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**) &mpOMF ) ) ) 173cdf0e10cSrcweir { 174cdf0e10cSrcweir mpGB->AddFilter( mpOMF, L"com_sun_star_media_OverlayMixerFilter" ); 175cdf0e10cSrcweir 176cdf0e10cSrcweir if( !SUCCEEDED( mpOMF->QueryInterface( IID_IDDrawExclModeVideo, (void**) &mpEV ) ) ) 177cdf0e10cSrcweir mpEV = NULL; 178cdf0e10cSrcweir } 179cdf0e10cSrcweir 180cdf0e10cSrcweir if( SUCCEEDED( hR = mpGB->RenderFile( reinterpret_cast<LPCWSTR>(rURL.getStr()), NULL ) ) && 181cdf0e10cSrcweir SUCCEEDED( hR = mpGB->QueryInterface( IID_IMediaControl, (void**) &mpMC ) ) && 182cdf0e10cSrcweir SUCCEEDED( hR = mpGB->QueryInterface( IID_IMediaEventEx, (void**) &mpME ) ) && 183cdf0e10cSrcweir SUCCEEDED( hR = mpGB->QueryInterface( IID_IMediaSeeking, (void**) &mpMS ) ) && 184cdf0e10cSrcweir SUCCEEDED( hR = mpGB->QueryInterface( IID_IMediaPosition, (void**) &mpMP ) ) ) 185cdf0e10cSrcweir { 186cdf0e10cSrcweir // Video interfaces 187cdf0e10cSrcweir mpGB->QueryInterface( IID_IVideoWindow, (void**) &mpVW ); 188cdf0e10cSrcweir mpGB->QueryInterface( IID_IBasicVideo, (void**) &mpBV ); 189cdf0e10cSrcweir 190cdf0e10cSrcweir // Audio interface 191cdf0e10cSrcweir mpGB->QueryInterface( IID_IBasicAudio, (void**) &mpBA ); 192cdf0e10cSrcweir 193cdf0e10cSrcweir if( mpBA ) 194cdf0e10cSrcweir mpBA->put_Volume( mnUnmutedVolume ); 195cdf0e10cSrcweir 196cdf0e10cSrcweir bRet = true; 197cdf0e10cSrcweir } 198cdf0e10cSrcweir } 199cdf0e10cSrcweir 200cdf0e10cSrcweir if( bRet ) 201cdf0e10cSrcweir maURL = rURL; 202cdf0e10cSrcweir else 203cdf0e10cSrcweir maURL = ::rtl::OUString(); 204cdf0e10cSrcweir 205cdf0e10cSrcweir return bRet; 206cdf0e10cSrcweir } 207cdf0e10cSrcweir 208cdf0e10cSrcweir // ------------------------------------------------------------------------------ 209cdf0e10cSrcweir 210cdf0e10cSrcweir const IVideoWindow* Player::getVideoWindow() const 211cdf0e10cSrcweir { 212cdf0e10cSrcweir return mpVW; 213cdf0e10cSrcweir } 214cdf0e10cSrcweir 215cdf0e10cSrcweir // ------------------------------------------------------------------------------ 216cdf0e10cSrcweir 217cdf0e10cSrcweir void Player::setNotifyWnd( int nNotifyWnd ) 218cdf0e10cSrcweir { 219cdf0e10cSrcweir mbAddWindow = sal_False; 220cdf0e10cSrcweir if( mpME ) 221cdf0e10cSrcweir mpME->SetNotifyWindow( (OAHWND) nNotifyWnd, WM_GRAPHNOTIFY, reinterpret_cast< LONG_PTR>( this ) ); 222cdf0e10cSrcweir } 223cdf0e10cSrcweir 224cdf0e10cSrcweir // ------------------------------------------------------------------------------ 225cdf0e10cSrcweir 226cdf0e10cSrcweir void Player::setDDrawParams( IDirectDraw* pDDraw, IDirectDrawSurface* pDDrawSurface ) 227cdf0e10cSrcweir { 228cdf0e10cSrcweir if( mpEV && pDDraw && pDDrawSurface ) 229cdf0e10cSrcweir { 230cdf0e10cSrcweir mpEV->SetDDrawObject( pDDraw ); 231cdf0e10cSrcweir mpEV->SetDDrawSurface( pDDrawSurface ); 232cdf0e10cSrcweir } 233cdf0e10cSrcweir } 234cdf0e10cSrcweir 235cdf0e10cSrcweir // ------------------------------------------------------------------------------ 236cdf0e10cSrcweir 237cdf0e10cSrcweir long Player::processEvent() 238cdf0e10cSrcweir { 239cdf0e10cSrcweir long nCode, nParam1, nParam2; 240cdf0e10cSrcweir 241cdf0e10cSrcweir while( mpME && SUCCEEDED( mpME->GetEvent( &nCode, &nParam1, &nParam2, 0 ) ) ) 242cdf0e10cSrcweir { 243cdf0e10cSrcweir if( EC_COMPLETE == nCode ) 244cdf0e10cSrcweir { 245cdf0e10cSrcweir if( mbLooping ) 246cdf0e10cSrcweir { 247cdf0e10cSrcweir setMediaTime( 0.0 ); 248cdf0e10cSrcweir start(); 249cdf0e10cSrcweir } 250cdf0e10cSrcweir else 251cdf0e10cSrcweir { 252cdf0e10cSrcweir setMediaTime( getDuration() ); 253cdf0e10cSrcweir stop(); 254cdf0e10cSrcweir } 255cdf0e10cSrcweir } 256cdf0e10cSrcweir 257cdf0e10cSrcweir mpME->FreeEventParams( nCode, nParam1, nParam2 ); 258cdf0e10cSrcweir } 259cdf0e10cSrcweir 260cdf0e10cSrcweir return 0; 261cdf0e10cSrcweir } 262cdf0e10cSrcweir 263cdf0e10cSrcweir // ------------------------------------------------------------------------------ 264cdf0e10cSrcweir 265cdf0e10cSrcweir void SAL_CALL Player::start( ) 266cdf0e10cSrcweir throw (uno::RuntimeException) 267cdf0e10cSrcweir { 268cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 269cdf0e10cSrcweir if( mpMC ) 270cdf0e10cSrcweir { 271cdf0e10cSrcweir if ( mbAddWindow ) 272cdf0e10cSrcweir { 273cdf0e10cSrcweir static WNDCLASS* mpWndClass = NULL; 274cdf0e10cSrcweir if ( !mpWndClass ) 275cdf0e10cSrcweir { 276cdf0e10cSrcweir mpWndClass = new WNDCLASS; 277cdf0e10cSrcweir 278cdf0e10cSrcweir memset( mpWndClass, 0, sizeof( *mpWndClass ) ); 279cdf0e10cSrcweir mpWndClass->hInstance = GetModuleHandle( NULL ); 280cdf0e10cSrcweir mpWndClass->cbWndExtra = sizeof( DWORD ); 281cdf0e10cSrcweir mpWndClass->lpfnWndProc = MediaPlayerWndProc_2; 282cdf0e10cSrcweir mpWndClass->lpszClassName = "com_sun_star_media_Sound_Player"; 283cdf0e10cSrcweir mpWndClass->hbrBackground = (HBRUSH) ::GetStockObject( BLACK_BRUSH ); 284cdf0e10cSrcweir mpWndClass->hCursor = ::LoadCursor( NULL, IDC_ARROW ); 285cdf0e10cSrcweir 286cdf0e10cSrcweir ::RegisterClass( mpWndClass ); 287cdf0e10cSrcweir } 288cdf0e10cSrcweir if ( !mnFrameWnd ) 289cdf0e10cSrcweir { 290cdf0e10cSrcweir mnFrameWnd = (int) ::CreateWindow( mpWndClass->lpszClassName, NULL, 291cdf0e10cSrcweir 0, 292cdf0e10cSrcweir 0, 0, 0, 0, 293cdf0e10cSrcweir (HWND) NULL, NULL, mpWndClass->hInstance, 0 ); 294cdf0e10cSrcweir if ( mnFrameWnd ) 295cdf0e10cSrcweir { 296cdf0e10cSrcweir ::ShowWindow((HWND) mnFrameWnd, SW_HIDE); 297cdf0e10cSrcweir ::SetWindowLong( (HWND) mnFrameWnd, 0, (DWORD) this ); 298cdf0e10cSrcweir // mpVW->put_Owner( (OAHWND) mnFrameWnd ); 299cdf0e10cSrcweir setNotifyWnd( mnFrameWnd ); 300cdf0e10cSrcweir } 301cdf0e10cSrcweir } 302cdf0e10cSrcweir } 303cdf0e10cSrcweir 304cdf0e10cSrcweir mpMC->Run(); 305cdf0e10cSrcweir } 306cdf0e10cSrcweir } 307cdf0e10cSrcweir 308cdf0e10cSrcweir // ------------------------------------------------------------------------------ 309cdf0e10cSrcweir 310cdf0e10cSrcweir void SAL_CALL Player::stop( ) 311cdf0e10cSrcweir throw (uno::RuntimeException) 312cdf0e10cSrcweir { 313cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 314cdf0e10cSrcweir 315cdf0e10cSrcweir if( mpMC ) 316cdf0e10cSrcweir mpMC->Stop(); 317cdf0e10cSrcweir } 318cdf0e10cSrcweir 319cdf0e10cSrcweir // ------------------------------------------------------------------------------ 320cdf0e10cSrcweir 321cdf0e10cSrcweir sal_Bool SAL_CALL Player::isPlaying() 322cdf0e10cSrcweir throw (uno::RuntimeException) 323cdf0e10cSrcweir { 324cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 325cdf0e10cSrcweir 326cdf0e10cSrcweir OAFilterState eFilterState; 327cdf0e10cSrcweir bool bRet = false; 328cdf0e10cSrcweir 329cdf0e10cSrcweir if( mpMC && SUCCEEDED( mpMC->GetState( 10, &eFilterState ) ) ) 330cdf0e10cSrcweir bRet = ( State_Running == eFilterState ); 331cdf0e10cSrcweir 332cdf0e10cSrcweir return bRet; 333cdf0e10cSrcweir } 334cdf0e10cSrcweir 335cdf0e10cSrcweir // ------------------------------------------------------------------------------ 336cdf0e10cSrcweir 337cdf0e10cSrcweir double SAL_CALL Player::getDuration( ) 338cdf0e10cSrcweir throw (uno::RuntimeException) 339cdf0e10cSrcweir { 340cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 341cdf0e10cSrcweir 342cdf0e10cSrcweir REFTIME aRefTime( 0.0 ); 343cdf0e10cSrcweir 344cdf0e10cSrcweir if( mpMP ) 345cdf0e10cSrcweir mpMP->get_Duration( &aRefTime ); 346cdf0e10cSrcweir 347cdf0e10cSrcweir return aRefTime; 348cdf0e10cSrcweir } 349cdf0e10cSrcweir 350cdf0e10cSrcweir // ------------------------------------------------------------------------------ 351cdf0e10cSrcweir 352cdf0e10cSrcweir void SAL_CALL Player::setMediaTime( double fTime ) 353cdf0e10cSrcweir throw (uno::RuntimeException) 354cdf0e10cSrcweir { 355cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 356cdf0e10cSrcweir 357cdf0e10cSrcweir if( mpMP ) 358cdf0e10cSrcweir { 359cdf0e10cSrcweir const bool bPlaying = isPlaying(); 360cdf0e10cSrcweir 361cdf0e10cSrcweir mpMP->put_CurrentPosition( fTime ); 362cdf0e10cSrcweir 363cdf0e10cSrcweir if( !bPlaying && mpMC ) 364cdf0e10cSrcweir mpMC->StopWhenReady(); 365cdf0e10cSrcweir } 366cdf0e10cSrcweir } 367cdf0e10cSrcweir 368cdf0e10cSrcweir // ------------------------------------------------------------------------------ 369cdf0e10cSrcweir 370cdf0e10cSrcweir double SAL_CALL Player::getMediaTime( ) 371cdf0e10cSrcweir throw (uno::RuntimeException) 372cdf0e10cSrcweir { 373cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 374cdf0e10cSrcweir 375cdf0e10cSrcweir REFTIME aRefTime( 0.0 ); 376cdf0e10cSrcweir 377cdf0e10cSrcweir if( mpMP ) 378cdf0e10cSrcweir mpMP->get_CurrentPosition( &aRefTime ); 379cdf0e10cSrcweir 380cdf0e10cSrcweir return aRefTime; 381cdf0e10cSrcweir } 382cdf0e10cSrcweir 383cdf0e10cSrcweir // ------------------------------------------------------------------------------ 384cdf0e10cSrcweir 385cdf0e10cSrcweir void SAL_CALL Player::setStopTime( double fTime ) 386cdf0e10cSrcweir throw (uno::RuntimeException) 387cdf0e10cSrcweir { 388cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 389cdf0e10cSrcweir 390cdf0e10cSrcweir if( mpMP ) 391cdf0e10cSrcweir mpMP->put_StopTime( fTime ); 392cdf0e10cSrcweir } 393cdf0e10cSrcweir 394cdf0e10cSrcweir // ------------------------------------------------------------------------------ 395cdf0e10cSrcweir 396cdf0e10cSrcweir double SAL_CALL Player::getStopTime( ) 397cdf0e10cSrcweir throw (uno::RuntimeException) 398cdf0e10cSrcweir { 399cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 400cdf0e10cSrcweir 401cdf0e10cSrcweir REFTIME aRefTime( 0.0 ); 402cdf0e10cSrcweir 403cdf0e10cSrcweir if( mpMP ) 404cdf0e10cSrcweir mpMP->get_StopTime( &aRefTime ); 405cdf0e10cSrcweir 406cdf0e10cSrcweir return aRefTime; 407cdf0e10cSrcweir } 408cdf0e10cSrcweir 409cdf0e10cSrcweir // ------------------------------------------------------------------------------ 410cdf0e10cSrcweir 411cdf0e10cSrcweir void SAL_CALL Player::setRate( double fRate ) 412cdf0e10cSrcweir throw (uno::RuntimeException) 413cdf0e10cSrcweir { 414cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 415cdf0e10cSrcweir 416cdf0e10cSrcweir if( mpMP ) 417cdf0e10cSrcweir mpMP->put_Rate( fRate ); 418cdf0e10cSrcweir } 419cdf0e10cSrcweir 420cdf0e10cSrcweir // ------------------------------------------------------------------------------ 421cdf0e10cSrcweir 422cdf0e10cSrcweir double SAL_CALL Player::getRate( ) 423cdf0e10cSrcweir throw (uno::RuntimeException) 424cdf0e10cSrcweir { 425cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 426cdf0e10cSrcweir 427cdf0e10cSrcweir double fRet( 0.0 ); 428cdf0e10cSrcweir 429cdf0e10cSrcweir if( mpMP ) 430cdf0e10cSrcweir mpMP->get_Rate( &fRet ); 431cdf0e10cSrcweir 432cdf0e10cSrcweir return fRet; 433cdf0e10cSrcweir } 434cdf0e10cSrcweir 435cdf0e10cSrcweir // ------------------------------------------------------------------------------ 436cdf0e10cSrcweir 437cdf0e10cSrcweir void SAL_CALL Player::setPlaybackLoop( sal_Bool bSet ) 438cdf0e10cSrcweir throw (uno::RuntimeException) 439cdf0e10cSrcweir { 440cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 441cdf0e10cSrcweir 442cdf0e10cSrcweir mbLooping = bSet; 443cdf0e10cSrcweir } 444cdf0e10cSrcweir 445cdf0e10cSrcweir // ------------------------------------------------------------------------------ 446cdf0e10cSrcweir 447cdf0e10cSrcweir sal_Bool SAL_CALL Player::isPlaybackLoop( ) 448cdf0e10cSrcweir throw (uno::RuntimeException) 449cdf0e10cSrcweir { 450cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 451cdf0e10cSrcweir 452cdf0e10cSrcweir return mbLooping; 453cdf0e10cSrcweir } 454cdf0e10cSrcweir 455cdf0e10cSrcweir // ------------------------------------------------------------------------------ 456cdf0e10cSrcweir 457cdf0e10cSrcweir void SAL_CALL Player::setMute( sal_Bool bSet ) 458cdf0e10cSrcweir throw (uno::RuntimeException) 459cdf0e10cSrcweir { 460cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 461cdf0e10cSrcweir 462cdf0e10cSrcweir if( mpBA && ( mbMuted != bSet ) ) 463cdf0e10cSrcweir { 464cdf0e10cSrcweir mbMuted = bSet; 465cdf0e10cSrcweir mpBA->put_Volume( mbMuted ? -10000 : mnUnmutedVolume ); 466cdf0e10cSrcweir } 467cdf0e10cSrcweir } 468cdf0e10cSrcweir 469cdf0e10cSrcweir // ------------------------------------------------------------------------------ 470cdf0e10cSrcweir 471cdf0e10cSrcweir sal_Bool SAL_CALL Player::isMute( ) 472cdf0e10cSrcweir throw (uno::RuntimeException) 473cdf0e10cSrcweir { 474cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 475cdf0e10cSrcweir 476cdf0e10cSrcweir return mbMuted; 477cdf0e10cSrcweir } 478cdf0e10cSrcweir 479cdf0e10cSrcweir // ------------------------------------------------------------------------------ 480cdf0e10cSrcweir 481cdf0e10cSrcweir void SAL_CALL Player::setVolumeDB( sal_Int16 nVolumeDB ) 482cdf0e10cSrcweir throw (uno::RuntimeException) 483cdf0e10cSrcweir { 484cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 485cdf0e10cSrcweir 486cdf0e10cSrcweir mnUnmutedVolume = static_cast< long >( nVolumeDB ) * 100; 487cdf0e10cSrcweir 488cdf0e10cSrcweir if( !mbMuted && mpBA ) 489cdf0e10cSrcweir mpBA->put_Volume( mnUnmutedVolume ); 490cdf0e10cSrcweir } 491cdf0e10cSrcweir 492cdf0e10cSrcweir // ------------------------------------------------------------------------------ 493cdf0e10cSrcweir 494cdf0e10cSrcweir sal_Int16 SAL_CALL Player::getVolumeDB( ) 495cdf0e10cSrcweir throw (uno::RuntimeException) 496cdf0e10cSrcweir { 497cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 498cdf0e10cSrcweir 499cdf0e10cSrcweir return( static_cast< sal_Int16 >( mnUnmutedVolume / 100 ) ); 500cdf0e10cSrcweir } 501cdf0e10cSrcweir 502cdf0e10cSrcweir // ------------------------------------------------------------------------------ 503cdf0e10cSrcweir 504cdf0e10cSrcweir awt::Size SAL_CALL Player::getPreferredPlayerWindowSize( ) 505cdf0e10cSrcweir throw (uno::RuntimeException) 506cdf0e10cSrcweir { 507cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 508cdf0e10cSrcweir 509cdf0e10cSrcweir awt::Size aSize( 0, 0 ); 510cdf0e10cSrcweir 511cdf0e10cSrcweir if( mpBV ) 512cdf0e10cSrcweir { 513cdf0e10cSrcweir long nWidth = 0, nHeight = 0; 514cdf0e10cSrcweir 515cdf0e10cSrcweir mpBV->GetVideoSize( &nWidth, &nHeight ); 516cdf0e10cSrcweir aSize.Width = nWidth; 517cdf0e10cSrcweir aSize.Height = nHeight; 518cdf0e10cSrcweir } 519cdf0e10cSrcweir 520cdf0e10cSrcweir return aSize; 521cdf0e10cSrcweir } 522cdf0e10cSrcweir 523cdf0e10cSrcweir // ------------------------------------------------------------------------------ 524cdf0e10cSrcweir 525cdf0e10cSrcweir uno::Reference< ::media::XPlayerWindow > SAL_CALL Player::createPlayerWindow( const uno::Sequence< uno::Any >& aArguments ) 526cdf0e10cSrcweir throw (uno::RuntimeException) 527cdf0e10cSrcweir { 528cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 529cdf0e10cSrcweir 530cdf0e10cSrcweir uno::Reference< ::media::XPlayerWindow > xRet; 531cdf0e10cSrcweir awt::Size aSize( getPreferredPlayerWindowSize() ); 532cdf0e10cSrcweir 533cdf0e10cSrcweir if( mpVW && aSize.Width > 0 && aSize.Height > 0 ) 534cdf0e10cSrcweir { 535cdf0e10cSrcweir ::avmedia::win::Window* pWindow = new ::avmedia::win::Window( mxMgr, *this ); 536cdf0e10cSrcweir 537cdf0e10cSrcweir xRet = pWindow; 538cdf0e10cSrcweir 539cdf0e10cSrcweir if( !pWindow->create( aArguments ) ) 540cdf0e10cSrcweir xRet = uno::Reference< ::media::XPlayerWindow >(); 541cdf0e10cSrcweir } 542cdf0e10cSrcweir 543cdf0e10cSrcweir return xRet; 544cdf0e10cSrcweir } 545cdf0e10cSrcweir 546cdf0e10cSrcweir // ------------------------------------------------------------------------------ 547cdf0e10cSrcweir 548cdf0e10cSrcweir uno::Reference< media::XFrameGrabber > SAL_CALL Player::createFrameGrabber( ) 549cdf0e10cSrcweir throw (uno::RuntimeException) 550cdf0e10cSrcweir { 551cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aMutex); 552cdf0e10cSrcweir 553cdf0e10cSrcweir uno::Reference< media::XFrameGrabber > xRet; 554cdf0e10cSrcweir 555cdf0e10cSrcweir if( maURL.getLength() > 0 ) 556cdf0e10cSrcweir { 557cdf0e10cSrcweir FrameGrabber* pGrabber = new FrameGrabber( mxMgr ); 558cdf0e10cSrcweir 559cdf0e10cSrcweir xRet = pGrabber; 560cdf0e10cSrcweir 561cdf0e10cSrcweir if( !pGrabber->create( maURL ) ) 562cdf0e10cSrcweir xRet.clear(); 563cdf0e10cSrcweir } 564cdf0e10cSrcweir 565cdf0e10cSrcweir return xRet; 566cdf0e10cSrcweir } 567cdf0e10cSrcweir 568cdf0e10cSrcweir // ------------------------------------------------------------------------------ 569cdf0e10cSrcweir 570cdf0e10cSrcweir ::rtl::OUString SAL_CALL Player::getImplementationName( ) 571cdf0e10cSrcweir throw (uno::RuntimeException) 572cdf0e10cSrcweir { 573cdf0e10cSrcweir return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( AVMEDIA_WIN_PLAYER_IMPLEMENTATIONNAME ) ); 574cdf0e10cSrcweir } 575cdf0e10cSrcweir 576cdf0e10cSrcweir // ------------------------------------------------------------------------------ 577cdf0e10cSrcweir 578cdf0e10cSrcweir sal_Bool SAL_CALL Player::supportsService( const ::rtl::OUString& ServiceName ) 579cdf0e10cSrcweir throw (uno::RuntimeException) 580cdf0e10cSrcweir { 581cdf0e10cSrcweir return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( AVMEDIA_WIN_PLAYER_SERVICENAME ) ); 582cdf0e10cSrcweir } 583cdf0e10cSrcweir 584cdf0e10cSrcweir // ------------------------------------------------------------------------------ 585cdf0e10cSrcweir 586cdf0e10cSrcweir uno::Sequence< ::rtl::OUString > SAL_CALL Player::getSupportedServiceNames( ) 587cdf0e10cSrcweir throw (uno::RuntimeException) 588cdf0e10cSrcweir { 589cdf0e10cSrcweir uno::Sequence< ::rtl::OUString > aRet(1); 590cdf0e10cSrcweir aRet[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( AVMEDIA_WIN_PLAYER_SERVICENAME ) ); 591cdf0e10cSrcweir 592cdf0e10cSrcweir return aRet; 593cdf0e10cSrcweir } 594cdf0e10cSrcweir 595cdf0e10cSrcweir } // namespace win 596cdf0e10cSrcweir } // namespace avmedia 597