internetradio2.0/settingssrc/ircodecmanager.cpp
changeset 0 09774dfdd46b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/internetradio2.0/settingssrc/ircodecmanager.cpp	Mon Apr 19 14:01:53 2010 +0300
@@ -0,0 +1,246 @@
+/*
+* Copyright (c) 2008 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:  Maintains the set of supported codecs
+*
+*/
+
+#include <e32base.h>
+
+#include <eikenv.h>
+#include <f32file.h>
+
+
+#include "ircodecmanager.h"
+#include "irdebug.h"
+
+// ---------------------------------------------------------------------------
+// CIRCodecManager::NewL
+// ---------------------------------------------------------------------------
+//
+CIRCodecManager* CIRCodecManager::NewL()
+    {
+    CIRCodecManager* self = CIRCodecManager::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CIRCodecManager::NewLC
+// ---------------------------------------------------------------------------
+//
+CIRCodecManager* CIRCodecManager::NewLC()
+    {
+    CIRCodecManager* self = new (ELeave) CIRCodecManager();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CIRCodecManager::CIRCodecManager
+// ---------------------------------------------------------------------------
+//
+CIRCodecManager::CIRCodecManager()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CIRCodecManager::~CIRCodecManager
+// ---------------------------------------------------------------------------
+//
+CIRCodecManager::~CIRCodecManager()
+    {
+    iSupportedDataTypes.Reset();
+    }
+
+// ---------------------------------------------------------------------------
+// CIRCodecManager::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CIRCodecManager::ConstructL()
+    {
+    IRLOG_DEBUG( "CIRCodecManager::ConstructL" );
+    LoadSupportedCodecsL();
+    IRLOG_DEBUG( "CIRCodecManager::ConstructL - Exiting." );
+    }
+
+// ---------------------------------------------------------------------------
+// CIRCodecManager::IsSupportedCodec
+// ---------------------------------------------------------------------------
+//
+TBool CIRCodecManager::IsSupportedCodec( TFourCC aCodec ) const
+    {
+    IRLOG_DEBUG( "CIRCodecManager::::IsSupportedCodec" );
+    TBool supported( EFalse );
+    if ( iSupportedDataTypes.Find( aCodec ) != KErrNotFound )
+        {
+        supported = ETrue;
+        }
+    IRLOG_INFO3( "CIRCodecManager::IsSupportedCodec - Returning %d for codec %d",
+                  supported, aCodec.FourCC() );
+    return supported;
+    }
+
+// ---------------------------------------------------------------------------
+// CIRCodecManager::InitializeComplete
+// ---------------------------------------------------------------------------
+//
+void CIRCodecManager::InitializeComplete(TInt /* aError */)
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CIRCodecManager::ToneFinished
+// ---------------------------------------------------------------------------
+//
+void CIRCodecManager::ToneFinished(TInt /* aError */)
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CIRCodecManager::BufferToBeFilled
+// ---------------------------------------------------------------------------
+//
+void CIRCodecManager::BufferToBeFilled(CMMFBuffer* /* aBuffer */ )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CIRCodecManager::PlayError
+// ---------------------------------------------------------------------------
+//
+void CIRCodecManager::PlayError(TInt /* aError */ )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CIRCodecManager::BufferToBeEmptied
+// ---------------------------------------------------------------------------
+//
+void CIRCodecManager::BufferToBeEmptied(CMMFBuffer* /* aBuffer */ )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CIRCodecManager::RecordError
+// ---------------------------------------------------------------------------
+//
+void CIRCodecManager::RecordError(TInt /* aError */ )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CIRCodecManager::ConvertError
+// ---------------------------------------------------------------------------
+//
+void CIRCodecManager::ConvertError(TInt /* aError */ )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CIRCodecManager::DeviceMessage
+// ---------------------------------------------------------------------------
+//
+void CIRCodecManager::DeviceMessage(TUid /* aMessageType */, const TDesC8& /* aMsg */ )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CIRCodecManager::LoadSupportedCodecsL
+// ---------------------------------------------------------------------------
+//
+void CIRCodecManager::LoadSupportedCodecsL()
+    {
+    IRLOG_DEBUG( "CIRCodecManager::LoadSupportedCodecsL" );
+    CMMFDevSound* devSound = CMMFDevSound::NewL();
+    CleanupStack::PushL( devSound );
+    TMMFPrioritySettings prioritySettings;
+
+    prioritySettings.iPriority = 0;
+    prioritySettings.iPref = EMdaPriorityPreferenceNone;
+    prioritySettings.iState = EMMFStatePlaying;
+
+    devSound->GetSupportedInputDataTypesL( iSupportedDataTypes, prioritySettings );
+    CleanupStack::PopAndDestroy( devSound );
+
+    // CMMFDevSound returns also other codecs than those supported by IR.
+    TInt tempCount = iSupportedDataTypes.Count();
+    IRRDEBUG2("CIRCodecManager::LoadSupportedCodecsL() - codecs count = %d",tempCount);
+    for ( TInt i = iSupportedDataTypes.Count() - 1; i >= 0; i-- )
+        {
+        if ( !VerifySupportL( iSupportedDataTypes[i] ) )
+            {
+            IRLOG_DEBUG2( "CIRCodecManager::LoadSupportedCodecsL - %x not supported.",
+                        iSupportedDataTypes[i].FourCC() );
+            iSupportedDataTypes.Remove( i );
+            }
+        else
+            {
+            IRLOG_INFO2( "CIRCodecManager::LoadSupportedCodecsL - %x supported.",
+                        iSupportedDataTypes[i].FourCC() );
+            }
+        }
+
+#ifdef __WINS__
+    // In emulator there is typically only 16 bit PCM supported.
+    if ( iSupportedDataTypes.Count() == 0 )
+        {
+        TFourCC codec( KMMFFourCCCodeMP3 );
+        iSupportedDataTypes.Append( codec );
+        }
+#endif
+
+
+    IRLOG_DEBUG( "CIRCodecManager::LoadSupportedCodecsL - Exiting." );
+    }
+
+// ---------------------------------------------------------------------------
+// CIRCodecManager::VerifySupportL
+// ---------------------------------------------------------------------------
+//
+TBool CIRCodecManager::VerifySupportL( TFourCC aCodec )
+    {
+    IRLOG_DEBUG2( "CIRCodecManager::VefifySupportL - aCodec=%x", aCodec.FourCC() );
+    TInt supported( EFalse );
+    switch( aCodec.FourCC() )
+        {
+#ifndef __SERIES60_30__
+        case KMMFFourCCCodeWMA: // fall through
+#endif
+        case KMMFFourCCCodeAAC: // fall through
+        case KMMFFourCCCodeMP3:
+            supported = ETrue;
+            break;
+        default:
+            break;
+        }
+    if ( supported )
+        {
+        // Test initialisation to see that the codec really is supported.
+        CMMFDevSound* devSound = CMMFDevSound::NewL();
+        CleanupStack::PushL( devSound );
+
+        TMMFState mmfState( EMMFStatePlaying );
+        TRAPD( err, devSound->InitializeL( *this, aCodec, mmfState ) );
+        if ( err != KErrNone )
+            {
+            supported = EFalse;
+            }
+        CleanupStack::PopAndDestroy( devSound );
+        }
+    IRLOG_DEBUG( "CIRCodecManager::VefifySupportL" );
+    return supported;
+    }
+
+