diff -r 6c1dfe4da5dd -r 63223d4fd956 mpx/playbackframework/playbackengine/src/mpxplaybackmediahelper.cpp --- a/mpx/playbackframework/playbackengine/src/mpxplaybackmediahelper.cpp Tue Aug 31 15:41:40 2010 +0300 +++ b/mpx/playbackframework/playbackengine/src/mpxplaybackmediahelper.cpp Wed Sep 01 12:23:05 2010 +0100 @@ -243,33 +243,73 @@ { MPX_FUNC_EX("CMPXPlaybackMediaHelper::HandleCollectionMediaL"); MPX_DEBUG2("CMPXPlaybackMediaHelper::HandleCollectionMediaL(): error %d", aError); - MPX_DEBUG2("CMPXPlaybackMediaHelper::HandleCollectionMediaL task %d", - iTaskQueue->Task()); - - if ( iTaskQueue->Param() ) + + // First check if media attributes supported, if not, need to retrieve + // from playback plugin + TBool mediaOk( ETrue ); + // Note: The following block is for uPnP remote playlist which does not contain + // metadata in the remote playlist. However, uPnP update to gurantee that titles + // are available in the collection plugin. If KMPXMediaColDetailMediaNotAvailable + // returned, UI can at least update title anyway anyway. + // + // We could not call MediaFromPluginL before the plugin initiliazed. uPnP made + // changes so that it will call back media after the new track is initialized. + // So we don't need call plugin API MediaL. + /*if ( KErrNone == aError ) + { // media object is ok + if ( aMedia.IsSupported( KMPXMediaColDetailMediaNotAvailable )) + { + TBool mediaNotSupported( + aMedia.ValueTObjectL( KMPXMediaColDetailMediaNotAvailable )); + MPX_DEBUG2("HandleCollectionMediaL media not inCollection %d", + mediaNotSupported); + if ( mediaNotSupported) + { // It must be uPnP remote playlist, media request can only be + // sent to plugin at initialising, playing & pause state + mediaOk = EFalse; + // need to create a copy of buf since that will be delete when + // this task is completed + const TDesC8& data( iTaskQueue->BufData() ); + CBufBase* buf( MPXUser::CreateBufferLC( data.Size() )); + buf->Write( 0, data ); + iEngine.MediaFromPluginL( + static_cast( + iTaskQueue->Callback() ), + buf ); + CleanupStack::Pop( buf ); + } //otherwise, just send uri to clients. + } + }*/ + + if ( mediaOk || aError ) { - // Broadcast - CMPXMessage* msg( CMPXMessage::NewL() ); - CleanupStack::PushL( msg ); - msg->SetTObjectValueL( KMPXMessageGeneralId, - KMPXMessagePbMediaChanged ); - msg->SetCObjectValueL( KMPXMessagePbMedia, - const_cast( &aMedia )); - CMPXClientList* clientList( - static_cast( iTaskQueue->Callback() )); - clientList->SendMsg(msg, KErrNone); - CleanupStack::PopAndDestroy( msg ); + MPX_DEBUG2("CMPXPlaybackMediaHelper::HandleCollectionMediaL task %d", + iTaskQueue->Task()); + + if ( iTaskQueue->Param() ) + { + // Broadcast + CMPXMessage* msg( CMPXMessage::NewL() ); + CleanupStack::PushL( msg ); + msg->SetTObjectValueL( KMPXMessageGeneralId, + KMPXMessagePbMediaChanged ); + msg->SetCObjectValueL( KMPXMessagePbMedia, + const_cast( &aMedia )); + CMPXClientList* clientList( + static_cast( iTaskQueue->Callback() )); + clientList->SendMsg(msg, KErrNone); + CleanupStack::PopAndDestroy( msg ); + } + else + { + // Callback + MPX_DEBUG2("CMPXPlaybackMediaHelper::HandleCollectionMediaL task cb 0x%08x", + iTaskQueue->Callback()); + MMPXPlaybackEngineObserver* callback( + static_cast( iTaskQueue->Callback() )); + callback->HandleMedia( aMedia, aError ); + } } - else - { - // Callback - MPX_DEBUG2("CMPXPlaybackMediaHelper::HandleCollectionMediaL task cb 0x%08x", - iTaskQueue->Callback()); - MMPXPlaybackEngineObserver* callback( - static_cast( iTaskQueue->Callback() )); - callback->HandleMedia( aMedia, aError ); - } - MPX_DEBUG1("CMPXPlaybackMediaHelper::HandleCollectionMediaL complete task"); iTaskQueue->CompleteTask(); }