Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #include "mediawindowbase_impl.hxx"
30 : : #include <avmedia/mediaitem.hxx>
31 : : #include "mediamisc.hxx"
32 : : #include "mediawindow.hrc"
33 : : #include <rtl/oustringostreaminserter.hxx>
34 : : #include <sal/log.hxx>
35 : : #include <tools/urlobj.hxx>
36 : : #include <comphelper/processfactory.hxx>
37 : : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
38 : : #include <com/sun/star/lang/XComponent.hpp>
39 : : #include <com/sun/star/media/XManager.hpp>
40 : :
41 : : using namespace ::com::sun::star;
42 : :
43 : : namespace avmedia { namespace priv {
44 : :
45 : : // -----------------------
46 : : // - MediaWindowBaseImpl -
47 : : // -----------------------
48 : :
49 : :
50 : 0 : MediaWindowBaseImpl::MediaWindowBaseImpl( MediaWindow* pMediaWindow )
51 : 0 : : mpMediaWindow( pMediaWindow )
52 : : {
53 : 0 : }
54 : :
55 : : // ---------------------------------------------------------------------
56 : :
57 : 0 : MediaWindowBaseImpl::~MediaWindowBaseImpl()
58 : : {
59 [ # # ]: 0 : uno::Reference< lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
60 [ # # ]: 0 : }
61 : :
62 : : // -------------------------------------------------------------------------
63 : :
64 : 0 : uno::Reference< media::XPlayer > MediaWindowBaseImpl::createPlayer( const ::rtl::OUString& rURL )
65 : : {
66 [ # # ]: 0 : uno::Reference< lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
67 : 0 : uno::Reference< media::XPlayer > xPlayer;
68 : :
69 [ # # ]: 0 : if( xFactory.is() )
70 : : {
71 : : try
72 : : {
73 : 0 : uno::Reference< ::com::sun::star::media::XManager > xManager;
74 : :
75 : : try {
76 : : xManager = uno::Reference< ::com::sun::star::media::XManager >(
77 [ # # ]: 0 : xFactory->createInstance( AVMEDIA_MANAGER_SERVICE_NAME ),
78 [ # # ][ # # ]: 0 : uno::UNO_QUERY );
[ # # ][ # # ]
79 [ # # ]: 0 : } catch ( const uno::Exception & ) {
80 : : }
81 : :
82 : : // a fallback path just for gstreamer which has
83 : : // two significant versions deployed at once ...
84 : : #ifdef AVMEDIA_MANAGER_SERVICE_NAME_OLD
85 [ # # ]: 0 : if( !xManager.is() )
86 : : {
87 : : xManager = uno::Reference< ::com::sun::star::media::XManager >(
88 [ # # ]: 0 : xFactory->createInstance( AVMEDIA_MANAGER_SERVICE_NAME_OLD ),
89 [ # # ][ # # ]: 0 : uno::UNO_QUERY );
[ # # ]
90 : : }
91 : : #endif
92 : :
93 [ # # ]: 0 : if( xManager.is() )
94 : : {
95 : : xPlayer = uno::Reference< ::com::sun::star::media::XPlayer >(
96 [ # # ][ # # ]: 0 : xManager->createPlayer( rURL ), uno::UNO_QUERY );
[ # # ][ # # ]
97 : : }
98 : : else
99 : : SAL_WARN(
100 : : "avmedia",
101 : : ("failed to create media player service "
102 [ # # ]: 0 : AVMEDIA_MANAGER_SERVICE_NAME));
103 : : }
104 [ # # ]: 0 : catch( const uno::Exception &e )
105 : : {
106 : : SAL_WARN(
107 : : "avmedia",
108 : : "couldn't create media player " AVMEDIA_MANAGER_SERVICE_NAME
109 : : ", exception '" << e.Message << '\'');
110 : : }
111 : : }
112 : :
113 : 0 : return xPlayer;
114 : : }
115 : :
116 : 0 : void MediaWindowBaseImpl::setURL( const ::rtl::OUString& rURL,
117 : : ::rtl::OUString const& rTempURL)
118 : : {
119 [ # # ]: 0 : if( rURL != getURL() )
120 : : {
121 [ # # ]: 0 : if( mxPlayer.is() )
122 : 0 : mxPlayer->stop();
123 : :
124 [ # # ]: 0 : if( mxPlayerWindow.is() )
125 : : {
126 : 0 : mxPlayerWindow->setVisible( false );
127 : 0 : mxPlayerWindow.clear();
128 : : }
129 : :
130 : 0 : mxPlayer.clear();
131 : 0 : mTempFileURL = ::rtl::OUString();
132 : :
133 [ # # ]: 0 : if (rTempURL.getLength())
134 : : {
135 : 0 : maFileURL = rURL;
136 : 0 : mTempFileURL = rTempURL;
137 : : }
138 : : else
139 : : {
140 [ # # ]: 0 : INetURLObject aURL( rURL );
141 : :
142 [ # # ]: 0 : if (aURL.GetProtocol() != INET_PROT_NOT_VALID)
143 [ # # ]: 0 : maFileURL = aURL.GetMainURL(INetURLObject::DECODE_UNAMBIGUOUS);
144 : : else
145 [ # # ]: 0 : maFileURL = rURL;
146 : : }
147 : :
148 : : mxPlayer = createPlayer(
149 [ # # ][ # # ]: 0 : (mTempFileURL.getLength()) ? mTempFileURL : maFileURL );
150 : 0 : onURLChanged();
151 : : }
152 : 0 : }
153 : :
154 : : // ---------------------------------------------------------------------
155 : :
156 : 0 : void MediaWindowBaseImpl::onURLChanged()
157 : : {
158 : 0 : }
159 : :
160 : : // ---------------------------------------------------------------------
161 : :
162 : 0 : const ::rtl::OUString& MediaWindowBaseImpl::getURL() const
163 : : {
164 : 0 : return maFileURL;
165 : : }
166 : :
167 : : // ---------------------------------------------------------------------
168 : :
169 : 0 : bool MediaWindowBaseImpl::isValid() const
170 : : {
171 : 0 : return( getPlayer().is() );
172 : : }
173 : :
174 : : // ---------------------------------------------------------------------
175 : :
176 : 0 : void MediaWindowBaseImpl::stopPlayingInternal( bool bStop )
177 : : {
178 [ # # ]: 0 : if( isPlaying() )
179 : : {
180 [ # # ]: 0 : bStop ? mxPlayer->stop() : mxPlayer->start();
181 : : }
182 : 0 : }
183 : :
184 : : // ---------------------------------------------------------------------
185 : :
186 : 0 : MediaWindow* MediaWindowBaseImpl::getMediaWindow() const
187 : : {
188 : 0 : return mpMediaWindow;
189 : : }
190 : :
191 : : // ---------------------------------------------------------------------
192 : :
193 : 0 : uno::Reference< media::XPlayer > MediaWindowBaseImpl::getPlayer() const
194 : : {
195 : 0 : return mxPlayer;
196 : : }
197 : :
198 : : // ---------------------------------------------------------------------
199 : :
200 : 0 : uno::Reference< media::XPlayerWindow > MediaWindowBaseImpl::getPlayerWindow() const
201 : : {
202 : 0 : return mxPlayerWindow;
203 : : }
204 : :
205 : : // ---------------------------------------------------------------------
206 : :
207 : 0 : void MediaWindowBaseImpl::setPlayerWindow( const uno::Reference< media::XPlayerWindow >& rxPlayerWindow )
208 : : {
209 : 0 : mxPlayerWindow = rxPlayerWindow;
210 : 0 : }
211 : :
212 : : // ---------------------------------------------------------------------
213 : :
214 : 0 : void MediaWindowBaseImpl::cleanUp()
215 : : {
216 [ # # ]: 0 : if( mxPlayer.is() )
217 : : {
218 [ # # ][ # # ]: 0 : mxPlayer->stop();
219 : :
220 [ # # ]: 0 : uno::Reference< lang::XComponent > xComponent( mxPlayer, uno::UNO_QUERY );
221 : :
222 [ # # ]: 0 : if( xComponent.is() )
223 [ # # ][ # # ]: 0 : xComponent->dispose();
224 : :
225 : 0 : mxPlayer.clear();
226 : : }
227 : :
228 : 0 : mpMediaWindow = NULL;
229 : 0 : }
230 : :
231 : : // ---------------------------------------------------------------------
232 : :
233 : 0 : Size MediaWindowBaseImpl::getPreferredSize() const
234 : : {
235 : 0 : Size aRet;
236 : :
237 [ # # ]: 0 : if( mxPlayer.is() )
238 : : {
239 [ # # ][ # # ]: 0 : awt::Size aPrefSize( mxPlayer->getPreferredPlayerWindowSize() );
240 : :
241 : 0 : aRet.Width() = aPrefSize.Width;
242 : 0 : aRet.Height() = aPrefSize.Height;
243 : : }
244 : :
245 : 0 : return aRet;
246 : : }
247 : :
248 : : // ---------------------------------------------------------------------
249 : :
250 : 0 : bool MediaWindowBaseImpl::setZoom( ::com::sun::star::media::ZoomLevel eLevel )
251 : : {
252 [ # # ][ # # ]: 0 : return( mxPlayerWindow.is() ? mxPlayerWindow->setZoomLevel( eLevel ) : false );
253 : : }
254 : :
255 : : // -------------------------------------------------------------------------
256 : :
257 : 0 : ::com::sun::star::media::ZoomLevel MediaWindowBaseImpl::getZoom() const
258 : : {
259 [ # # ]: 0 : return( mxPlayerWindow.is() ? mxPlayerWindow->getZoomLevel() : ::com::sun::star::media::ZoomLevel_NOT_AVAILABLE );
260 : : }
261 : :
262 : : // ---------------------------------------------------------------------
263 : :
264 : 0 : bool MediaWindowBaseImpl::start()
265 : : {
266 [ # # ]: 0 : return( mxPlayer.is() ? ( mxPlayer->start(), true ) : false );
267 : : }
268 : :
269 : : // ---------------------------------------------------------------------
270 : :
271 : 0 : void MediaWindowBaseImpl::stop()
272 : : {
273 [ # # ]: 0 : if( mxPlayer.is() )
274 : 0 : mxPlayer->stop();
275 : 0 : }
276 : :
277 : : // ---------------------------------------------------------------------
278 : :
279 : 0 : bool MediaWindowBaseImpl::isPlaying() const
280 : : {
281 [ # # ][ # # ]: 0 : return( mxPlayer.is() && mxPlayer->isPlaying() );
282 : : }
283 : :
284 : : // ---------------------------------------------------------------------
285 : :
286 : 0 : double MediaWindowBaseImpl::getDuration() const
287 : : {
288 [ # # ]: 0 : return( mxPlayer.is() ? mxPlayer->getDuration() : 0.0 );
289 : : }
290 : :
291 : : // ---------------------------------------------------------------------
292 : :
293 : 0 : void MediaWindowBaseImpl::setMediaTime( double fTime )
294 : : {
295 [ # # ]: 0 : if( mxPlayer.is() )
296 : 0 : mxPlayer->setMediaTime( fTime );
297 : 0 : }
298 : :
299 : : // ---------------------------------------------------------------------
300 : :
301 : 0 : double MediaWindowBaseImpl::getMediaTime() const
302 : : {
303 [ # # ]: 0 : return( mxPlayer.is() ? mxPlayer->getMediaTime() : 0.0 );
304 : : }
305 : :
306 : : // ---------------------------------------------------------------------
307 : :
308 : 0 : double MediaWindowBaseImpl::getRate() const
309 : : {
310 [ # # ]: 0 : return( mxPlayer.is() ? mxPlayer->getRate() : 0.0 );
311 : : }
312 : :
313 : : // ---------------------------------------------------------------------
314 : :
315 : 0 : void MediaWindowBaseImpl::setPlaybackLoop( bool bSet )
316 : : {
317 [ # # ]: 0 : if( mxPlayer.is() )
318 : 0 : mxPlayer->setPlaybackLoop( bSet );
319 : 0 : }
320 : :
321 : : // ---------------------------------------------------------------------
322 : :
323 : 0 : bool MediaWindowBaseImpl::isPlaybackLoop() const
324 : : {
325 [ # # ][ # # ]: 0 : return( mxPlayer.is() ? mxPlayer->isPlaybackLoop() : false );
326 : : }
327 : :
328 : : // ---------------------------------------------------------------------
329 : :
330 : 0 : void MediaWindowBaseImpl::setMute( bool bSet )
331 : : {
332 [ # # ]: 0 : if( mxPlayer.is() )
333 : 0 : mxPlayer->setMute( bSet );
334 : 0 : }
335 : :
336 : : // ---------------------------------------------------------------------
337 : :
338 : 0 : bool MediaWindowBaseImpl::isMute() const
339 : : {
340 [ # # ][ # # ]: 0 : return( mxPlayer.is() ? mxPlayer->isMute() : false );
341 : : }
342 : :
343 : : // ---------------------------------------------------------------------
344 : :
345 : 0 : void MediaWindowBaseImpl::setVolumeDB( sal_Int16 nVolumeDB )
346 : : {
347 [ # # ]: 0 : if( mxPlayer.is() )
348 : 0 : mxPlayer->setVolumeDB( nVolumeDB );
349 : 0 : }
350 : :
351 : : // ---------------------------------------------------------------------
352 : :
353 : 0 : sal_Int16 MediaWindowBaseImpl::getVolumeDB() const
354 : : {
355 [ # # ]: 0 : return( mxPlayer.is() ? mxPlayer->getVolumeDB() : 0 );
356 : : }
357 : :
358 : : // -------------------------------------------------------------------------
359 : :
360 : 0 : void MediaWindowBaseImpl::updateMediaItem( MediaItem& rItem ) const
361 : : {
362 [ # # ]: 0 : if( isPlaying() )
363 [ # # ]: 0 : rItem.setState( ( getRate() > 1.0 ) ? MEDIASTATE_PLAYFFW : MEDIASTATE_PLAY );
364 : : else
365 [ # # ]: 0 : rItem.setState( ( 0.0 == getMediaTime() ) ? MEDIASTATE_STOP : MEDIASTATE_PAUSE );
366 : :
367 : 0 : rItem.setDuration( getDuration() );
368 : 0 : rItem.setTime( getMediaTime() );
369 : 0 : rItem.setLoop( isPlaybackLoop() );
370 : 0 : rItem.setMute( isMute() );
371 : 0 : rItem.setVolumeDB( getVolumeDB() );
372 : 0 : rItem.setZoom( getZoom() );
373 : 0 : rItem.setURL( getURL(), &mTempFileURL );
374 : 0 : }
375 : :
376 : : // -------------------------------------------------------------------------
377 : :
378 : 0 : void MediaWindowBaseImpl::executeMediaItem( const MediaItem& rItem )
379 : : {
380 : 0 : const sal_uInt32 nMaskSet = rItem.getMaskSet();
381 : :
382 : : // set URL first
383 [ # # ]: 0 : if( nMaskSet & AVMEDIA_SETMASK_URL )
384 : 0 : setURL( rItem.getURL(), rItem.getTempURL() );
385 : :
386 : : // set different states next
387 [ # # ]: 0 : if( nMaskSet & AVMEDIA_SETMASK_TIME )
388 [ # # ][ # # ]: 0 : setMediaTime( ::std::min( rItem.getTime(), getDuration() ) );
[ # # ]
389 : :
390 [ # # ]: 0 : if( nMaskSet & AVMEDIA_SETMASK_LOOP )
391 : 0 : setPlaybackLoop( rItem.isLoop() );
392 : :
393 [ # # ]: 0 : if( nMaskSet & AVMEDIA_SETMASK_MUTE )
394 : 0 : setMute( rItem.isMute() );
395 : :
396 [ # # ]: 0 : if( nMaskSet & AVMEDIA_SETMASK_VOLUMEDB )
397 : 0 : setVolumeDB( rItem.getVolumeDB() );
398 : :
399 [ # # ]: 0 : if( nMaskSet & AVMEDIA_SETMASK_ZOOM )
400 : 0 : setZoom( rItem.getZoom() );
401 : :
402 : : // set play state at last
403 [ # # ]: 0 : if( nMaskSet & AVMEDIA_SETMASK_STATE )
404 : : {
405 [ # # # # ]: 0 : switch( rItem.getState() )
406 : : {
407 : : case( MEDIASTATE_PLAY ):
408 : : case( MEDIASTATE_PLAYFFW ):
409 : : {
410 : :
411 [ # # ]: 0 : if( !isPlaying() )
412 : 0 : start();
413 : : }
414 : 0 : break;
415 : :
416 : : case( MEDIASTATE_PAUSE ):
417 : : {
418 [ # # ]: 0 : if( isPlaying() )
419 : 0 : stop();
420 : : }
421 : 0 : break;
422 : :
423 : : case( MEDIASTATE_STOP ):
424 : : {
425 [ # # ]: 0 : if( isPlaying() )
426 : : {
427 : 0 : setMediaTime( 0.0 );
428 : 0 : stop();
429 : 0 : setMediaTime( 0.0 );
430 : : }
431 : : }
432 : 0 : break;
433 : : }
434 : : }
435 : 0 : }
436 : :
437 : : } // namespace priv
438 : : } // namespace avemdia
439 : :
440 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|