diff -r 608f67c22514 -r 896e9dbc5f19 internetradio2.0/streamsourcesrc/irasfplayer.cpp --- a/internetradio2.0/streamsourcesrc/irasfplayer.cpp Tue Jul 06 14:07:20 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,431 +0,0 @@ -/* -* Copyright (c) 2006-2007 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: Implementation of streaming and playback on ASF channel url -* -*/ - - -/* --------------------------------------------------------------------------- -* Version history: -* Template version: -* -* -* Version: 1, Fri Sep 19 13:00:00 2008 by e0328782 Rohit -* Ref: -* Created -* -* -* ============================================================================ -*/ - -#include -#include "irpubsubkeys.h" - -#include "irasfplayer.h" // this class -#include "irctrlcommand.h" // MIRCtrlCmdObserver -#include "irstreamsourceobserver.h" // MIRStreamSourceObserver -#include "irdebug.h" -#include "irmetadata.h" - -//Constants -_LIT8( KMimeTypeASF, "audio/x-ms-wma" ); -const TInt KFour = 4; -_LIT( KIRSongTitle, "title" ); -_LIT( KIRSongArtist, "artist" ); -_LIT( KTrailingAsf, ".asf" ); -_LIT( KTrailingWma, ".wma" ); -_LIT( KTrailingWmv, ".wmv" ); - - -// ============================ MEMBER FUNCTIONS =============================== - -// --------------------------------------------------------------------------- -// CIRAsfPlayer::NewL -// function returns an instance of CIRAsfPlayer -// Two phase constructor -// --------------------------------------------------------------------------- -// -EXPORT_C CIRAsfPlayer* CIRAsfPlayer::NewL(MIRStreamSourceObserver& aStreamObserver, - MIRCtrlCmdObserver& aCtrlCmdObserver) - { - IRLOG_DEBUG( "CIRAsfPlayer::NewL" ); - CIRAsfPlayer* self = CIRAsfPlayer::NewLC(aStreamObserver, aCtrlCmdObserver ); - CleanupStack::Pop(self); - IRLOG_DEBUG( "CIRAsfPlayer::NewL - Exiting." ); - return self; - } - -// --------------------------------------------------------------------------- -// CIRAsfPlayer::NewLC -// function creates an instance of CIRAsfPlayer -// Two phase constructor -// --------------------------------------------------------------------------- -// -CIRAsfPlayer* CIRAsfPlayer::NewLC(MIRStreamSourceObserver& aStreamObserver, - MIRCtrlCmdObserver& aCtrlCmdObserver) - { - IRLOG_DEBUG( "CIRAsfPlayer::NewLC" ); - CIRAsfPlayer* self = new (ELeave) CIRAsfPlayer(aStreamObserver, aCtrlCmdObserver); - CleanupStack::PushL(self); - self->ConstructL(); - IRLOG_DEBUG( "CIRAsfPlayer::NewLC - Exiting." ); - return self; - } - -// --------------------------------------------------------------------------- -// CIRAsfPlayer::~CIRAsfPlayer -// Default Destructor -// --------------------------------------------------------------------------- -// -CIRAsfPlayer::~CIRAsfPlayer() - { - IRLOG_DEBUG( "CIRAsfPlayer::~CIRAsfPlayer" ); - if( iMdaAudioPlayer ) - { - delete iMdaAudioPlayer; - iMdaAudioPlayer = NULL; - } - - if( iMetaData ) - { - delete iMetaData; - iMetaData = NULL; - } - iStationUri.Close(); - - IRLOG_DEBUG( "CIRAsfPlayer::~CIRAsfPlayer - Exiting." ); - } - -//Function for Play control - -// --------------------------------------------------------------------------- -// CIRAsfPlayer::PlayL -// function to intiate the player and play the stream -// --------------------------------------------------------------------------- -// -EXPORT_C void CIRAsfPlayer::PlayL(const TDesC& aUri) - { - IRRDEBUG2( "CIRAsfPlayer::PlayL - Entering aUri=%S", &aUri ); - - iStationUri.Close(); - iStationUri.CreateL( aUri ); - - User::LeaveIfNull( iMdaAudioPlayer ); - if( iMdaAudioPlayer ) - { - iMdaAudioPlayer->Close(); - iMdaAudioPlayer->OpenUrlL( iStationUri, KUseDefaultIap, KMimeTypeASF ); - } - - IRLOG_DEBUG( "CIRAsfPlayer::PlayL - Exiting." ); - } - -// --------------------------------------------------------------------------- -// CIRAsfPlayer::Play -// function to resume playing (AsfPlayer should already initiated using Play(url)) -// --------------------------------------------------------------------------- -// -EXPORT_C void CIRAsfPlayer::Play() - { - IRLOG_DEBUG( "CIRAsfPlayer::Play" ); - - SetVolume( iCtrlCmdObserver.FetchVolume() ); - if( iMdaAudioPlayer ) - { - iMdaAudioPlayer->Play(); - } - - IRLOG_DEBUG( "CIRAsfPlayer::Play - Exiting." ); - } - -// --------------------------------------------------------------------------- -// CIRAsfPlayer::Stop -// function to which stop the player -// --------------------------------------------------------------------------- -// -EXPORT_C void CIRAsfPlayer::Stop() - { - IRLOG_DEBUG( "CIRAsfPlayer::Stop" ); - - if( iMdaAudioPlayer ) - { - iMdaAudioPlayer->Stop(); - } - - IRLOG_DEBUG( "CIRAsfPlayer::Stop - Exiting." ); - } - - //Functions for Volume Control - -// --------------------------------------------------------------------------- -// CIRAsfPlayer::SetVolume -// function to set the volume -// --------------------------------------------------------------------------- -// -EXPORT_C void CIRAsfPlayer::SetVolume(TInt aVolume ) - { - IRLOG_DEBUG( "CIRAsfPlayer::SetVolume" ); - - if( iMdaAudioPlayer ) - { - iMdaAudioPlayer->SetVolume( aVolume ); - } - - IRLOG_DEBUG( "CIRAsfPlayer::SetVolume - Exiting." ); - } - -// --------------------------------------------------------------------------- -// CIRAsfPlayer::Volume -// function to returns the volume, integer level of volume is the Output -// --------------------------------------------------------------------------- -// -EXPORT_C TInt CIRAsfPlayer::Volume() const - { - IRLOG_DEBUG( "CIRAsfPlayer::Volume" ); - - TInt volume = 0; - if( iMdaAudioPlayer ) - { - iMdaAudioPlayer->GetVolume( volume ); - } - - return volume; - } - -// --------------------------------------------------------------------------- -// CIRAsfPlayer::MaxVolume -// function to returns the maximum volume -// --------------------------------------------------------------------------- -// -EXPORT_C TInt CIRAsfPlayer::MaxVolume() const - { - IRLOG_DEBUG( "CIRAsfPlayer::MaxVolume" ); - - TInt volume = 0; - if( iMdaAudioPlayer ) - { - volume = iMdaAudioPlayer->MaxVolume(); - } - - return volume; - } - -// Helper functions - -// --------------------------------------------------------------------------- -// CIRAsfPlayer::DetectAsfChannel -// Function is used to detect ASF channel by its url ending in .asf/.wma/.wmv -// --------------------------------------------------------------------------- -// -EXPORT_C TBool CIRAsfPlayer::DetectAsfChannel(const TDesC& aUri) - { - IRLOG_DEBUG("CIRAsfPlayer::DetectAsfChannel - Entering"); - TPtrC ptr( aUri ); - TPtrC UriTypePtr( ptr.Right(KFour) ); - - TBool bAsf = UriTypePtr == KTrailingAsf || UriTypePtr == KTrailingWma - || UriTypePtr == KTrailingWmv; - - IRRDEBUG2("CIRAsfPlayer::DetectAsfChannel - ASF Channel detected = %d", (TInt)bAsf); - IRLOG_DEBUG("CIRAsfPlayer::DetectAsfChannel - Exiting"); - return bAsf; - } - -// Two-phase construction - -// --------------------------------------------------------------------------- -// CIRAsfPlayer::CIRAsfPlayer -// Default constructor -// --------------------------------------------------------------------------- -// -CIRAsfPlayer::CIRAsfPlayer(MIRStreamSourceObserver& aStreamObserver, - MIRCtrlCmdObserver& aCtrlCmdObserver): - iMdaAudioPlayer(NULL), iMetaData(NULL), - iCtrlCmdObserver( aCtrlCmdObserver ), iStreamObserver(aStreamObserver), - iState( ENotReady ) - { - IRLOG_DEBUG( "CIRAsfPlayer::CIRAsfPlayer" ); - } - -// --------------------------------------------------------------------------- -// CIRAsfPlayer::ConstructL -// Two phase constructor is used to intialize data members -// Function can leave if CMdaAudioOutputStream::NewL leaves -// --------------------------------------------------------------------------- -// -void CIRAsfPlayer::ConstructL() - { - IRLOG_DEBUG( "CIRAsfPlayer::ConstructL" ); - - iMdaAudioPlayer = CMdaAudioPlayerUtility::NewL( *this ); - User::LeaveIfNull( iMdaAudioPlayer ); - - iMdaAudioPlayer->RegisterForAudioLoadingNotification( *this ); - - iMetaData = CIRMetaData::NewL(); - User::LeaveIfNull( iMdaAudioPlayer ); - - IRLOG_DEBUG( "CIRAsfPlayer::ConstructL - Exiting." ); - } - -//Call back functions - -// --------------------------------------------------------------------------- -// MMdaAudioPlayerCallback::MapcInitComplete -// Invoked with OpenUrl() success/fail result -// --------------------------------------------------------------------------- -// -void CIRAsfPlayer::MapcInitComplete(TInt aError, const TTimeIntervalMicroSeconds& /*aDuration*/) - { - IRRDEBUG2( "CIRAsfPlayer::MapcInitComplete - Entering. aError = %d", aError ); - if( KErrNone == aError ) - { - iState = EReadyToPlay; - Play(); - iStreamObserver.Asf_ConnectionEstablished(); - } - else - { - iState = ENotReady; - iStreamObserver.Asf_ErrorConnecting(aError); - } - IRLOG_DEBUG( "CIRAsfPlayer::MapcInitComplete - Exiting" ); - } - -// --------------------------------------------------------------------------- -// MMdaAudioPlayerCallback::MapcPlayComplete -// Invoked after playback of an audio sample completes success/fail -// --------------------------------------------------------------------------- -// -void CIRAsfPlayer::MapcPlayComplete(TInt aError) - { - IRRDEBUG2( "CIRAsfPlayer::MapcPlayComplete - Entering. aError = %d", aError ); - if( KErrNone != aError ) - { - iState = ENotReady; - iStreamObserver.Asf_ErrorConnecting(aError); - } - else - { - // won't hit this as playing from stream - } - IRLOG_DEBUG( "CIRAsfPlayer::MapcPlayComplete - Exiting" ); - } - -// --------------------------------------------------------------------------- -// MAudioLoadingObserver::MaloLoadingStarted -// -// --------------------------------------------------------------------------- -// -void CIRAsfPlayer::MaloLoadingStarted() - { - IRLOG_DEBUG( "CIRAsfPlayer::MaloLoadingStarted - Entering" ); - TInt percentComplete = 0; - - if( iMdaAudioPlayer ) - { - iState = EReadyToPlay; - - TRAPD( err, iMdaAudioPlayer->GetAudioLoadingProgressL( percentComplete )); - if(err == KErrNone) - iStreamObserver.Asf_UpdateProgress( percentComplete ); - } - IRLOG_DEBUG( "CIRAsfPlayer::MaloLoadingStarted - Exiting" ); - } - -// --------------------------------------------------------------------------- -// MAudioLoadingObserver::MaloLoadingComplete -// -// --------------------------------------------------------------------------- -// -void CIRAsfPlayer::MaloLoadingComplete() - { - IRLOG_DEBUG( "CIRAsfPlayer::MaloLoadingComplete - Entering" ); - TInt percentComplete = 0; - - if( iMdaAudioPlayer ) - { - iState = EPlaying; - - TRAPD( err, iMdaAudioPlayer->GetAudioLoadingProgressL( percentComplete )); - if(err == KErrNone) - iStreamObserver.Asf_UpdateProgress( percentComplete ); - - TRAP( err, ReadMetadataL()); - if(err != KErrNone) - { - IRLOG_WARNING( "CIRAsfPlayer::MaloLoadingComplete - Failed to read/publish metadata" ); - } - - // publish birtate - TUint bitrate = 0; - err = iMdaAudioPlayer->GetBitRate( bitrate ); - RProperty::Set( KUidActiveInternetRadioApp, KIRPSBitrate, bitrate ); - } - IRLOG_DEBUG( "CIRAsfPlayer::MaloLoadingComplete - Exiting" ); - } - -// --------------------------------------------------------------------------- -// CIRAsfPlayer::ReadMetadataL -// Reads the meta data from the CMdaAudioPlayerUtility -// --------------------------------------------------------------------------- -// -void CIRAsfPlayer::ReadMetadataL() - { - IRLOG_DEBUG( "CIRAsfPlayer::ReadMetadataL - Entering" ); - - if(iMetaData) - { - // Erases old meta data information. - iMetaData->SetArtistL( KNullDesC ); - iMetaData->SetSongL( KNullDesC ); - iMetaData->SetStreamUrlL( KNullDesC ); - - // Stream Url - iMetaData->SetStreamUrlL( iStationUri ); - - TInt nMetadata = 0; - TInt err = iMdaAudioPlayer->GetNumberOfMetaDataEntries( nMetadata ); - for( TInt ctr=0; ctr < nMetadata; ++ctr ) - { - CMMFMetaDataEntry* pMetadataEntry = iMdaAudioPlayer->GetMetaDataEntryL( ctr ); - - // Song Title - if( pMetadataEntry->Name() == KIRSongTitle ) - { - iMetaData->SetSongL( pMetadataEntry->Value() ); - } - // Song Artist - else if( pMetadataEntry->Name() == KIRSongArtist ) - { - iMetaData->SetArtistL( pMetadataEntry->Value() ); - } - } - - if( iMetaData->Song().Length() == 0 ) - { - IRLOG_WARNING( "CIRAsfPlayer::ExtractMetaDataL - song \"title\" not found in metadata" ); - } - if( iMetaData->Artist().Length() == 0 ) - { - IRLOG_WARNING( "CIRAsfPlayer::ExtractMetaDataL - song \"artist\" not found in metadata" ); - } - - // Notify observer - iStreamObserver.Asf_HandleMetaDataReceivedL( *iMetaData ); - - IRLOG_DEBUG4( "CIRAsfPlayer::ReadMetadataL - Exiting (artist=%S, song=%S, streamUrl=%S)", - &iMetaData->Artist(), &iMetaData->Song(), &iMetaData->StreamUrl() ); - } - }