195ea2752SHerbert Dürr /**************************************************************
295ea2752SHerbert Dürr  *
395ea2752SHerbert Dürr  * Licensed to the Apache Software Foundation (ASF) under one
495ea2752SHerbert Dürr  * or more contributor license agreements.  See the NOTICE file
595ea2752SHerbert Dürr  * distributed with this work for additional information
695ea2752SHerbert Dürr  * regarding copyright ownership.  The ASF licenses this file
795ea2752SHerbert Dürr  * to you under the Apache License, Version 2.0 (the
895ea2752SHerbert Dürr  * "License"); you may not use this file except in compliance
995ea2752SHerbert Dürr  * with the License.  You may obtain a copy of the License at
1095ea2752SHerbert Dürr  *
1195ea2752SHerbert Dürr  *   http://www.apache.org/licenses/LICENSE-2.0
1295ea2752SHerbert Dürr  *
1395ea2752SHerbert Dürr  * Unless required by applicable law or agreed to in writing,
1495ea2752SHerbert Dürr  * software distributed under the License is distributed on an
1595ea2752SHerbert Dürr  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1695ea2752SHerbert Dürr  * KIND, either express or implied.  See the License for the
1795ea2752SHerbert Dürr  * specific language governing permissions and limitations
1895ea2752SHerbert Dürr  * under the License.
1995ea2752SHerbert Dürr  *
2095ea2752SHerbert Dürr  *************************************************************/
2195ea2752SHerbert Dürr 
2295ea2752SHerbert Dürr 
234ba16609SHerbert Dürr #include "macavf_player.hxx"
244ba16609SHerbert Dürr #include "macavf_framegrabber.hxx"
254ba16609SHerbert Dürr #include "macavf_window.hxx"
2695ea2752SHerbert Dürr 
2795ea2752SHerbert Dürr #include <cmath> // for log10()
2895ea2752SHerbert Dürr 
2995ea2752SHerbert Dürr using namespace ::com::sun::star;
3095ea2752SHerbert Dürr 
3195ea2752SHerbert Dürr #include <hash_map>
3295ea2752SHerbert Dürr typedef std::hash_map<NSObject*,avmedia::macavf::MacAVObserverHandler*> HandlersForObject;
3395ea2752SHerbert Dürr 
3495ea2752SHerbert Dürr @implementation MacAVObserverObject
3595ea2752SHerbert Dürr {
3695ea2752SHerbert Dürr     HandlersForObject maHandlersForObject;
3795ea2752SHerbert Dürr }
3895ea2752SHerbert Dürr - (void)observeValueForKeyPath:(NSString*)pKeyPath ofObject:(id)pObject change:(NSDictionary*)pChangeDict context:(void*)pContext
3995ea2752SHerbert Dürr {
4095ea2752SHerbert Dürr     NSString* pDictStr = [NSString stringWithFormat:@"%@", pChangeDict];
4195ea2752SHerbert Dürr     OSL_TRACE( "MacAVObserver::onKeyChange k=\"%s\" c=%s", [pKeyPath UTF8String], [pDictStr UTF8String]);
4295ea2752SHerbert Dürr     avmedia::macavf::MacAVObserverHandler* pHandler = (avmedia::macavf::MacAVObserverHandler*)pContext;
4395ea2752SHerbert Dürr     pHandler->handleObservation( pKeyPath );
4495ea2752SHerbert Dürr }
4595ea2752SHerbert Dürr 
4695ea2752SHerbert Dürr - (void)onNotification:(NSNotification*)pNotification
4795ea2752SHerbert Dürr {
4895ea2752SHerbert Dürr     NSString* pNoteName = (NSString*)[pNotification name];
4995ea2752SHerbert Dürr     OSL_TRACE( "MacAVObserver::onNotification key=\"%s\"", [pNoteName UTF8String]);
5095ea2752SHerbert Dürr     HandlersForObject::iterator it = maHandlersForObject.find( [pNotification object]);
5195ea2752SHerbert Dürr     if( it != maHandlersForObject.end() )
5295ea2752SHerbert Dürr         (*it).second->handleObservation( pNoteName );
5395ea2752SHerbert Dürr }
5495ea2752SHerbert Dürr 
5595ea2752SHerbert Dürr - (void)setHandlerForObject:(NSObject*)pObject handler:(avmedia::macavf::MacAVObserverHandler*)pHandler
5695ea2752SHerbert Dürr {
5795ea2752SHerbert Dürr     maHandlersForObject[ pObject] = pHandler;
5895ea2752SHerbert Dürr }
5995ea2752SHerbert Dürr 
6095ea2752SHerbert Dürr - (void)removeHandlerForObject:(NSObject*)pObject
6195ea2752SHerbert Dürr {
6295ea2752SHerbert Dürr     maHandlersForObject.erase( pObject);
6395ea2752SHerbert Dürr }
6495ea2752SHerbert Dürr 
6595ea2752SHerbert Dürr @end
6695ea2752SHerbert Dürr 
6795ea2752SHerbert Dürr 
6895ea2752SHerbert Dürr namespace avmedia { namespace macavf {
6995ea2752SHerbert Dürr 
7095ea2752SHerbert Dürr MacAVObserverObject* MacAVObserverHandler::mpMacAVObserverObject = NULL;
7195ea2752SHerbert Dürr 
getObserver() const7295ea2752SHerbert Dürr MacAVObserverObject* MacAVObserverHandler::getObserver() const
7395ea2752SHerbert Dürr {
7495ea2752SHerbert Dürr     if( !mpMacAVObserverObject)
7595ea2752SHerbert Dürr     {
7695ea2752SHerbert Dürr         mpMacAVObserverObject = [MacAVObserverObject alloc];
7795ea2752SHerbert Dürr         [mpMacAVObserverObject retain];
7895ea2752SHerbert Dürr     }
7995ea2752SHerbert Dürr     return mpMacAVObserverObject;
8095ea2752SHerbert Dürr }
8195ea2752SHerbert Dürr 
8295ea2752SHerbert Dürr 
8395ea2752SHerbert Dürr // ----------------
8495ea2752SHerbert Dürr // - Player -
8595ea2752SHerbert Dürr // ----------------
8695ea2752SHerbert Dürr 
Player(const uno::Reference<lang::XMultiServiceFactory> & rxMgr)8795ea2752SHerbert Dürr Player::Player( const uno::Reference< lang::XMultiServiceFactory >& rxMgr )
8895ea2752SHerbert Dürr :   mxMgr( rxMgr )
8995ea2752SHerbert Dürr ,   mpPlayer( NULL )
9095ea2752SHerbert Dürr ,   mfUnmutedVolume( 0 )
9195ea2752SHerbert Dürr ,   mfStopTime( DBL_MAX )
9295ea2752SHerbert Dürr ,   mbMuted( false )
9395ea2752SHerbert Dürr ,   mbLooping( false )
9495ea2752SHerbert Dürr {}
9595ea2752SHerbert Dürr 
9695ea2752SHerbert Dürr // ------------------------------------------------------------------------------
9795ea2752SHerbert Dürr 
~Player()9895ea2752SHerbert Dürr Player::~Player()
9995ea2752SHerbert Dürr {
10095ea2752SHerbert Dürr     if( !mpPlayer )
10195ea2752SHerbert Dürr         return;
10295ea2752SHerbert Dürr     // remove the observers
10395ea2752SHerbert Dürr     [mpPlayer removeObserver:getObserver() forKeyPath:@"currentItem.status"];
10495ea2752SHerbert Dürr     AVPlayerItem* pOldPlayerItem = [mpPlayer currentItem];
10595ea2752SHerbert Dürr     [[NSNotificationCenter defaultCenter] removeObserver:getObserver()
10695ea2752SHerbert Dürr         name:AVPlayerItemDidPlayToEndTimeNotification
10795ea2752SHerbert Dürr         object:pOldPlayerItem];
10895ea2752SHerbert Dürr     [getObserver() removeHandlerForObject:pOldPlayerItem];
10995ea2752SHerbert Dürr     // release the AVPlayer
11095ea2752SHerbert Dürr     CFRelease( mpPlayer );
11195ea2752SHerbert Dürr }
11295ea2752SHerbert Dürr 
11395ea2752SHerbert Dürr // ------------------------------------------------------------------------------
11495ea2752SHerbert Dürr 
handleObservation(NSString * pKeyPath)11595ea2752SHerbert Dürr bool Player::handleObservation( NSString* pKeyPath )
11695ea2752SHerbert Dürr {
11795ea2752SHerbert Dürr     OSL_TRACE( "AVPlayer::handleObservation key=\"%s\"", [pKeyPath UTF8String]);
11895ea2752SHerbert Dürr     if( [pKeyPath isEqualToString:AVPlayerItemDidPlayToEndTimeNotification])
11995ea2752SHerbert Dürr     {
12095ea2752SHerbert Dürr         OSL_TRACE( "AVPlayer replay=%d", mbLooping);
12195ea2752SHerbert Dürr         if( mbLooping )
12295ea2752SHerbert Dürr             setMediaTime( 0.0);
12395ea2752SHerbert Dürr     }
12495ea2752SHerbert Dürr     return true;
12595ea2752SHerbert Dürr }
12695ea2752SHerbert Dürr 
12795ea2752SHerbert Dürr // ------------------------------------------------------------------------------
12895ea2752SHerbert Dürr 
create(const::rtl::OUString & rURL)12995ea2752SHerbert Dürr bool Player::create( const ::rtl::OUString& rURL )
13095ea2752SHerbert Dürr {
13195ea2752SHerbert Dürr     // get the media asset
13295ea2752SHerbert Dürr     NSString* aNSStr = [NSString stringWithCharacters:rURL.getStr() length:rURL.getLength()];
13395ea2752SHerbert Dürr     NSURL* aNSURL = [NSURL URLWithString: [aNSStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
13495ea2752SHerbert Dürr     // get the matching AVPlayerItem
13595ea2752SHerbert Dürr     AVPlayerItem* pPlayerItem = [AVPlayerItem playerItemWithURL:aNSURL];
13695ea2752SHerbert Dürr 
13795ea2752SHerbert Dürr     // create or update the AVPlayer with the new AVPlayerItem
13895ea2752SHerbert Dürr     if( !mpPlayer )
13995ea2752SHerbert Dürr     {
14095ea2752SHerbert Dürr         mpPlayer = [AVPlayer playerWithPlayerItem:pPlayerItem];
14195ea2752SHerbert Dürr         CFRetain( mpPlayer );
14295ea2752SHerbert Dürr         [mpPlayer setActionAtItemEnd:AVPlayerActionAtItemEndNone];
14395ea2752SHerbert Dürr     }
14495ea2752SHerbert Dürr     else
14595ea2752SHerbert Dürr     {
14695ea2752SHerbert Dürr         // remove the obsoleted observers
14795ea2752SHerbert Dürr         AVPlayerItem* pOldPlayerItem = [mpPlayer currentItem];
14895ea2752SHerbert Dürr         [mpPlayer removeObserver:getObserver() forKeyPath:@"currentItem.status"];
14995ea2752SHerbert Dürr         [getObserver() removeHandlerForObject:pOldPlayerItem];
15095ea2752SHerbert Dürr         [[NSNotificationCenter defaultCenter] removeObserver:getObserver()
15195ea2752SHerbert Dürr             name:AVPlayerItemDidPlayToEndTimeNotification
15295ea2752SHerbert Dürr             object:pOldPlayerItem];
15395ea2752SHerbert Dürr         // replace the playeritem
15495ea2752SHerbert Dürr         [mpPlayer replaceCurrentItemWithPlayerItem:pPlayerItem];
15595ea2752SHerbert Dürr     }
15695ea2752SHerbert Dürr 
15795ea2752SHerbert Dürr     // observe the status of the current player item
15895ea2752SHerbert Dürr     [mpPlayer addObserver:getObserver() forKeyPath:@"currentItem.status" options:0 context:this];
15995ea2752SHerbert Dürr 
16095ea2752SHerbert Dürr     // observe playback-end needed for playback looping
16195ea2752SHerbert Dürr     [[NSNotificationCenter defaultCenter] addObserver:getObserver()
16295ea2752SHerbert Dürr         selector:@selector(onNotification:)
16395ea2752SHerbert Dürr         name:AVPlayerItemDidPlayToEndTimeNotification
16495ea2752SHerbert Dürr         object:pPlayerItem];
16595ea2752SHerbert Dürr     [getObserver() setHandlerForObject:pPlayerItem handler:this];
16695ea2752SHerbert Dürr 
16795ea2752SHerbert Dürr     return true;
16895ea2752SHerbert Dürr }
16995ea2752SHerbert Dürr 
17095ea2752SHerbert Dürr // ------------------------------------------------------------------------------
17195ea2752SHerbert Dürr 
start()17295ea2752SHerbert Dürr void SAL_CALL Player::start()
17395ea2752SHerbert Dürr     throw (uno::RuntimeException)
17495ea2752SHerbert Dürr {
17595ea2752SHerbert Dürr     if( !mpPlayer )
17695ea2752SHerbert Dürr         return;
17795ea2752SHerbert Dürr #if 0
17895ea2752SHerbert Dürr     const AVPlayerStatus eStatus = [mpPlayer status];
17995ea2752SHerbert Dürr     OSL_TRACE ("Player::start status=%d", (int)eStatus);
18095ea2752SHerbert Dürr     if( eStatus == AVPlayerStatusReadyToPlay)
18195ea2752SHerbert Dürr #endif
18295ea2752SHerbert Dürr         [mpPlayer play];
18395ea2752SHerbert Dürr     // else // TODO: delay until it becomes ready
18495ea2752SHerbert Dürr }
18595ea2752SHerbert Dürr 
18695ea2752SHerbert Dürr // ------------------------------------------------------------------------------
18795ea2752SHerbert Dürr 
stop()18895ea2752SHerbert Dürr void SAL_CALL Player::stop()
18995ea2752SHerbert Dürr     throw (uno::RuntimeException)
19095ea2752SHerbert Dürr {
19195ea2752SHerbert Dürr     if( !mpPlayer )
19295ea2752SHerbert Dürr         return;
19395ea2752SHerbert Dürr     const bool bPlaying = isPlaying();
19495ea2752SHerbert Dürr     OSL_TRACE ("Player::stop() playing=%d", bPlaying);
19595ea2752SHerbert Dürr     if( bPlaying )
19695ea2752SHerbert Dürr         [mpPlayer pause];
19795ea2752SHerbert Dürr }
19895ea2752SHerbert Dürr 
19995ea2752SHerbert Dürr // ------------------------------------------------------------------------------
20095ea2752SHerbert Dürr 
isPlaying()20195ea2752SHerbert Dürr sal_Bool SAL_CALL Player::isPlaying()
20295ea2752SHerbert Dürr     throw (uno::RuntimeException)
20395ea2752SHerbert Dürr {
20495ea2752SHerbert Dürr     if( !mpPlayer )
20595ea2752SHerbert Dürr         return false;
20695ea2752SHerbert Dürr     const float fRate = [mpPlayer rate];
20795ea2752SHerbert Dürr     return (fRate != 0.0);
20895ea2752SHerbert Dürr }
20995ea2752SHerbert Dürr 
21095ea2752SHerbert Dürr // ------------------------------------------------------------------------------
21195ea2752SHerbert Dürr 
getDuration()21295ea2752SHerbert Dürr double SAL_CALL Player::getDuration()
21395ea2752SHerbert Dürr     throw (uno::RuntimeException)
21495ea2752SHerbert Dürr {
21595ea2752SHerbert Dürr     // slideshow checks for non-zero duration, so cheat here
21695ea2752SHerbert Dürr     double duration = 0.01;
21795ea2752SHerbert Dürr 
21895ea2752SHerbert Dürr     if( mpPlayer )
21995ea2752SHerbert Dürr     {
22095ea2752SHerbert Dürr         AVPlayerItem* pItem = [mpPlayer currentItem];
221*deea6bb5SHerbert Dürr         if( [pItem status] == AVPlayerItemStatusReadyToPlay )
222*deea6bb5SHerbert Dürr             duration = CMTimeGetSeconds( [pItem duration] );
223*deea6bb5SHerbert Dürr         else // fall back to AVAsset's best guess
224*deea6bb5SHerbert Dürr             duration = CMTimeGetSeconds( [[pItem asset] duration] );
22595ea2752SHerbert Dürr     }
22695ea2752SHerbert Dürr 
22795ea2752SHerbert Dürr     return duration;
22895ea2752SHerbert Dürr }
22995ea2752SHerbert Dürr 
23095ea2752SHerbert Dürr // ------------------------------------------------------------------------------
23195ea2752SHerbert Dürr 
setMediaTime(double fTime)23295ea2752SHerbert Dürr void SAL_CALL Player::setMediaTime( double fTime )
23395ea2752SHerbert Dürr     throw (uno::RuntimeException)
23495ea2752SHerbert Dürr {
23595ea2752SHerbert Dürr     OSL_TRACE ("Player::setMediaTime( %.3fsec)", fTime);
23695ea2752SHerbert Dürr     if( mpPlayer )
23795ea2752SHerbert Dürr         [mpPlayer seekToTime: CMTimeMakeWithSeconds(fTime,1000) ];
23895ea2752SHerbert Dürr }
23995ea2752SHerbert Dürr 
24095ea2752SHerbert Dürr // ------------------------------------------------------------------------------
24195ea2752SHerbert Dürr 
getMediaTime()24295ea2752SHerbert Dürr double SAL_CALL Player::getMediaTime()
24395ea2752SHerbert Dürr     throw (uno::RuntimeException)
24495ea2752SHerbert Dürr {
24595ea2752SHerbert Dürr     if( !mpPlayer )
24695ea2752SHerbert Dürr         return 0.0;
24795ea2752SHerbert Dürr 
24895ea2752SHerbert Dürr     const double position = CMTimeGetSeconds( [mpPlayer currentTime] );
24995ea2752SHerbert Dürr     OSL_TRACE( "Player::getMediaTime() = %.3fsec", position);
25095ea2752SHerbert Dürr     if( position >= mfStopTime )
25195ea2752SHerbert Dürr         if( isPlaying() )
25295ea2752SHerbert Dürr             stop();
25395ea2752SHerbert Dürr 
25495ea2752SHerbert Dürr     return position;
25595ea2752SHerbert Dürr }
25695ea2752SHerbert Dürr 
25795ea2752SHerbert Dürr // ------------------------------------------------------------------------------
25895ea2752SHerbert Dürr 
setStopTime(double fTime)25995ea2752SHerbert Dürr void SAL_CALL Player::setStopTime( double fTime )
26095ea2752SHerbert Dürr     throw (uno::RuntimeException)
26195ea2752SHerbert Dürr {
26295ea2752SHerbert Dürr     OSL_TRACE ("Player::setStopTime( %.3fsec)", fTime);
26395ea2752SHerbert Dürr     mfStopTime = fTime;
26495ea2752SHerbert Dürr }
26595ea2752SHerbert Dürr 
26695ea2752SHerbert Dürr // ------------------------------------------------------------------------------
26795ea2752SHerbert Dürr 
getStopTime()26895ea2752SHerbert Dürr double SAL_CALL Player::getStopTime()
26995ea2752SHerbert Dürr     throw (uno::RuntimeException)
27095ea2752SHerbert Dürr {
27195ea2752SHerbert Dürr     return mfStopTime;
27295ea2752SHerbert Dürr }
27395ea2752SHerbert Dürr 
27495ea2752SHerbert Dürr // ------------------------------------------------------------------------------
27595ea2752SHerbert Dürr 
setRate(double fRate)27695ea2752SHerbert Dürr void SAL_CALL Player::setRate( double fRate )
27795ea2752SHerbert Dürr     throw (uno::RuntimeException)
27895ea2752SHerbert Dürr {
27995ea2752SHerbert Dürr     OSL_TRACE ("Player::setRate( %.3f)", fRate);
28095ea2752SHerbert Dürr     if( !mpPlayer )
28195ea2752SHerbert Dürr         return;
28295ea2752SHerbert Dürr 
28395ea2752SHerbert Dürr     // playback rate: 0 = stop, 1 = normal speed, 2 = double speed, -1 = normal speed backwards
28495ea2752SHerbert Dürr     [mpPlayer setRate: fRate];
28595ea2752SHerbert Dürr }
28695ea2752SHerbert Dürr 
28795ea2752SHerbert Dürr // ------------------------------------------------------------------------------
28895ea2752SHerbert Dürr 
getRate()28995ea2752SHerbert Dürr double SAL_CALL Player::getRate()
29095ea2752SHerbert Dürr     throw (uno::RuntimeException)
29195ea2752SHerbert Dürr {
29295ea2752SHerbert Dürr     // macavf: 0 = stop, 1 = normal speed, 2 = double speed, -1 = normal speed backwards
29395ea2752SHerbert Dürr     const double fRate = mpPlayer ? (double)[mpPlayer rate] : 1.0;
29495ea2752SHerbert Dürr     OSL_TRACE ("Player::getRate() = %.3f", fRate);
29595ea2752SHerbert Dürr     return fRate;
29695ea2752SHerbert Dürr }
29795ea2752SHerbert Dürr 
29895ea2752SHerbert Dürr // ------------------------------------------------------------------------------
29995ea2752SHerbert Dürr 
setPlaybackLoop(sal_Bool bSet)30095ea2752SHerbert Dürr void SAL_CALL Player::setPlaybackLoop( sal_Bool bSet )
30195ea2752SHerbert Dürr     throw (uno::RuntimeException)
30295ea2752SHerbert Dürr {
30395ea2752SHerbert Dürr     OSL_TRACE ("Player::setPlaybackLoop( %d)", bSet );
30495ea2752SHerbert Dürr     mbLooping = bSet;
30595ea2752SHerbert Dürr }
30695ea2752SHerbert Dürr 
30795ea2752SHerbert Dürr // ------------------------------------------------------------------------------
30895ea2752SHerbert Dürr 
isPlaybackLoop()30995ea2752SHerbert Dürr sal_Bool SAL_CALL Player::isPlaybackLoop()
31095ea2752SHerbert Dürr     throw (uno::RuntimeException)
31195ea2752SHerbert Dürr {
31295ea2752SHerbert Dürr     const bool bRet = mbLooping;
31395ea2752SHerbert Dürr     OSL_TRACE ("Player::isPlaybackLoop() = %d", bRet );
31495ea2752SHerbert Dürr     return bRet;
31595ea2752SHerbert Dürr }
31695ea2752SHerbert Dürr 
31795ea2752SHerbert Dürr // ------------------------------------------------------------------------------
31895ea2752SHerbert Dürr 
setMute(sal_Bool bSet)31995ea2752SHerbert Dürr void SAL_CALL Player::setMute( sal_Bool bSet )
32095ea2752SHerbert Dürr     throw (uno::RuntimeException)
32195ea2752SHerbert Dürr {
32295ea2752SHerbert Dürr     OSL_TRACE( "Player::setMute(%d), was-muted: %d unmuted-volume: %.3f", bSet, mbMuted, mfUnmutedVolume );
32395ea2752SHerbert Dürr 
32495ea2752SHerbert Dürr     if( !mpPlayer )
32595ea2752SHerbert Dürr         return;
32695ea2752SHerbert Dürr 
32795ea2752SHerbert Dürr     mbMuted = (bSet == TRUE);
32895ea2752SHerbert Dürr     [mpPlayer setMuted:mbMuted];
32995ea2752SHerbert Dürr }
33095ea2752SHerbert Dürr 
33195ea2752SHerbert Dürr // ------------------------------------------------------------------------------
33295ea2752SHerbert Dürr 
isMute()33395ea2752SHerbert Dürr sal_Bool SAL_CALL Player::isMute()
33495ea2752SHerbert Dürr     throw (uno::RuntimeException)
33595ea2752SHerbert Dürr {
33695ea2752SHerbert Dürr     OSL_TRACE ("Player::isMuted() = %d", mbMuted);
33795ea2752SHerbert Dürr     return mbMuted;
33895ea2752SHerbert Dürr }
33995ea2752SHerbert Dürr 
34095ea2752SHerbert Dürr // ------------------------------------------------------------------------------
34195ea2752SHerbert Dürr 
setVolumeDB(sal_Int16 nVolumeDB)34295ea2752SHerbert Dürr void SAL_CALL Player::setVolumeDB( sal_Int16 nVolumeDB )
34395ea2752SHerbert Dürr 	throw (uno::RuntimeException)
34495ea2752SHerbert Dürr {
34595ea2752SHerbert Dürr     // -40dB <-> AVPlayer volume 0.0
34695ea2752SHerbert Dürr     //   0dB <-> AVPlayer volume 1.0
34795ea2752SHerbert Dürr     mfUnmutedVolume = (nVolumeDB <= -40) ? 0.0 : pow( 10.0, nVolumeDB / 20.0 );
34895ea2752SHerbert Dürr     OSL_TRACE( "Player::setVolume(%ddB), muted=%d, unmuted-volume: %.3f", nVolumeDB, mbMuted, mfUnmutedVolume );
34995ea2752SHerbert Dürr 
35095ea2752SHerbert Dürr     // change volume
35195ea2752SHerbert Dürr     if( !mbMuted && mpPlayer )
35295ea2752SHerbert Dürr         [mpPlayer setVolume:mfUnmutedVolume];
35395ea2752SHerbert Dürr }
35495ea2752SHerbert Dürr 
35595ea2752SHerbert Dürr // ------------------------------------------------------------------------------
35695ea2752SHerbert Dürr 
getVolumeDB()35795ea2752SHerbert Dürr sal_Int16 SAL_CALL Player::getVolumeDB()
35895ea2752SHerbert Dürr 	throw (uno::RuntimeException)
35995ea2752SHerbert Dürr {
36095ea2752SHerbert Dürr     if( !mpPlayer )
36195ea2752SHerbert Dürr         return 0;
36295ea2752SHerbert Dürr 
36395ea2752SHerbert Dürr     // get the actual volume
36495ea2752SHerbert Dürr     const float fVolume = [mpPlayer volume];
36595ea2752SHerbert Dürr 
36695ea2752SHerbert Dürr     // convert into Dezibel value
36795ea2752SHerbert Dürr     // -40dB <-> AVPlayer volume 0.0
36895ea2752SHerbert Dürr     //   0dB <-> AVPlayer volume 1.0
36995ea2752SHerbert Dürr     const int nVolumeDB = (fVolume <= 0) ? -40 : lrint( 20.0*log10(fVolume));
37095ea2752SHerbert Dürr 
37195ea2752SHerbert Dürr     return (sal_Int16)nVolumeDB;
37295ea2752SHerbert Dürr }
37395ea2752SHerbert Dürr 
37495ea2752SHerbert Dürr // ------------------------------------------------------------------------------
37595ea2752SHerbert Dürr 
getPreferredPlayerWindowSize()37695ea2752SHerbert Dürr awt::Size SAL_CALL Player::getPreferredPlayerWindowSize()
37795ea2752SHerbert Dürr     throw (uno::RuntimeException)
37895ea2752SHerbert Dürr {
37995ea2752SHerbert Dürr     awt::Size aSize( 0, 0 ); // default size
38095ea2752SHerbert Dürr 
38195ea2752SHerbert Dürr     AVAsset* pMovie = [[mpPlayer currentItem] asset];
38295ea2752SHerbert Dürr     NSArray* pVideoTracks = [pMovie tracksWithMediaType:AVMediaTypeVideo];
38395ea2752SHerbert Dürr     AVAssetTrack* pFirstVideoTrack = (AVAssetTrack*)[pVideoTracks firstObject];
38495ea2752SHerbert Dürr     if( pFirstVideoTrack )
38595ea2752SHerbert Dürr     {
38695ea2752SHerbert Dürr         const CGSize aPrefSize = [pFirstVideoTrack naturalSize];
38795ea2752SHerbert Dürr         aSize = awt::Size( aPrefSize.width, aPrefSize.height );
38895ea2752SHerbert Dürr     }
38995ea2752SHerbert Dürr 
39095ea2752SHerbert Dürr     return aSize;
39195ea2752SHerbert Dürr }
39295ea2752SHerbert Dürr 
39395ea2752SHerbert Dürr // ------------------------------------------------------------------------------
39495ea2752SHerbert Dürr 
createPlayerWindow(const uno::Sequence<uno::Any> & aArguments)39595ea2752SHerbert Dürr uno::Reference< ::media::XPlayerWindow > SAL_CALL Player::createPlayerWindow( const uno::Sequence< uno::Any >& aArguments )
39695ea2752SHerbert Dürr     throw (uno::RuntimeException)
39795ea2752SHerbert Dürr {
39895ea2752SHerbert Dürr     // get the preferred window size
39995ea2752SHerbert Dürr     const awt::Size aSize( getPreferredPlayerWindowSize() );
40095ea2752SHerbert Dürr     OSL_TRACE( "Player::createPlayerWindow %dx%d argsLength: %d", aSize.Width, aSize.Height, aArguments.getLength() );
40195ea2752SHerbert Dürr 
40295ea2752SHerbert Dürr     // get the parent view
40395ea2752SHerbert Dürr     sal_IntPtr nNSViewPtr = NULL;
40495ea2752SHerbert Dürr     aArguments[0] >>= nNSViewPtr;
40595ea2752SHerbert Dürr     NSView* pParentView = reinterpret_cast<NSView*>(nNSViewPtr);
40695ea2752SHerbert Dürr 
40795ea2752SHerbert Dürr     // check the window parameters
40895ea2752SHerbert Dürr     uno::Reference< ::media::XPlayerWindow > xRet;
40995ea2752SHerbert Dürr     if( (aSize.Width <= 0) || (aSize.Height <= 0) || (pParentView == NULL) )
41095ea2752SHerbert Dürr          return xRet;
41195ea2752SHerbert Dürr 
41295ea2752SHerbert Dürr     // create the window
41395ea2752SHerbert Dürr     ::avmedia::macavf::Window* pWindow = new ::avmedia::macavf::Window( mxMgr, *this, pParentView );
41495ea2752SHerbert Dürr     xRet = pWindow;
41595ea2752SHerbert Dürr     return xRet;
41695ea2752SHerbert Dürr }
41795ea2752SHerbert Dürr 
41895ea2752SHerbert Dürr // ------------------------------------------------------------------------------
41995ea2752SHerbert Dürr 
createFrameGrabber()42095ea2752SHerbert Dürr uno::Reference< media::XFrameGrabber > SAL_CALL Player::createFrameGrabber()
42195ea2752SHerbert Dürr     throw (uno::RuntimeException)
42295ea2752SHerbert Dürr {
42395ea2752SHerbert Dürr     uno::Reference< media::XFrameGrabber > xRet;
42495ea2752SHerbert Dürr     OSL_TRACE ("Player::createFrameGrabber");
42595ea2752SHerbert Dürr 
4266a7d45efSHerbert Dürr     FrameGrabber* pGrabber = new FrameGrabber( mxMgr );
4276a7d45efSHerbert Dürr     AVAsset* pMovie = [[mpPlayer currentItem] asset];
4286a7d45efSHerbert Dürr     if( pGrabber->create( pMovie ) )
4296a7d45efSHerbert Dürr         xRet = pGrabber;
43095ea2752SHerbert Dürr 
43195ea2752SHerbert Dürr     return xRet;
43295ea2752SHerbert Dürr }
43395ea2752SHerbert Dürr 
43495ea2752SHerbert Dürr // ------------------------------------------------------------------------------
43595ea2752SHerbert Dürr 
getImplementationName()43695ea2752SHerbert Dürr ::rtl::OUString SAL_CALL Player::getImplementationName(  )
43795ea2752SHerbert Dürr     throw (uno::RuntimeException)
43895ea2752SHerbert Dürr {
43995ea2752SHerbert Dürr     return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( AVMEDIA_MACAVF_PLAYER_IMPLEMENTATIONNAME ) );
44095ea2752SHerbert Dürr }
44195ea2752SHerbert Dürr 
44295ea2752SHerbert Dürr // ------------------------------------------------------------------------------
44395ea2752SHerbert Dürr 
supportsService(const::rtl::OUString & ServiceName)44495ea2752SHerbert Dürr sal_Bool SAL_CALL Player::supportsService( const ::rtl::OUString& ServiceName )
44595ea2752SHerbert Dürr     throw (uno::RuntimeException)
44695ea2752SHerbert Dürr {
44795ea2752SHerbert Dürr     return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( AVMEDIA_MACAVF_PLAYER_SERVICENAME ) );
44895ea2752SHerbert Dürr }
44995ea2752SHerbert Dürr 
45095ea2752SHerbert Dürr // ------------------------------------------------------------------------------
45195ea2752SHerbert Dürr 
getSupportedServiceNames()45295ea2752SHerbert Dürr uno::Sequence< ::rtl::OUString > SAL_CALL Player::getSupportedServiceNames(  )
45395ea2752SHerbert Dürr     throw (uno::RuntimeException)
45495ea2752SHerbert Dürr {
45595ea2752SHerbert Dürr     uno::Sequence< ::rtl::OUString > aRet(1);
45695ea2752SHerbert Dürr     aRet[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( AVMEDIA_MACAVF_PLAYER_SERVICENAME ) );
45795ea2752SHerbert Dürr 
45895ea2752SHerbert Dürr     return aRet;
45995ea2752SHerbert Dürr }
46095ea2752SHerbert Dürr 
46195ea2752SHerbert Dürr } // namespace macavf
46295ea2752SHerbert Dürr } // namespace avmedia
46395ea2752SHerbert Dürr 
464