mpxmusicplayer/commonui/src/mpxalbumartutil.cpp
changeset 0 ff3acec5bc43
child 2 b70d77332e66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mpxmusicplayer/commonui/src/mpxalbumartutil.cpp	Thu Dec 17 08:45:05 2009 +0200
@@ -0,0 +1,314 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  MPX album utility API
+*
+*/
+
+#include <e32std.h>
+#include <MetaDataUtility.h>
+#include <MetaDataFieldContainer.h>
+#include <mpxuser.h>
+#include <mpxmedia.h>
+#include <mpxmediamusicdefs.h>
+#include <mpxmediageneraldefs.h>
+#include <mpxlog.h>
+
+#include "mpxalbumartutilobserver.h"
+#include "mpximageutil.h"
+#include "mpxalbumartutil.h"
+#include <thumbnaildata.h>
+#include <thumbnailobjectsource.h>
+#include <centralrepository.h>
+
+#define THUMBNAIL_CENREP_UID 0x102830B0
+
+const TUint32 KSizeAudioGridWidth = 0x12;
+const TUint32 KSizeAudioGridHeight = 0x13;
+const TUint32 KSizeAudioFullscreenWidth = 0x16;
+const TUint32 KSizeAudioFullscreenHeight = 0x17;
+
+
+_LIT( KMPXAlbumMimeType, "audio/mpeg3" );
+// ============================== MEMBER FUNCTIONS ============================
+
+// ----------------------------------------------------------------------------
+// Create the playback utility object
+// ----------------------------------------------------------------------------
+//
+EXPORT_C CMPXAlbumArtUtil* CMPXAlbumArtUtil::NewL()
+    {
+    CMPXAlbumArtUtil* self = new(ELeave)CMPXAlbumArtUtil();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+
+// ----------------------------------------------------------------------------
+// Destructor
+// ----------------------------------------------------------------------------
+//
+EXPORT_C CMPXAlbumArtUtil::~CMPXAlbumArtUtil()
+    {
+    if (iArtUtil)
+        {
+        delete iArtUtil;
+        }
+    if(iFilename)
+        {   
+        delete iFilename;
+        iFilename = NULL;
+        }
+    delete iThumbnailManager;
+    }
+
+
+// ----------------------------------------------------------------------------
+// Constructor
+// ----------------------------------------------------------------------------
+//
+CMPXAlbumArtUtil::CMPXAlbumArtUtil()
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// Constructor
+// ----------------------------------------------------------------------------
+//
+void CMPXAlbumArtUtil::ConstructL()
+    {
+     MPX_FUNC("CMPXAlbumArtUtil::ConstructL()");
+     iThumbnailManager = CThumbnailManager::NewL( *this );
+     iThumbnailManager->SetFlagsL( CThumbnailManager::EDefaultFlags );
+     iThumbnailManager->SetQualityPreferenceL( CThumbnailManager::EOptimizeForPerformance );
+	 //cenrep
+     CRepository* repository;
+     repository = CRepository::NewL( TUid::Uid(THUMBNAIL_CENREP_UID));
+
+     TInt xSize( 0 );
+     TInt ySize( 0 );
+     User::LeaveIfError( repository->Get( KSizeAudioGridWidth, xSize ));
+     User::LeaveIfError( repository->Get( KSizeAudioGridHeight, ySize ));
+     iGridViewImageSize.SetSize(xSize,ySize);
+
+     User::LeaveIfError( repository->Get( KSizeAudioFullscreenWidth, xSize ));
+     User::LeaveIfError( repository->Get( KSizeAudioFullscreenHeight, ySize ));
+     iFullScreenImageSize.SetSize(xSize,ySize);
+     delete repository;
+     repository = NULL;
+    }
+
+// ----------------------------------------------------------------------------
+// Create the playback utility object
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXAlbumArtUtil::ExtractAlbumArtL(const CMPXMedia& aMedia,
+                                            MMPXAlbumArtUtilObserver& aObs,
+                                            const TSize& aSize,
+                                            TDisplayMode aDisplayMode /*= EColor64K*/)
+    {
+    MPX_DEBUG1("CMPXAlbumArtUtil::ExtractAlbumArtL(): Entering");
+    MPX_DEBUG_THREAD("CMPXAlbumArtUtil::ExtractAlbumArtL()");
+    delete iArtUtil;
+    iArtUtil = NULL;
+    iArtUtil = CMPXImageUtil::NewL(aObs);
+    iDisplayMode = aDisplayMode;
+    iImageSize = aSize;
+    iObserver = &aObs;
+    
+    if (aMedia.IsSupported( KMPXMediaMusicAlbumArtFileName ))
+        {
+        if ( aMedia.ValueText( KMPXMediaMusicAlbumArtFileName ).Length() == 0)
+            {
+            User::Leave( KErrNotFound );
+            }
+        }
+
+    if ( aMedia.IsSupported( KMPXMediaGeneralUri ) &&
+         aMedia.IsSupported( KMPXMediaMusicAlbumArtFileName ))
+        {
+        delete iFilename;
+        iFilename = NULL;
+        iFilename = aMedia.ValueText( KMPXMediaMusicAlbumArtFileName ).AllocL();
+        if(aSize == iFullScreenImageSize)
+            {
+            iThumbnailManager->SetThumbnailSizeL(EAudioFullScreenThumbnailSize);
+            }
+        else if(aSize == iGridViewImageSize)
+            { 
+            iThumbnailManager->SetThumbnailSizeL(EAudioGridThumbnailSize);
+            } 
+        else
+            {
+            iThumbnailManager->SetThumbnailSizeL(aSize);
+            }
+        ExtractThumbnailL(&aMedia);
+        }
+    else
+        {
+        User::Leave( KErrNotFound );
+        }
+    MPX_DEBUG1("CMPXAlbumArtUtil::ExtractAlbumArtL(): Exiting");
+    }
+
+// -----------------------------------------------------------------------------
+// Cancel Asynch requests
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXAlbumArtUtil::CancelRequest()
+    {
+    MPX_DEBUG1("CMPXAlbumArtUtil::CancelRequest(): Entering");
+    if ( iArtUtil )
+        {
+        iArtUtil->CancelRequest();
+        }
+    iReqId = 0;
+    MPX_DEBUG1("CMPXAlbumArtUtil::CancelRequest(): Exiting");
+    }
+
+// ----------------------------------------------------------------------------
+// Extract binary data from file
+// ----------------------------------------------------------------------------
+//
+HBufC8* CMPXAlbumArtUtil::ExtractBinaryMetaDataLC(const TDesC& aFilename,
+                                             TMetaDataFieldId aFieldId)
+    {
+    MPX_DEBUG1("CMPXAlbumArtUtil::ExtractBinaryMetaDataLC(): Entering");
+    HBufC8* ret(NULL);
+
+    if (EUnknownMetaDataField != aFieldId)
+        {
+        CMetaDataUtility* metaDataUtil = CMetaDataUtility::NewL();
+        CleanupStack::PushL( metaDataUtil );
+
+        RArray<TMetaDataFieldId> wantedFields;
+        CleanupClosePushL(wantedFields);
+        wantedFields.AppendL(aFieldId);
+
+        metaDataUtil->OpenFileL(aFilename, wantedFields);
+        const CMetaDataFieldContainer& metaCont =
+                                        metaDataUtil->MetaDataFieldsL();
+        TPtrC data = metaCont.Field( aFieldId );
+        if(data.Length()==0)
+            {
+            iObserver->ExtractAlbumArtCompleted( NULL, KErrNotFound );            
+            }
+        ret = MPXUser::Alloc8L(data);
+
+        CleanupStack::PopAndDestroy(&wantedFields);
+        CleanupStack::PopAndDestroy(metaDataUtil);
+        CleanupStack::PushL( ret );
+        }
+    else
+        {
+        ret = HBufC8::NewLC(0);
+        }
+
+    MPX_DEBUG1("CMPXAlbumArtUtil::ExtractBinaryMetaDataLC(): Exiting");
+    return ret;
+    }
+		
+// -----------------------------------------------------------------------------
+// Preview thumbnail generation or loading is complete.
+// -----------------------------------------------------------------------------
+//
+void CMPXAlbumArtUtil::ThumbnailPreviewReady(
+    MThumbnailData& /*aThumbnail*/,
+    TThumbnailRequestId /*aId*/ )
+    {
+    MPX_FUNC( "CMPXAlbumArtUtil::ThumbnailPreviewReady" );
+    // Not used
+    }
+
+
+// -----------------------------------------------------------------------------
+// Final thumbnail bitmap generation or loading is complete. 
+// -----------------------------------------------------------------------------
+//
+void CMPXAlbumArtUtil::ThumbnailReady(
+        TInt aError, MThumbnailData& aThumbnail,
+        TThumbnailRequestId aId )
+    {
+    MPX_DEBUG2( "CMPXAlbumArtUtil::ThumbnailReady error = %d", aError);
+
+    if (aError == KErrNone)
+        { 
+        CFbsBitmap* tempBitmap;
+        tempBitmap = aThumbnail.DetachBitmap();                
+        if (tempBitmap)
+            {
+            if(iReqId == aId)
+                {
+                iObserver->ExtractAlbumArtCompleted( tempBitmap, KErrNone ); 
+                }
+            else
+                {
+                delete tempBitmap;
+                } 
+            }
+        else
+            {
+            iObserver->ExtractAlbumArtCompleted( NULL, KErrNotFound );
+            }
+        } 	
+    else
+        {
+        TRAPD( err,
+            HBufC8* art( ExtractBinaryMetaDataLC(iFilename->Des(),EMetaDataJpeg ));
+            CleanupStack::Pop(art);
+            iArtUtil->StartToDecodeL(iImageSize, art, iDisplayMode) );
+        
+        if (err != KErrNone)
+            {
+            iObserver->ExtractAlbumArtCompleted( NULL, KErrNotFound );
+            }  
+        } 
+
+    }
+
+// -----------------------------------------------------------------------------
+//     Extract Thumbnail for the current song
+// -----------------------------------------------------------------------------
+//    	
+void CMPXAlbumArtUtil::ExtractThumbnailL(
+        const CMPXMedia* aMedia)
+    {
+    MPX_FUNC("CMPXAlbumArtUtil::ExtractThumbnailL");
+    
+    TMPXItemId currentId( aMedia->ValueTObjectL<TMPXItemId>( KMPXMediaGeneralId ) );
+    if (currentId == KMPXInvalidItemId )
+        {
+        User::Leave( KErrNotFound );
+        }
+    if (aMedia->IsSupported( KMPXMediaMusicAlbumArtFileName ) )
+        {
+        const TDesC& album = aMedia->ValueText( KMPXMediaMusicAlbumArtFileName );
+#ifdef _DEBUG
+        RDebug::RawPrint(album);
+#endif
+        if (album.Compare( KNullDesC) != 0 )
+            {
+            CThumbnailObjectSource* source = CThumbnailObjectSource::NewLC( album, KMPXAlbumMimeType );
+            TInt ret = NULL;
+            TRAPD(err, iReqId = TInt (iThumbnailManager->GetThumbnailL( *source, (TAny*)ret)));
+            if( err != KErrNone)
+                {
+                User::Leave( KErrNotFound );
+                }  
+            CleanupStack::PopAndDestroy( source );
+            }
+        }
+    }
+