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