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