diff -r 2e1adbfc62af -r ee64f059b8e1 internetradio2.0/uisrc/irmediaclient.cpp --- a/internetradio2.0/uisrc/irmediaclient.cpp Mon May 03 12:25:23 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,451 +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: ?Description -* -*/ - - -#include -#include "irpubsubkeys.h" - -#include "irctrlcmdobserver.h" -#include "irdebug.h" -#include "irmediaclient.h" -#include "irmediaenginebuffer.h" -#include "irmediaengineinterface.h" -#include "ircontrolparams.h" - -const TInt KZeroVolumeLevel = 0; -const TInt KIRBitRateDivider = 8; // To convert bits to bytes. -const TInt KIRByteMultiplier = 1024; // To convert kilo bytes to bytes. -const TInt KIRValidBitRate = 0; // Starting point for valid bit rate. -const TInt KIRDefBitRate = 64; // Default bit rate for buffer size calculation. -const TInt KIRMinBitRate = 8; // Minimum bit rate for buffer size calculation. -const TInt KIRMaxBitRate = 192; // Maximum bit rate for buffer size calculation. - -// ============================ MEMBER FUNCTIONS =============================== - -// --------------------------------------------------------------------------- -// Function : NewL -// Two Phase Constructor - NewL -// --------------------------------------------------------------------------- -// -CIRMediaClient* CIRMediaClient::NewL(CIRCtrlCmdObserver* aChannel) - { - IRLOG_DEBUG( "CIRMediaClient::NewL - Entering" ); - CIRMediaClient* self = NewLC(aChannel); - CleanupStack::Pop(self); - IRLOG_DEBUG( "CIRMediaClient::NewL - Exiting." ); - return self; - } - -// --------------------------------------------------------------------------- -// Function : NewLC -// Two Phase Constructor - NewLC -// --------------------------------------------------------------------------- -// -CIRMediaClient* CIRMediaClient::NewLC(CIRCtrlCmdObserver* aChannel) - { - IRLOG_DEBUG( "CIRMediaClient::NewLC - Entering" ); - CIRMediaClient* self = new (ELeave) CIRMediaClient(); - CleanupStack::PushL(self); - self->ConstructL(aChannel); - IRLOG_DEBUG( "CIRMediaClient::NewLC - Exiting." ); - return self; - } - -// --------------------------------------------------------------------------- -// destructor function -// destructor of the player component -// --------------------------------------------------------------------------- -// -CIRMediaClient::~CIRMediaClient() - { - IRLOG_DEBUG( "CIRMediaClient::~CIRMediaClient - Entering" ); - //deletes the player - delete iPlayer; - //deletes the buffers associated with player - delete[] iTempBuffer; - delete[] iCurrentBuffer; - IRLOG_DEBUG( "CIRMediaClient::~CIRMediaClient - Exiting." ); - } - -// --------------------------------------------------------------------------- -// This is default Constructor -// for the class CIRMediaClient -// --------------------------------------------------------------------------- -// -CIRMediaClient::CIRMediaClient():iInputBuffer(NULL,0,0) - { - IRLOG_DEBUG( "CIRMediaClient::CIRMediaClient" ); - } - -// --------------------------------------------------------------------------- -// Two phase ConstructL -// network component is taken as input -// --------------------------------------------------------------------------- -// -void CIRMediaClient::ConstructL(CIRCtrlCmdObserver* aChannel) - { - IRLOG_DEBUG( "CIRMediaClient::ConstructL - Entering" ); - iChannel = aChannel; - IRLOG_DEBUG( "CIRMediaClient::ConstructL - Exiting" ); - } - - //For Play control - -// --------------------------------------------------------------------------- -// Function : PlayL -// Starts to play the stream -// --------------------------------------------------------------------------- -// -TInt CIRMediaClient::Play() - { - IRLOG_DEBUG( "CIRMediaClient::Play - Entering" ); - IRLOG_DEBUG( "CIRMediaClient::Play - Exiting" ); - //sents a play request to media engine - if( iPlayer ) - { - iPlayer->Play(); - IRLOG_DEBUG( "CIRMediaClient::Play - Exiting (1)." ); - return KErrNone; - } - else - { - IRLOG_DEBUG( "CIRMediaClient::Play - Exiting (2)." ); - return KErrNotFound; - } - } - -// --------------------------------------------------------------------------- -// Function : StopL -// Stops to play the stream -// --------------------------------------------------------------------------- -// -void CIRMediaClient::Stop() - { - IRLOG_DEBUG( "CIRMediaClient::Stop - Entering" ); - //sents a stop request to media engine - if( iPlayer ) - { - iPlayer->Stop(); - } - else - { - iCommand = EStoppedPlaying; - iChannel->SentRequest(iCommand,KErrNone); - } - IRLOG_DEBUG( "CIRMediaClient::Stop - Exiting." ); - } - - //For Volume Control -// --------------------------------------------------------------------------- -// Function : SetVolume -// function to set the volume, -// --------------------------------------------------------------------------- -// -void CIRMediaClient::SetVolume(TInt aVolume ) - { - IRLOG_DEBUG( "CIRMediaClient::SetVolume - Entering" ); - //if player is exists it will set the volume - if( iPlayer ) - { - iPlayer->SetVolume(aVolume); - } - IRLOG_DEBUG( "CIRMediaClient::SetVolume - Exiting." ); - } - -// --------------------------------------------------------------------------- -// Function : MaxVolume -// --------------------------------------------------------------------------- -// -TInt CIRMediaClient::MaxVolume() const - { - IRLOG_DEBUG( "CIRMediaClient::MaxVolume - Entering" ); - IRLOG_DEBUG( "CIRMediaClient::MaxVolume - Exiting" ); - //if player is created it will sent the max volume else return zero instead of MaxVolume - if( iPlayer ) - { - IRLOG_DEBUG( "CIRMediaClient::MaxVolume - Exiting (1)." ); - //returns maximum volume if player exists - return iPlayer->MaxVolume(); - } - else - { - //else zero is returned - IRLOG_DEBUG( "CIRMediaClient::MaxVolume - Exiting (2)." ); - return KZeroVolumeLevel; - } - } - -// --------------------------------------------------------------------------- -// Function : Volume -// function to returns the volume -// --------------------------------------------------------------------------- -// -TInt CIRMediaClient::Volume() const - { - IRLOG_DEBUG( "CIRMediaClient::Volume - Entering" ); - IRLOG_DEBUG( "CIRMediaClient::Volume - Exiting" ); - //if player is created it will sent the volume else return zero instead of Volume - if( iPlayer ) - { - //if player exist it returns the current volume - IRLOG_DEBUG( "CIRMediaClient::Volume - Exiting (1)." ); - return iPlayer->Volume(); - } - else - { - //else will return negative volume - IRLOG_DEBUG( "CIRMediaClient::Volume - Exiting (2)." ); - return KZeroVolumeLevel; - } - } - -// --------------------------------------------------------------------------- -// Function: BufferFilled -// Set the whether a Fill Buffer is currently active -// --------------------------------------------------------------------------- -// -void CIRMediaClient::BufferFilled() - { - IRLOG_DEBUG( "CIRMediaClient::BufferFilled - Entering" ); - if( iFirstTime ) - { - //First all the buffers are filled - iInputBufferPtr += iConfig.iPlayBufferSize; - if( (iInputBufferPtr + iConfig.iPlayBufferSize) <= - (iTempBuffer + iConfig.iPlayBufferCount*iConfig.iPlayBufferSize) ) - { - //buffer is not completely filled - iInputBuffer.Set(iInputBufferPtr,iConfig.iPlayBufferSize,iConfig.iPlayBufferSize); - - if( iStopBuffering ) - { - //if iStopBuffering is true we won't continue in this loop - return; - } - else // if not stop buffering is called - { - //fills the buffer and sents the buffer percentage - iChannel->FilltheBuffer(iInputBuffer); - } - } - else - { - //buffer is completely filled - iFirstTime = EFalse; - iNewPlayer = EFalse; - if( iStopBuffering ) - { - //if stop buffering is true we will not proceed further - return; - } - else - { - // Error reporting done inside CreatePlayer - if ( CreatePlayer() ) - { - // Sending this event causes NowPlayingView activation - iBufferPercentage = K100Percentage; - iChannel->SentRequest( EBufferFillStop, iBufferPercentage ); - - //player has already buffered completely for the first time - //so even if StopInitialBuffering is called media client is help less - //to handle this situation iStopBuffering is made ETrue - iStopBuffering = ETrue; - - //called for intializing a new player - InitializePlayer( iConfig,iChannel ); - - //calls play for the first time - iPlayer->Play(); - } - } - } - } - else - { - //buffer is already filled for first time - //media engine is created and playing so Buffer filled - //function of media Engine should be called - iPlayer->BufferFilled(); - } - IRLOG_DEBUG( "CIRMediaClient::BufferFilled - Exiting." ); - } - -// --------------------------------------------------------------------------- -// Function: StartNewPlayerL -// Set the whether a Fill Buffer is currently active -// --------------------------------------------------------------------------- -// -void CIRMediaClient::StartNewPlayerL(TConfig& aConfig,const TDesC8& aFormat - ) - { - IRLOG_DEBUG( "CIRMediaClient::StartNewPlayerL - Entering" ); - //format is copied - iFormat.Copy(aFormat); - - //stop of intial buffering from media client is enable - iStopBuffering = EFalse; - - iConfig = aConfig; - - TInt bitRate(0); - RProperty::Get ( KUidActiveInternetRadioApp, KIRPSBitrate, bitRate ); - // Next line will round the bitrate down to be divisible by KIRBitRateDivider. - bitRate = bitRate - (bitRate % KIRBitRateDivider); - if( bitRate <= KIRValidBitRate ) - { - // If invalid bit rate info, use default bit rate for calculating buffer sizes. - bitRate = KIRDefBitRate; - } - else if( bitRate < KIRMinBitRate ) - { - // If small bit rate info, use minimum bit rate for calculating buffer sizes. - // To make single buffer minimum size 1 kB. - bitRate = KIRMinBitRate; - } - else if( bitRate > KIRMaxBitRate ) - { - // If large bit rate info, use maximum bit rate for calculating buffer sizes. - // To make single buffer maximum size 24 kB. - bitRate = KIRMaxBitRate; - } - else - { - } - iConfig.iPlayBufferCount = KIRInputBufferCount; - iConfig.iPlayBufferSize = KIRByteMultiplier*bitRate/KIRBitRateDivider; - - //creates a new instance of media buffer for new player - iTempBuffer = new (ELeave) TUint8[iConfig.iPlayBufferCount*iConfig.iPlayBufferSize]; - iInputBufferPtr = iTempBuffer; - - //initial buffering starts - iInputBuffer.Set(iInputBufferPtr,iConfig.iPlayBufferSize,iConfig.iPlayBufferSize); - iNewPlayer = ETrue; - iFirstTime = ETrue; - - //initial buffering starts - iChannel->FilltheBuffer(iInputBuffer); - - //starts audio fade out for the previous channel - IRLOG_DEBUG( "CIRMediaClient::StartNewPlayerL - Exiting." ); - } - -// --------------------------------------------------------------------------- -// Function: StopMediaBuffering -// stops buffering of media engine, the change cannot be reverted -// --------------------------------------------------------------------------- -// -void CIRMediaClient::StopMediaBuffering() - { - IRLOG_DEBUG( "CIRMediaClient::StopMediaBuffering - Entering" ); - //calls media engine's stop buffering cancels the buffering in media engine - if( iPlayer ) - { - iPlayer->StopPlayerBuffering(); - } - IRLOG_DEBUG( "CIRMediaClient::StopMediaBuffering - Exiting." ); - } - -// --------------------------------------------------------------------------- -// Function: StopInitialBuffering -// stops buffering from media client, media engine is not stopped -// --------------------------------------------------------------------------- -// -void CIRMediaClient::StopInitialBuffering() - { - IRLOG_DEBUG( "CIRMediaClient::StopInitialBuffering - Entering" ); - //initially buffering is taken care by media client and then - //it shift the responsibility to media engine - //this is done because audio fade out has to take place when other channel buffers - //if media client is handling the buffer it should be stopped - //media client is handling the buffering - iStopBuffering = ETrue; - - delete[] iTempBuffer; - iTempBuffer = NULL; - - iCommand=EStereo; - iChannel->SentRequest(iCommand,KErrNone); - delete iPlayer; - iPlayer = NULL; - - iStopBuffering = ETrue; - //return true to indicate success of cancelling of buffer - IRLOG_DEBUG( "CIRMediaClient::StopInitialBuffering - Exiting." ); - } - -// --------------------------------------------------------------------------- -// Function: SetCodecSettings -// Creates an instance of the players and initialize it -// --------------------------------------------------------------------------- -// -TBool CIRMediaClient::CreatePlayer() - { - IRLOG_DEBUG( "CIRMediaClient::CreatePlayer" ); - TBool createResult( ETrue ); - //delete the instance of previously created player - iCommand=EStereo; - iChannel->SentRequest(iCommand,KErrNone); - if ( iPlayer ) - { - delete iPlayer; - iPlayer = NULL; - } - - //media engine's instance is created type is stored in iFormat (basically the mime type) - TRAPD(error,iPlayer = CIRMediaEngineInterface::NewL(iFormat)); - if( error ) - { - iChannel->SentRequest( EError, KIRCtrlCmdPlayerNotCreated ); - createResult = EFalse; - } - - return createResult; - } -// --------------------------------------------------------------------------- -// CIRMediaClient::InitializePlayer -// --------------------------------------------------------------------------- -// -void CIRMediaClient::InitializePlayer( TConfig& aConfig, - CIRCtrlCmdObserver* aChannel) - { - IRLOG_DEBUG( "CIRMediaClient::SetCodecSettings" ); - - //delete the instance of buffer associated with previously playing player - delete[] iCurrentBuffer; - iCurrentBuffer = NULL; - - //current buffer is made same as previous buffer - iCurrentBuffer = iTempBuffer; - iTempBuffer = NULL; - - //intialize the media engine - iPlayer->Intialize(aConfig,iCurrentBuffer,aChannel); - IRLOG_DEBUG( "CIRMediaClient::SetCodecSettings - Exiting." ); - } - -// --------------------------------------------------------------------------- -// CIRNowPlayingWrapper::GetMediaClientInstance() -// Returns the Audio Player Instance -// --------------------------------------------------------------------------- -// -CMdaAudioOutputStream* CIRMediaClient::GetPlayerInstance() - { - IRLOG_DEBUG( "CIRMediaClient::GetMediaClientInstance " ); - return (iPlayer->GetAudioPlayer()); - }