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