mpengine/src/mpmpxplaybackframeworkwrapper_p.cpp
changeset 22 ecf06a08d4d9
child 29 8192e5b5c935
equal deleted inserted replaced
20:82baf59ce8dd 22:ecf06a08d4d9
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: Framework wraper for Playback - Private.
       
    15 *
       
    16 */
       
    17 
       
    18 #include <mpxplaybackutility.h>
       
    19 #include <mpxmedia.h>
       
    20 #include <mpxmediageneraldefs.h>
       
    21 #include <mpxmediamusicdefs.h>
       
    22 #include <mpxcommandgeneraldefs.h>
       
    23 #include <mpxplaybackmessage.h>
       
    24 #include <mpxmessagegeneraldefs.h>
       
    25 #include <mpxplaybackmessagedefs.h>
       
    26 #include <mpxplaybackframeworkdefs.h>
       
    27 #include <hbglobal.h>
       
    28 #include <xqsharablefile.h>
       
    29 
       
    30 #include "mpmpxplaybackframeworkwrapper_p.h"
       
    31 #include "mpmpxplaybackframeworkwrapper.h"
       
    32 #include "mpplaybackdata.h"
       
    33 #include "mpcommondefs.h"
       
    34 #include "mptrace.h"
       
    35 /*!
       
    36     \class MpMpxPlaybackFrameworkWrapperPrivate
       
    37     \brief Wrapper for mpx framework utilities - private implementation.
       
    38 
       
    39     This is a private implementation of the mpx framework wrapper utilties interface.
       
    40 */
       
    41 
       
    42 /*!
       
    43  \internal
       
    44  */
       
    45 MpMpxPlaybackFrameworkWrapperPrivate::MpMpxPlaybackFrameworkWrapperPrivate( MpMpxPlaybackFrameworkWrapper *qq)
       
    46     : q_ptr( qq ),
       
    47       iPlaybackUtility(0),
       
    48       iMedia(0),
       
    49       iPlaybackData(0)
       
    50 {
       
    51     TX_LOG
       
    52 }
       
    53 
       
    54 /*!
       
    55  \internal
       
    56  */
       
    57 MpMpxPlaybackFrameworkWrapperPrivate::~MpMpxPlaybackFrameworkWrapperPrivate()
       
    58 {
       
    59     TX_ENTRY
       
    60 
       
    61     if ( iPlaybackUtility ) {
       
    62         ForceStopL();
       
    63         iPlaybackUtility->RemoveObserverL(*this);
       
    64         iPlaybackUtility->Close();
       
    65     }
       
    66 
       
    67     delete iMedia;
       
    68     delete iPlaybackData;
       
    69 
       
    70     TX_EXIT
       
    71 }
       
    72 
       
    73 /*!
       
    74  \internal
       
    75  */
       
    76 void MpMpxPlaybackFrameworkWrapperPrivate::init( MpCommon::MpViewMode viewMode, TUid hostUid )
       
    77 {
       
    78     iViewMode = viewMode;
       
    79     mHostUid = hostUid;
       
    80     TRAPD(err, DoInitL());
       
    81     if ( err != KErrNone ) {
       
    82         TX_LOG_ARGS("Error: " << err << "; should never get here.");
       
    83     }
       
    84 }
       
    85 
       
    86 /*!
       
    87  \internal
       
    88  */
       
    89 void MpMpxPlaybackFrameworkWrapperPrivate::play( QString aFilename )
       
    90 {
       
    91     TRAPD( err, DoPlayL(aFilename) );
       
    92     if ( err != KErrNone ) {
       
    93         TX_LOG_ARGS( "Error: " << err << "; should never get here." );
       
    94     }
       
    95 }
       
    96 
       
    97 /*!
       
    98  \internal
       
    99  */
       
   100 void MpMpxPlaybackFrameworkWrapperPrivate::play( const XQSharableFile& file )
       
   101 {
       
   102     TRAPD( err, DoPlayL( file ) );
       
   103     if ( err != KErrNone ) {
       
   104         TX_LOG_ARGS( "Error: " << err << "; should never get here." );
       
   105     }
       
   106 }
       
   107 /*!
       
   108  \internal
       
   109  */
       
   110 void MpMpxPlaybackFrameworkWrapperPrivate::playPause()
       
   111 {
       
   112     TX_ENTRY
       
   113     TRAPD(err, iPlaybackUtility->CommandL(EPbCmdPlayPause));
       
   114     if ( err != KErrNone ) {
       
   115         TX_LOG_ARGS("Error: " << err << "; should never get here.");
       
   116     }
       
   117     TX_EXIT
       
   118 }
       
   119 
       
   120 /*!
       
   121  \internal
       
   122  */
       
   123 void MpMpxPlaybackFrameworkWrapperPrivate::stop()
       
   124 {
       
   125     TX_ENTRY
       
   126     TRAPD(err, iPlaybackUtility->CommandL(EPbCmdStop));
       
   127     if ( err != KErrNone ) {
       
   128         TX_LOG_ARGS("Error: " << err << "; should never get here.");
       
   129     }
       
   130     TX_EXIT
       
   131 }
       
   132 
       
   133 /*!
       
   134  \internal
       
   135  */
       
   136 void MpMpxPlaybackFrameworkWrapperPrivate::skipForward()
       
   137 {
       
   138     TX_ENTRY
       
   139     TRAPD(err, iPlaybackUtility->CommandL(EPbCmdNext));
       
   140     if ( err != KErrNone ) {
       
   141         TX_LOG_ARGS("Error: " << err << "; should never get here.");
       
   142     }
       
   143     TX_EXIT
       
   144 }
       
   145 
       
   146 /*!
       
   147  \internal
       
   148  */
       
   149 void MpMpxPlaybackFrameworkWrapperPrivate::skipBackward()
       
   150 {
       
   151     TX_ENTRY
       
   152     TRAPD(err, iPlaybackUtility->CommandL(EPbCmdPrevious));
       
   153     if ( err != KErrNone ) {
       
   154         TX_LOG_ARGS("Error: " << err << "; should never get here.");
       
   155     }
       
   156     TX_EXIT
       
   157 }
       
   158 
       
   159 /*!
       
   160  \internal
       
   161  */
       
   162 void MpMpxPlaybackFrameworkWrapperPrivate::setPosition( int value )
       
   163 {
       
   164     TX_ENTRY_ARGS("value =" << value);
       
   165     TRAPD(err, iPlaybackUtility->SetL(EPbPropertyPosition, value));
       
   166     if ( err != KErrNone ) {
       
   167         TX_LOG_ARGS("Error: " << err << "; should never get here.");
       
   168     }
       
   169     TX_EXIT
       
   170 }
       
   171 
       
   172 /*!
       
   173  \internal
       
   174  */
       
   175 void MpMpxPlaybackFrameworkWrapperPrivate::setShuffle( bool mode )
       
   176 {
       
   177     TX_ENTRY_ARGS("mode =" << mode);
       
   178     TRAPD(err, iPlaybackUtility->SetL(EPbPropertyRandomMode, mode));
       
   179     if ( err != KErrNone ) {
       
   180         TX_LOG_ARGS("Error: " << err << "; should never get here.");
       
   181     }
       
   182     TX_EXIT
       
   183 }
       
   184 
       
   185 /*!
       
   186  \internal
       
   187  */
       
   188 void MpMpxPlaybackFrameworkWrapperPrivate::setRepeat( bool mode )
       
   189 {
       
   190     TX_ENTRY_ARGS("mode =" << mode);
       
   191     TRAPD(err, iPlaybackUtility->SetL(EPbPropertyRepeatMode, mode ? EPbRepeatAll : EPbRepeatOff));
       
   192     if ( err != KErrNone ) {
       
   193         TX_LOG_ARGS("Error: " << err << "; should never get here.");
       
   194     }
       
   195     TX_EXIT
       
   196 }
       
   197 
       
   198 /*!
       
   199  \internal
       
   200  */
       
   201 MpPlaybackData *MpMpxPlaybackFrameworkWrapperPrivate::playbackData()
       
   202 {
       
   203     return iPlaybackData;
       
   204 }
       
   205 
       
   206 /*!
       
   207  \internal
       
   208  */
       
   209 void MpMpxPlaybackFrameworkWrapperPrivate::HandlePlaybackMessage( CMPXMessage *aMessage, TInt aError )
       
   210 {
       
   211     TX_ENTRY_ARGS("aError=" << aError);
       
   212     if ( aError == KErrNone && aMessage ) {
       
   213         TRAP_IGNORE( DoHandlePlaybackMessageL(*aMessage) );
       
   214     }
       
   215     TX_EXIT
       
   216 }
       
   217 
       
   218 /*!
       
   219  \internal
       
   220  */
       
   221 void MpMpxPlaybackFrameworkWrapperPrivate::HandlePropertyL(
       
   222     TMPXPlaybackProperty aProperty,
       
   223     TInt aValue,
       
   224     TInt aError )
       
   225 {
       
   226     TX_ENTRY_ARGS("aProperty=" << aProperty << "aValue=" << aValue << "aError=" << aError)
       
   227     if ( KErrNone == aError ) {
       
   228         switch ( aProperty  ) {
       
   229             case EPbPropertyPosition:
       
   230                 TX_LOG_ARGS("EPbPropertyPosition")
       
   231                 iPlaybackData->setPosition(aValue);
       
   232                 break;
       
   233             case EPbPropertyDuration:
       
   234                 TX_LOG_ARGS("EPbPropertyDuration")
       
   235                 iPlaybackData->setDuration(aValue);
       
   236                 break;
       
   237             default:
       
   238                 break;
       
   239         }
       
   240     }
       
   241     TX_EXIT
       
   242 }
       
   243 
       
   244 /*!
       
   245  \internal
       
   246  */
       
   247 void MpMpxPlaybackFrameworkWrapperPrivate::HandleSubPlayerNamesL(
       
   248     TUid aPlayer,
       
   249     const MDesCArray *aSubPlayers,
       
   250     TBool aComplete,
       
   251     TInt aError )
       
   252 {
       
   253     Q_UNUSED(aPlayer);
       
   254     Q_UNUSED(aSubPlayers);
       
   255     Q_UNUSED(aComplete);
       
   256     Q_UNUSED(aError);
       
   257     TX_LOG
       
   258 }
       
   259 
       
   260 /*!
       
   261  \internal
       
   262  */
       
   263 void MpMpxPlaybackFrameworkWrapperPrivate::HandleMediaL(
       
   264     const CMPXMedia& aProperties,
       
   265     TInt aError )
       
   266 {
       
   267     TX_ENTRY_ARGS("aError=" << aError);
       
   268     if ( KErrNone != aError || !iPlaybackData ) {
       
   269         TX_EXIT
       
   270         return;
       
   271     }
       
   272 
       
   273     if ( iMedia ) {
       
   274         delete iMedia;
       
   275         iMedia = NULL;
       
   276     }
       
   277     iMedia = CMPXMedia::NewL( aProperties );
       
   278 
       
   279     bool changed = false;
       
   280     if ( aProperties.IsSupported( KMPXMediaGeneralTitle ) ) {
       
   281         changed |= iPlaybackData->setTitle(
       
   282             QString::fromUtf16(
       
   283                 aProperties.ValueText( KMPXMediaGeneralTitle ).Ptr(),
       
   284                 aProperties.ValueText( KMPXMediaGeneralTitle ).Length() ) );
       
   285     }
       
   286     else {
       
   287         changed |= iPlaybackData->setTitle(
       
   288             QString::fromUtf16(
       
   289                 aProperties.ValueText( KMPXMediaGeneralUri ).Ptr(),
       
   290                 aProperties.ValueText( KMPXMediaGeneralUri ).Length() ) );
       
   291     }
       
   292     
       
   293     if ( aProperties.IsSupported( KMPXMediaMusicArtist ) ) {
       
   294         changed |= iPlaybackData->setArtist(
       
   295             QString::fromUtf16(
       
   296                 aProperties.ValueText( KMPXMediaMusicArtist ).Ptr(),
       
   297                 aProperties.ValueText( KMPXMediaMusicArtist ).Length() ) );
       
   298     }
       
   299     else {
       
   300             changed |= iPlaybackData->setArtist(hbTrId("txt_mus_other_unknown3"));
       
   301     }
       
   302     if ( aProperties.IsSupported( KMPXMediaMusicAlbum ) ) {
       
   303         changed |= iPlaybackData->setAlbum(
       
   304             QString::fromUtf16(
       
   305                 aProperties.ValueText( KMPXMediaMusicAlbum ).Ptr(),
       
   306                 aProperties.ValueText( KMPXMediaMusicAlbum ).Length() ) );
       
   307     }
       
   308     else {
       
   309             changed |= iPlaybackData->setAlbum(hbTrId("txt_mus_other_unknown4"));
       
   310     }
       
   311     if ( changed ) {
       
   312         // This is required to propagate the playback info to UI at once.
       
   313         iPlaybackData->commitPlaybackInfo();
       
   314     }
       
   315 
       
   316     if ( aProperties.IsSupported( KMPXMediaGeneralUri) ) {
       
   317         iPlaybackData->setUri(
       
   318             QString::fromUtf16(
       
   319                 aProperties.ValueText( KMPXMediaGeneralUri ).Ptr(),
       
   320                 aProperties.ValueText( KMPXMediaGeneralUri ).Length() ) );
       
   321     }
       
   322     if (aProperties.IsSupported(TMPXAttribute(KMPXMediaMusicAlbumArtFileName))) {
       
   323         iPlaybackData->setAlbumArtUri(
       
   324             QString::fromUtf16(
       
   325                 aProperties.ValueText(KMPXMediaMusicAlbumArtFileName).Ptr(),
       
   326                 aProperties.ValueText(KMPXMediaMusicAlbumArtFileName).Length()));
       
   327     }
       
   328     else {
       
   329         iPlaybackData->setAlbumArtUri(
       
   330             QString::fromUtf16(
       
   331                 aProperties.ValueText( KMPXMediaGeneralUri ).Ptr(),
       
   332                 aProperties.ValueText( KMPXMediaGeneralUri ).Length() ) );
       
   333     }
       
   334     
       
   335   
       
   336     TX_EXIT
       
   337 }
       
   338 
       
   339 /*!
       
   340  \internal
       
   341  */
       
   342 void MpMpxPlaybackFrameworkWrapperPrivate::DoInitL()
       
   343 {
       
   344     TX_ENTRY
       
   345 
       
   346    iPlaybackUtility = MMPXPlaybackUtility::UtilityL( mHostUid );
       
   347    iPlaybackUtility->AddObserverL( *this );
       
   348    iPlaybackData = new MpPlaybackData();
       
   349     TX_EXIT
       
   350 }
       
   351 
       
   352 /*!
       
   353  \internal
       
   354  */
       
   355 void MpMpxPlaybackFrameworkWrapperPrivate::DoPlayL( QString aFilename )
       
   356 {
       
   357     TX_ENTRY
       
   358     if ( !aFilename.isNull() ) {
       
   359         const TDesC& playTitle = TPtrC(reinterpret_cast<const TText*>( aFilename.constData() ));
       
   360         iPlaybackUtility->InitL( playTitle );
       
   361     }
       
   362     TX_EXIT
       
   363 }
       
   364 
       
   365 /*!
       
   366  \internal
       
   367  */
       
   368 void MpMpxPlaybackFrameworkWrapperPrivate::DoPlayL( const XQSharableFile& file )
       
   369 {
       
   370     TX_ENTRY
       
   371         
       
   372     RFile xqfile;
       
   373     bool ok = file.getHandle( xqfile );
       
   374     if ( ok ) {
       
   375         iPlaybackUtility->InitL( xqfile );
       
   376     }
       
   377 	else {
       
   378 		TX_LOG_ARGS("Error: " << ok << "; should never get here.");
       
   379 	}
       
   380     
       
   381     
       
   382     TX_EXIT
       
   383 }
       
   384 /*!
       
   385  \internal
       
   386  */
       
   387 void MpMpxPlaybackFrameworkWrapperPrivate::DoHandlePlaybackMessageL( const CMPXMessage& aMessage )
       
   388 {
       
   389     TX_ENTRY
       
   390     TMPXMessageId id( aMessage.ValueTObjectL<TMPXMessageId>( KMPXMessageGeneralId ) );
       
   391     if ( KMPXMessageGeneral == id ) {
       
   392         TInt event( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralEvent ) );
       
   393         TInt type( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralType ) );
       
   394         TInt data( aMessage.ValueTObjectL<TInt>( KMPXMessageGeneralData ) );
       
   395         TX_LOG_ARGS("event=" << event << ", type=" << type << ", data=" << data);
       
   396 
       
   397         switch ( event ) {
       
   398             case TMPXPlaybackMessage::EStateChanged:
       
   399                 TX_LOG_ARGS("TMPXPlaybackMessage::EStateChanged")
       
   400                 UpdateStateL();
       
   401                 break;
       
   402             case TMPXPlaybackMessage::EInitializeComplete:
       
   403                 TX_LOG_ARGS("TMPXPlaybackMessage::EInitializeComplete")
       
   404                 if ( data ) {
       
   405                     // Play the track
       
   406                     CMPXCommand *cmd( CMPXCommand::NewL() );
       
   407                     CleanupStack::PushL( cmd );
       
   408                     cmd->SetTObjectValueL<TInt>( KMPXCommandGeneralId,
       
   409                             KMPXCommandIdPlaybackGeneral );
       
   410                     cmd->SetTObjectValueL<TInt>(
       
   411                             KMPXCommandPlaybackGeneralType,
       
   412                             EPbCmdPlay );
       
   413                     cmd->SetTObjectValueL<TBool>( KMPXCommandGeneralDoSync,
       
   414                             ETrue );
       
   415                     cmd->SetTObjectValueL<TBool>(
       
   416                             KMPXCommandPlaybackGeneralNoBuffer,
       
   417                             ETrue );
       
   418                     iPlaybackUtility->CommandL( *cmd );
       
   419                     CleanupStack::PopAndDestroy( cmd );
       
   420                 }
       
   421                 break;
       
   422             case TMPXPlaybackMessage::EPropertyChanged:
       
   423                 TX_LOG_ARGS("TMPXPlaybackMessage::EPropertyChanged")
       
   424                 TMPXPlaybackProperty property;
       
   425                 property = static_cast<TMPXPlaybackProperty>( type );
       
   426                 HandlePropertyL( property, data, KErrNone );
       
   427                 break;
       
   428             case TMPXPlaybackMessage::EMediaChanged:
       
   429                 TX_LOG_ARGS("TMPXPlaybackMessage::EMediaChanged")
       
   430                 RetrieveSongDetailsL();
       
   431                 break;
       
   432             default:
       
   433                 break;
       
   434         }
       
   435     }
       
   436     TX_EXIT
       
   437 }
       
   438 
       
   439 /*!
       
   440  \internal
       
   441  */
       
   442 void MpMpxPlaybackFrameworkWrapperPrivate::ForceStopL()
       
   443 {
       
   444     TX_ENTRY
       
   445     if ( iPlaybackData->playbackState() != MpPlaybackData::Stopped ) {
       
   446         // Stop the track
       
   447         CMPXCommand *cmd( CMPXCommand::NewL() );
       
   448         CleanupStack::PushL( cmd );
       
   449         cmd->SetTObjectValueL<TInt>( KMPXCommandGeneralId, KMPXCommandIdPlaybackGeneral );
       
   450         cmd->SetTObjectValueL<TInt>( KMPXCommandPlaybackGeneralType, EPbCmdStop );
       
   451         cmd->SetTObjectValueL<TBool>( KMPXCommandGeneralDoSync, ETrue );
       
   452         cmd->SetTObjectValueL<TBool>( KMPXCommandPlaybackGeneralNoBuffer, ETrue );
       
   453         iPlaybackUtility->CommandL( *cmd );
       
   454         CleanupStack::PopAndDestroy( cmd );
       
   455 
       
   456        // iPlaybackUtility->RemoveObserverL(*this);
       
   457     }
       
   458     TX_EXIT
       
   459 }
       
   460 
       
   461 /*!
       
   462  \internal
       
   463  */
       
   464 void MpMpxPlaybackFrameworkWrapperPrivate::UpdateStateL()
       
   465 {
       
   466     TX_ENTRY
       
   467     if ( !iPlaybackUtility->Source() ) {
       
   468         TX_LOG_ARGS("There is no source")
       
   469         iPlaybackData->setPlaybackState( MpPlaybackData::Stopped );
       
   470     }
       
   471     else {
       
   472         switch ( iPlaybackUtility->StateL() ) {
       
   473             case EPbStatePlaying:
       
   474                 TX_LOG_ARGS("EPbStatePlaying")
       
   475                 iPlaybackData->setPlaybackState( MpPlaybackData::Playing );
       
   476                 break;
       
   477             case EPbStatePaused:
       
   478                 TX_LOG_ARGS("EPbStatePaused")
       
   479                 iPlaybackData->setPlaybackState( MpPlaybackData::Paused );
       
   480                 break;
       
   481             case EPbStateStopped:
       
   482                 TX_LOG_ARGS("EPbStateStopped")
       
   483                 iPlaybackData->setPlaybackState( MpPlaybackData::Stopped );
       
   484                 break;
       
   485             default:
       
   486                 break;
       
   487         }
       
   488     }
       
   489     TX_EXIT
       
   490 }
       
   491 
       
   492 /*!
       
   493  \internal
       
   494  */
       
   495 void MpMpxPlaybackFrameworkWrapperPrivate::RetrieveSongDetailsL()
       
   496 {
       
   497     TX_ENTRY
       
   498     MMPXSource *mediaSrc = iPlaybackUtility->Source();
       
   499     User::LeaveIfNull( mediaSrc );
       
   500     RArray<TMPXAttribute> requestedAttr;
       
   501     CleanupClosePushL( requestedAttr );
       
   502     requestedAttr.AppendL( TMPXAttribute( KMPXMediaGeneralTitle ) );
       
   503     requestedAttr.AppendL( TMPXAttribute( KMPXMediaMusicArtist ) );
       
   504     requestedAttr.AppendL( TMPXAttribute( KMPXMediaMusicAlbum ) );
       
   505     requestedAttr.AppendL( TMPXAttribute( KMPXMediaGeneralUri ) );
       
   506     requestedAttr.AppendL( TMPXAttribute( KMPXMediaMusicAlbumArtFileName ) );
       
   507 
       
   508     mediaSrc->MediaL( requestedAttr.Array(), *this );
       
   509     CleanupStack::PopAndDestroy( &requestedAttr );
       
   510     TX_EXIT
       
   511 }
       
   512