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