xref: /trunk/main/avmedia/source/macavf/macavf_player.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1e8649ecdSHerbert Dürr /**************************************************************
2e8649ecdSHerbert Dürr  *
3e8649ecdSHerbert Dürr  * Licensed to the Apache Software Foundation (ASF) under one
4e8649ecdSHerbert Dürr  * or more contributor license agreements.  See the NOTICE file
5e8649ecdSHerbert Dürr  * distributed with this work for additional information
6e8649ecdSHerbert Dürr  * regarding copyright ownership.  The ASF licenses this file
7e8649ecdSHerbert Dürr  * to you under the Apache License, Version 2.0 (the
8e8649ecdSHerbert Dürr  * "License"); you may not use this file except in compliance
9e8649ecdSHerbert Dürr  * with the License.  You may obtain a copy of the License at
10e8649ecdSHerbert Dürr  *
11e8649ecdSHerbert Dürr  *   http://www.apache.org/licenses/LICENSE-2.0
12e8649ecdSHerbert Dürr  *
13e8649ecdSHerbert Dürr  * Unless required by applicable law or agreed to in writing,
14e8649ecdSHerbert Dürr  * software distributed under the License is distributed on an
15e8649ecdSHerbert Dürr  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16e8649ecdSHerbert Dürr  * KIND, either express or implied.  See the License for the
17e8649ecdSHerbert Dürr  * specific language governing permissions and limitations
18e8649ecdSHerbert Dürr  * under the License.
19e8649ecdSHerbert Dürr  *
20e8649ecdSHerbert Dürr  *************************************************************/
21e8649ecdSHerbert Dürr 
22e8649ecdSHerbert Dürr 
23e8649ecdSHerbert Dürr #include "macavf_player.hxx"
24e8649ecdSHerbert Dürr #include "macavf_framegrabber.hxx"
25e8649ecdSHerbert Dürr #include "macavf_window.hxx"
26e8649ecdSHerbert Dürr 
27e8649ecdSHerbert Dürr #include <cmath> // for log10()
28e8649ecdSHerbert Dürr 
29e8649ecdSHerbert Dürr using namespace ::com::sun::star;
30e8649ecdSHerbert Dürr 
31e8649ecdSHerbert Dürr #include <hash_map>
32e8649ecdSHerbert Dürr typedef std::hash_map<NSObject*,avmedia::macavf::MacAVObserverHandler*> HandlersForObject;
33e8649ecdSHerbert Dürr 
34e8649ecdSHerbert Dürr @implementation MacAVObserverObject
35e8649ecdSHerbert Dürr {
36e8649ecdSHerbert Dürr     HandlersForObject maHandlersForObject;
37e8649ecdSHerbert Dürr }
38e8649ecdSHerbert Dürr - (void)observeValueForKeyPath:(NSString*)pKeyPath ofObject:(id)pObject change:(NSDictionary*)pChangeDict context:(void*)pContext
39e8649ecdSHerbert Dürr {
40e8649ecdSHerbert Dürr     NSString* pDictStr = [NSString stringWithFormat:@"%@", pChangeDict];
41e8649ecdSHerbert Dürr     OSL_TRACE( "MacAVObserver::onKeyChange k=\"%s\" c=%s", [pKeyPath UTF8String], [pDictStr UTF8String]);
42e8649ecdSHerbert Dürr     avmedia::macavf::MacAVObserverHandler* pHandler = (avmedia::macavf::MacAVObserverHandler*)pContext;
43e8649ecdSHerbert Dürr     pHandler->handleObservation( pKeyPath );
44e8649ecdSHerbert Dürr }
45e8649ecdSHerbert Dürr 
46e8649ecdSHerbert Dürr - (void)onNotification:(NSNotification*)pNotification
47e8649ecdSHerbert Dürr {
48e8649ecdSHerbert Dürr     NSString* pNoteName = (NSString*)[pNotification name];
49e8649ecdSHerbert Dürr     OSL_TRACE( "MacAVObserver::onNotification key=\"%s\"", [pNoteName UTF8String]);
50e8649ecdSHerbert Dürr     HandlersForObject::iterator it = maHandlersForObject.find( [pNotification object]);
51e8649ecdSHerbert Dürr     if( it != maHandlersForObject.end() )
52e8649ecdSHerbert Dürr         (*it).second->handleObservation( pNoteName );
53e8649ecdSHerbert Dürr }
54e8649ecdSHerbert Dürr 
55e8649ecdSHerbert Dürr - (void)setHandlerForObject:(NSObject*)pObject handler:(avmedia::macavf::MacAVObserverHandler*)pHandler
56e8649ecdSHerbert Dürr {
57e8649ecdSHerbert Dürr     maHandlersForObject[ pObject] = pHandler;
58e8649ecdSHerbert Dürr }
59e8649ecdSHerbert Dürr 
60e8649ecdSHerbert Dürr - (void)removeHandlerForObject:(NSObject*)pObject
61e8649ecdSHerbert Dürr {
62e8649ecdSHerbert Dürr     maHandlersForObject.erase( pObject);
63e8649ecdSHerbert Dürr }
64e8649ecdSHerbert Dürr 
65e8649ecdSHerbert Dürr @end
66e8649ecdSHerbert Dürr 
67e8649ecdSHerbert Dürr 
68e8649ecdSHerbert Dürr namespace avmedia { namespace macavf {
69e8649ecdSHerbert Dürr 
70e8649ecdSHerbert Dürr MacAVObserverObject* MacAVObserverHandler::mpMacAVObserverObject = NULL;
71e8649ecdSHerbert Dürr 
getObserver() const72e8649ecdSHerbert Dürr MacAVObserverObject* MacAVObserverHandler::getObserver() const
73e8649ecdSHerbert Dürr {
74e8649ecdSHerbert Dürr     if( !mpMacAVObserverObject)
75e8649ecdSHerbert Dürr     {
76e8649ecdSHerbert Dürr         mpMacAVObserverObject = [MacAVObserverObject alloc];
77e8649ecdSHerbert Dürr         [mpMacAVObserverObject retain];
78e8649ecdSHerbert Dürr     }
79e8649ecdSHerbert Dürr     return mpMacAVObserverObject;
80e8649ecdSHerbert Dürr }
81e8649ecdSHerbert Dürr 
82e8649ecdSHerbert Dürr 
83e8649ecdSHerbert Dürr // ----------------
84e8649ecdSHerbert Dürr // - Player -
85e8649ecdSHerbert Dürr // ----------------
86e8649ecdSHerbert Dürr 
Player(const uno::Reference<uno::XComponentContext> & rxContext)87*46880872SDamjan Jovanovic Player::Player( const uno::Reference< uno::XComponentContext >& rxContext )
88*46880872SDamjan Jovanovic :   mxContext( rxContext )
89e8649ecdSHerbert Dürr ,   mpPlayer( NULL )
90e8649ecdSHerbert Dürr ,   mfUnmutedVolume( 0 )
91e8649ecdSHerbert Dürr ,   mfStopTime( DBL_MAX )
92e8649ecdSHerbert Dürr ,   mbMuted( false )
93e8649ecdSHerbert Dürr ,   mbLooping( false )
94e8649ecdSHerbert Dürr {}
95e8649ecdSHerbert Dürr 
96e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
97e8649ecdSHerbert Dürr 
~Player()98e8649ecdSHerbert Dürr Player::~Player()
99e8649ecdSHerbert Dürr {
100e8649ecdSHerbert Dürr     if( !mpPlayer )
101e8649ecdSHerbert Dürr         return;
102e8649ecdSHerbert Dürr     // remove the observers
103e8649ecdSHerbert Dürr     [mpPlayer removeObserver:getObserver() forKeyPath:@"currentItem.status"];
104e8649ecdSHerbert Dürr     AVPlayerItem* pOldPlayerItem = [mpPlayer currentItem];
105e8649ecdSHerbert Dürr     [[NSNotificationCenter defaultCenter] removeObserver:getObserver()
106e8649ecdSHerbert Dürr         name:AVPlayerItemDidPlayToEndTimeNotification
107e8649ecdSHerbert Dürr         object:pOldPlayerItem];
108e8649ecdSHerbert Dürr     [getObserver() removeHandlerForObject:pOldPlayerItem];
109e8649ecdSHerbert Dürr     // release the AVPlayer
110e8649ecdSHerbert Dürr     CFRelease( mpPlayer );
111e8649ecdSHerbert Dürr }
112e8649ecdSHerbert Dürr 
113e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
114e8649ecdSHerbert Dürr 
handleObservation(NSString * pKeyPath)115e8649ecdSHerbert Dürr bool Player::handleObservation( NSString* pKeyPath )
116e8649ecdSHerbert Dürr {
117e8649ecdSHerbert Dürr     OSL_TRACE( "AVPlayer::handleObservation key=\"%s\"", [pKeyPath UTF8String]);
118e8649ecdSHerbert Dürr     if( [pKeyPath isEqualToString:AVPlayerItemDidPlayToEndTimeNotification])
119e8649ecdSHerbert Dürr     {
120e8649ecdSHerbert Dürr         OSL_TRACE( "AVPlayer replay=%d", mbLooping);
121e8649ecdSHerbert Dürr         if( mbLooping )
122e8649ecdSHerbert Dürr             setMediaTime( 0.0);
123e8649ecdSHerbert Dürr     }
124e8649ecdSHerbert Dürr     return true;
125e8649ecdSHerbert Dürr }
126e8649ecdSHerbert Dürr 
127e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
128e8649ecdSHerbert Dürr 
create(const::rtl::OUString & rURL)129e8649ecdSHerbert Dürr bool Player::create( const ::rtl::OUString& rURL )
130e8649ecdSHerbert Dürr {
131e8649ecdSHerbert Dürr     // get the media asset
132e8649ecdSHerbert Dürr     NSString* aNSStr = [NSString stringWithCharacters:rURL.getStr() length:rURL.getLength()];
133e8649ecdSHerbert Dürr     NSURL* aNSURL = [NSURL URLWithString: [aNSStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
134e8649ecdSHerbert Dürr     // get the matching AVPlayerItem
135e8649ecdSHerbert Dürr     AVPlayerItem* pPlayerItem = [AVPlayerItem playerItemWithURL:aNSURL];
136e8649ecdSHerbert Dürr 
137e8649ecdSHerbert Dürr     // create or update the AVPlayer with the new AVPlayerItem
138e8649ecdSHerbert Dürr     if( !mpPlayer )
139e8649ecdSHerbert Dürr     {
140e8649ecdSHerbert Dürr         mpPlayer = [AVPlayer playerWithPlayerItem:pPlayerItem];
141e8649ecdSHerbert Dürr         CFRetain( mpPlayer );
142e8649ecdSHerbert Dürr         [mpPlayer setActionAtItemEnd:AVPlayerActionAtItemEndNone];
143e8649ecdSHerbert Dürr     }
144e8649ecdSHerbert Dürr     else
145e8649ecdSHerbert Dürr     {
146e8649ecdSHerbert Dürr         // remove the obsoleted observers
147e8649ecdSHerbert Dürr         AVPlayerItem* pOldPlayerItem = [mpPlayer currentItem];
148e8649ecdSHerbert Dürr         [mpPlayer removeObserver:getObserver() forKeyPath:@"currentItem.status"];
149e8649ecdSHerbert Dürr         [getObserver() removeHandlerForObject:pOldPlayerItem];
150e8649ecdSHerbert Dürr         [[NSNotificationCenter defaultCenter] removeObserver:getObserver()
151e8649ecdSHerbert Dürr             name:AVPlayerItemDidPlayToEndTimeNotification
152e8649ecdSHerbert Dürr             object:pOldPlayerItem];
153e8649ecdSHerbert Dürr         // replace the playeritem
154e8649ecdSHerbert Dürr         [mpPlayer replaceCurrentItemWithPlayerItem:pPlayerItem];
155e8649ecdSHerbert Dürr     }
156e8649ecdSHerbert Dürr 
157e8649ecdSHerbert Dürr     // observe the status of the current player item
158e8649ecdSHerbert Dürr     [mpPlayer addObserver:getObserver() forKeyPath:@"currentItem.status" options:0 context:this];
159e8649ecdSHerbert Dürr 
160e8649ecdSHerbert Dürr     // observe playback-end needed for playback looping
161e8649ecdSHerbert Dürr     [[NSNotificationCenter defaultCenter] addObserver:getObserver()
162e8649ecdSHerbert Dürr         selector:@selector(onNotification:)
163e8649ecdSHerbert Dürr         name:AVPlayerItemDidPlayToEndTimeNotification
164e8649ecdSHerbert Dürr         object:pPlayerItem];
165e8649ecdSHerbert Dürr     [getObserver() setHandlerForObject:pPlayerItem handler:this];
166e8649ecdSHerbert Dürr 
167e8649ecdSHerbert Dürr     return true;
168e8649ecdSHerbert Dürr }
169e8649ecdSHerbert Dürr 
170e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
171e8649ecdSHerbert Dürr 
start()172e8649ecdSHerbert Dürr void SAL_CALL Player::start()
173e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
174e8649ecdSHerbert Dürr {
175e8649ecdSHerbert Dürr     if( !mpPlayer )
176e8649ecdSHerbert Dürr         return;
177e8649ecdSHerbert Dürr #if 0
178e8649ecdSHerbert Dürr     const AVPlayerStatus eStatus = [mpPlayer status];
179e8649ecdSHerbert Dürr     OSL_TRACE ("Player::start status=%d", (int)eStatus);
180e8649ecdSHerbert Dürr     if( eStatus == AVPlayerStatusReadyToPlay)
181e8649ecdSHerbert Dürr #endif
182e8649ecdSHerbert Dürr         [mpPlayer play];
183e8649ecdSHerbert Dürr     // else // TODO: delay until it becomes ready
184e8649ecdSHerbert Dürr }
185e8649ecdSHerbert Dürr 
186e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
187e8649ecdSHerbert Dürr 
stop()188e8649ecdSHerbert Dürr void SAL_CALL Player::stop()
189e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
190e8649ecdSHerbert Dürr {
191e8649ecdSHerbert Dürr     if( !mpPlayer )
192e8649ecdSHerbert Dürr         return;
193e8649ecdSHerbert Dürr     const bool bPlaying = isPlaying();
194e8649ecdSHerbert Dürr     OSL_TRACE ("Player::stop() playing=%d", bPlaying);
195e8649ecdSHerbert Dürr     if( bPlaying )
196e8649ecdSHerbert Dürr         [mpPlayer pause];
197e8649ecdSHerbert Dürr }
198e8649ecdSHerbert Dürr 
199e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
200e8649ecdSHerbert Dürr 
isPlaying()201e8649ecdSHerbert Dürr sal_Bool SAL_CALL Player::isPlaying()
202e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
203e8649ecdSHerbert Dürr {
204e8649ecdSHerbert Dürr     if( !mpPlayer )
205e8649ecdSHerbert Dürr         return false;
206e8649ecdSHerbert Dürr     const float fRate = [mpPlayer rate];
207e8649ecdSHerbert Dürr     return (fRate != 0.0);
208e8649ecdSHerbert Dürr }
209e8649ecdSHerbert Dürr 
210e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
211e8649ecdSHerbert Dürr 
getDuration()212e8649ecdSHerbert Dürr double SAL_CALL Player::getDuration()
213e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
214e8649ecdSHerbert Dürr {
215e8649ecdSHerbert Dürr     // slideshow checks for non-zero duration, so cheat here
216e8649ecdSHerbert Dürr     double duration = 0.01;
217e8649ecdSHerbert Dürr 
218e8649ecdSHerbert Dürr     if( mpPlayer )
219e8649ecdSHerbert Dürr     {
220e8649ecdSHerbert Dürr         AVPlayerItem* pItem = [mpPlayer currentItem];
221020bbb1dSHerbert Dürr         if( [pItem status] == AVPlayerItemStatusReadyToPlay )
222e8649ecdSHerbert Dürr             duration = CMTimeGetSeconds( [pItem duration] );
223020bbb1dSHerbert Dürr         else // fall back to AVAsset's best guess
224020bbb1dSHerbert Dürr             duration = CMTimeGetSeconds( [[pItem asset] duration] );
225e8649ecdSHerbert Dürr     }
226e8649ecdSHerbert Dürr 
227e8649ecdSHerbert Dürr     return duration;
228e8649ecdSHerbert Dürr }
229e8649ecdSHerbert Dürr 
230e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
231e8649ecdSHerbert Dürr 
setMediaTime(double fTime)232e8649ecdSHerbert Dürr void SAL_CALL Player::setMediaTime( double fTime )
233e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
234e8649ecdSHerbert Dürr {
235e8649ecdSHerbert Dürr     OSL_TRACE ("Player::setMediaTime( %.3fsec)", fTime);
236e8649ecdSHerbert Dürr     if( mpPlayer )
237e8649ecdSHerbert Dürr         [mpPlayer seekToTime: CMTimeMakeWithSeconds(fTime,1000) ];
238e8649ecdSHerbert Dürr }
239e8649ecdSHerbert Dürr 
240e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
241e8649ecdSHerbert Dürr 
getMediaTime()242e8649ecdSHerbert Dürr double SAL_CALL Player::getMediaTime()
243e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
244e8649ecdSHerbert Dürr {
245e8649ecdSHerbert Dürr     if( !mpPlayer )
246e8649ecdSHerbert Dürr         return 0.0;
247e8649ecdSHerbert Dürr 
248e8649ecdSHerbert Dürr     const double position = CMTimeGetSeconds( [mpPlayer currentTime] );
249e8649ecdSHerbert Dürr     OSL_TRACE( "Player::getMediaTime() = %.3fsec", position);
250e8649ecdSHerbert Dürr     if( position >= mfStopTime )
251e8649ecdSHerbert Dürr         if( isPlaying() )
252e8649ecdSHerbert Dürr             stop();
253e8649ecdSHerbert Dürr 
254e8649ecdSHerbert Dürr     return position;
255e8649ecdSHerbert Dürr }
256e8649ecdSHerbert Dürr 
257e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
258e8649ecdSHerbert Dürr 
setStopTime(double fTime)259e8649ecdSHerbert Dürr void SAL_CALL Player::setStopTime( double fTime )
260e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
261e8649ecdSHerbert Dürr {
262e8649ecdSHerbert Dürr     OSL_TRACE ("Player::setStopTime( %.3fsec)", fTime);
263e8649ecdSHerbert Dürr     mfStopTime = fTime;
264e8649ecdSHerbert Dürr }
265e8649ecdSHerbert Dürr 
266e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
267e8649ecdSHerbert Dürr 
getStopTime()268e8649ecdSHerbert Dürr double SAL_CALL Player::getStopTime()
269e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
270e8649ecdSHerbert Dürr {
271e8649ecdSHerbert Dürr     return mfStopTime;
272e8649ecdSHerbert Dürr }
273e8649ecdSHerbert Dürr 
274e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
275e8649ecdSHerbert Dürr 
setRate(double fRate)276e8649ecdSHerbert Dürr void SAL_CALL Player::setRate( double fRate )
277e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
278e8649ecdSHerbert Dürr {
279e8649ecdSHerbert Dürr     OSL_TRACE ("Player::setRate( %.3f)", fRate);
280e8649ecdSHerbert Dürr     if( !mpPlayer )
281e8649ecdSHerbert Dürr         return;
282e8649ecdSHerbert Dürr 
283e8649ecdSHerbert Dürr     // playback rate: 0 = stop, 1 = normal speed, 2 = double speed, -1 = normal speed backwards
284e8649ecdSHerbert Dürr     [mpPlayer setRate: fRate];
285e8649ecdSHerbert Dürr }
286e8649ecdSHerbert Dürr 
287e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
288e8649ecdSHerbert Dürr 
getRate()289e8649ecdSHerbert Dürr double SAL_CALL Player::getRate()
290e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
291e8649ecdSHerbert Dürr {
292e8649ecdSHerbert Dürr     // macavf: 0 = stop, 1 = normal speed, 2 = double speed, -1 = normal speed backwards
293e8649ecdSHerbert Dürr     const double fRate = mpPlayer ? (double)[mpPlayer rate] : 1.0;
294e8649ecdSHerbert Dürr     OSL_TRACE ("Player::getRate() = %.3f", fRate);
295e8649ecdSHerbert Dürr     return fRate;
296e8649ecdSHerbert Dürr }
297e8649ecdSHerbert Dürr 
298e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
299e8649ecdSHerbert Dürr 
setPlaybackLoop(sal_Bool bSet)300e8649ecdSHerbert Dürr void SAL_CALL Player::setPlaybackLoop( sal_Bool bSet )
301e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
302e8649ecdSHerbert Dürr {
303e8649ecdSHerbert Dürr     OSL_TRACE ("Player::setPlaybackLoop( %d)", bSet );
304e8649ecdSHerbert Dürr     mbLooping = bSet;
305e8649ecdSHerbert Dürr }
306e8649ecdSHerbert Dürr 
307e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
308e8649ecdSHerbert Dürr 
isPlaybackLoop()309e8649ecdSHerbert Dürr sal_Bool SAL_CALL Player::isPlaybackLoop()
310e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
311e8649ecdSHerbert Dürr {
312e8649ecdSHerbert Dürr     const bool bRet = mbLooping;
313e8649ecdSHerbert Dürr     OSL_TRACE ("Player::isPlaybackLoop() = %d", bRet );
314e8649ecdSHerbert Dürr     return bRet;
315e8649ecdSHerbert Dürr }
316e8649ecdSHerbert Dürr 
317e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
318e8649ecdSHerbert Dürr 
setMute(sal_Bool bSet)319e8649ecdSHerbert Dürr void SAL_CALL Player::setMute( sal_Bool bSet )
320e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
321e8649ecdSHerbert Dürr {
322e8649ecdSHerbert Dürr     OSL_TRACE( "Player::setMute(%d), was-muted: %d unmuted-volume: %.3f", bSet, mbMuted, mfUnmutedVolume );
323e8649ecdSHerbert Dürr 
324e8649ecdSHerbert Dürr     if( !mpPlayer )
325e8649ecdSHerbert Dürr         return;
326e8649ecdSHerbert Dürr 
327e8649ecdSHerbert Dürr     mbMuted = (bSet == TRUE);
328e8649ecdSHerbert Dürr     [mpPlayer setMuted:mbMuted];
329e8649ecdSHerbert Dürr }
330e8649ecdSHerbert Dürr 
331e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
332e8649ecdSHerbert Dürr 
isMute()333e8649ecdSHerbert Dürr sal_Bool SAL_CALL Player::isMute()
334e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
335e8649ecdSHerbert Dürr {
336e8649ecdSHerbert Dürr     OSL_TRACE ("Player::isMuted() = %d", mbMuted);
337e8649ecdSHerbert Dürr     return mbMuted;
338e8649ecdSHerbert Dürr }
339e8649ecdSHerbert Dürr 
340e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
341e8649ecdSHerbert Dürr 
setVolumeDB(sal_Int16 nVolumeDB)342e8649ecdSHerbert Dürr void SAL_CALL Player::setVolumeDB( sal_Int16 nVolumeDB )
343e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
344e8649ecdSHerbert Dürr {
345e8649ecdSHerbert Dürr     // -40dB <-> AVPlayer volume 0.0
346e8649ecdSHerbert Dürr     //   0dB <-> AVPlayer volume 1.0
347e8649ecdSHerbert Dürr     mfUnmutedVolume = (nVolumeDB <= -40) ? 0.0 : pow( 10.0, nVolumeDB / 20.0 );
348e8649ecdSHerbert Dürr     OSL_TRACE( "Player::setVolume(%ddB), muted=%d, unmuted-volume: %.3f", nVolumeDB, mbMuted, mfUnmutedVolume );
349e8649ecdSHerbert Dürr 
350e8649ecdSHerbert Dürr     // change volume
351e8649ecdSHerbert Dürr     if( !mbMuted && mpPlayer )
352e8649ecdSHerbert Dürr         [mpPlayer setVolume:mfUnmutedVolume];
353e8649ecdSHerbert Dürr }
354e8649ecdSHerbert Dürr 
355e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
356e8649ecdSHerbert Dürr 
getVolumeDB()357e8649ecdSHerbert Dürr sal_Int16 SAL_CALL Player::getVolumeDB()
358e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
359e8649ecdSHerbert Dürr {
360e8649ecdSHerbert Dürr     if( !mpPlayer )
361e8649ecdSHerbert Dürr         return 0;
362e8649ecdSHerbert Dürr 
363e8649ecdSHerbert Dürr     // get the actual volume
364e8649ecdSHerbert Dürr     const float fVolume = [mpPlayer volume];
365e8649ecdSHerbert Dürr 
366e8649ecdSHerbert Dürr     // convert into Dezibel value
367e8649ecdSHerbert Dürr     // -40dB <-> AVPlayer volume 0.0
368e8649ecdSHerbert Dürr     //   0dB <-> AVPlayer volume 1.0
369e8649ecdSHerbert Dürr     const int nVolumeDB = (fVolume <= 0) ? -40 : lrint( 20.0*log10(fVolume));
370e8649ecdSHerbert Dürr 
371e8649ecdSHerbert Dürr     return (sal_Int16)nVolumeDB;
372e8649ecdSHerbert Dürr }
373e8649ecdSHerbert Dürr 
374e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
375e8649ecdSHerbert Dürr 
getPreferredPlayerWindowSize()376e8649ecdSHerbert Dürr awt::Size SAL_CALL Player::getPreferredPlayerWindowSize()
377e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
378e8649ecdSHerbert Dürr {
379e8649ecdSHerbert Dürr     awt::Size aSize( 0, 0 ); // default size
380e8649ecdSHerbert Dürr 
381e8649ecdSHerbert Dürr     AVAsset* pMovie = [[mpPlayer currentItem] asset];
382e8649ecdSHerbert Dürr     NSArray* pVideoTracks = [pMovie tracksWithMediaType:AVMediaTypeVideo];
383e8649ecdSHerbert Dürr     AVAssetTrack* pFirstVideoTrack = (AVAssetTrack*)[pVideoTracks firstObject];
384e8649ecdSHerbert Dürr     if( pFirstVideoTrack )
385e8649ecdSHerbert Dürr     {
386e8649ecdSHerbert Dürr         const CGSize aPrefSize = [pFirstVideoTrack naturalSize];
387e8649ecdSHerbert Dürr         aSize = awt::Size( aPrefSize.width, aPrefSize.height );
388e8649ecdSHerbert Dürr     }
389e8649ecdSHerbert Dürr 
390e8649ecdSHerbert Dürr     return aSize;
391e8649ecdSHerbert Dürr }
392e8649ecdSHerbert Dürr 
393e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
394e8649ecdSHerbert Dürr 
createPlayerWindow(const uno::Sequence<uno::Any> & aArguments)395e8649ecdSHerbert Dürr uno::Reference< ::media::XPlayerWindow > SAL_CALL Player::createPlayerWindow( const uno::Sequence< uno::Any >& aArguments )
396e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
397e8649ecdSHerbert Dürr {
398e8649ecdSHerbert Dürr     // get the preferred window size
399e8649ecdSHerbert Dürr     const awt::Size aSize( getPreferredPlayerWindowSize() );
400e8649ecdSHerbert Dürr     OSL_TRACE( "Player::createPlayerWindow %dx%d argsLength: %d", aSize.Width, aSize.Height, aArguments.getLength() );
401e8649ecdSHerbert Dürr 
402e8649ecdSHerbert Dürr     // get the parent view
403e8649ecdSHerbert Dürr     sal_IntPtr nNSViewPtr = NULL;
404e8649ecdSHerbert Dürr     aArguments[0] >>= nNSViewPtr;
405e8649ecdSHerbert Dürr     NSView* pParentView = reinterpret_cast<NSView*>(nNSViewPtr);
406e8649ecdSHerbert Dürr 
407e8649ecdSHerbert Dürr     // check the window parameters
408e8649ecdSHerbert Dürr     uno::Reference< ::media::XPlayerWindow > xRet;
409e8649ecdSHerbert Dürr     if( (aSize.Width <= 0) || (aSize.Height <= 0) || (pParentView == NULL) )
410e8649ecdSHerbert Dürr          return xRet;
411e8649ecdSHerbert Dürr 
412e8649ecdSHerbert Dürr     // create the window
413*46880872SDamjan Jovanovic     ::avmedia::macavf::Window* pWindow = new ::avmedia::macavf::Window( mxContext, *this, pParentView );
414e8649ecdSHerbert Dürr     xRet = pWindow;
415e8649ecdSHerbert Dürr     return xRet;
416e8649ecdSHerbert Dürr }
417e8649ecdSHerbert Dürr 
418e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
419e8649ecdSHerbert Dürr 
createFrameGrabber()420e8649ecdSHerbert Dürr uno::Reference< media::XFrameGrabber > SAL_CALL Player::createFrameGrabber()
421e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
422e8649ecdSHerbert Dürr {
423e8649ecdSHerbert Dürr     uno::Reference< media::XFrameGrabber > xRet;
424e8649ecdSHerbert Dürr     OSL_TRACE ("Player::createFrameGrabber");
425e8649ecdSHerbert Dürr 
426*46880872SDamjan Jovanovic     FrameGrabber* pGrabber = new FrameGrabber( mxContext );
42732322404SHerbert Dürr     AVAsset* pMovie = [[mpPlayer currentItem] asset];
42832322404SHerbert Dürr     if( pGrabber->create( pMovie ) )
429e8649ecdSHerbert Dürr         xRet = pGrabber;
430e8649ecdSHerbert Dürr 
431e8649ecdSHerbert Dürr     return xRet;
432e8649ecdSHerbert Dürr }
433e8649ecdSHerbert Dürr 
434e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
435e8649ecdSHerbert Dürr 
getImplementationName()436e8649ecdSHerbert Dürr ::rtl::OUString SAL_CALL Player::getImplementationName(  )
437e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
438e8649ecdSHerbert Dürr {
439e8649ecdSHerbert Dürr     return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( AVMEDIA_MACAVF_PLAYER_IMPLEMENTATIONNAME ) );
440e8649ecdSHerbert Dürr }
441e8649ecdSHerbert Dürr 
442e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
443e8649ecdSHerbert Dürr 
supportsService(const::rtl::OUString & ServiceName)444e8649ecdSHerbert Dürr sal_Bool SAL_CALL Player::supportsService( const ::rtl::OUString& ServiceName )
445e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
446e8649ecdSHerbert Dürr {
447e8649ecdSHerbert Dürr     return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( AVMEDIA_MACAVF_PLAYER_SERVICENAME ) );
448e8649ecdSHerbert Dürr }
449e8649ecdSHerbert Dürr 
450e8649ecdSHerbert Dürr // ------------------------------------------------------------------------------
451e8649ecdSHerbert Dürr 
getSupportedServiceNames()452e8649ecdSHerbert Dürr uno::Sequence< ::rtl::OUString > SAL_CALL Player::getSupportedServiceNames(  )
453e8649ecdSHerbert Dürr     throw (uno::RuntimeException)
454e8649ecdSHerbert Dürr {
455e8649ecdSHerbert Dürr     uno::Sequence< ::rtl::OUString > aRet(1);
456e8649ecdSHerbert Dürr     aRet[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( AVMEDIA_MACAVF_PLAYER_SERVICENAME ) );
457e8649ecdSHerbert Dürr 
458e8649ecdSHerbert Dürr     return aRet;
459e8649ecdSHerbert Dürr }
460e8649ecdSHerbert Dürr 
461e8649ecdSHerbert Dürr } // namespace macavf
462e8649ecdSHerbert Dürr } // namespace avmedia
463