multimediacommscontroller/mmccvideosourcesink/src/mccvideosink.cpp
changeset 0 1bce908db942
equal deleted inserted replaced
-1:000000000000 0:1bce908db942
       
     1 /*
       
     2 * Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:    
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 
       
    21 // INCLUDE FILES
       
    22 #include "mccvideosink.h"
       
    23 #include "mccvideosinkimpl.h"
       
    24 #include "mmcccodecinformation.h"
       
    25 #include "mccinternalcodecs.h"
       
    26 #include "mccvideosourcesinklogs.h"
       
    27 #include "mmccinterfacedef.h"
       
    28 #include "mccinternaldef.h"
       
    29 #include "rtpheader.h"
       
    30 
       
    31 // MACROS
       
    32 
       
    33 // EXTERNAL DATA STRUCTURES
       
    34 
       
    35 // EXTERNAL FUNCTION PROTOTYPES  
       
    36 
       
    37 // CONSTANTS
       
    38 
       
    39 // MACROS
       
    40 
       
    41 // LOCAL CONSTANTS AND MACROS
       
    42 
       
    43 // MODULE DATA STRUCTURES
       
    44 
       
    45 // LOCAL FUNCTION PROTOTYPES
       
    46 
       
    47 // FORWARD DECLARATIONS
       
    48 
       
    49 // ============================= LOCAL FUNCTIONS ===============================
       
    50 
       
    51 // ============================ MEMBER FUNCTIONS ===============================
       
    52 
       
    53 // -----------------------------------------------------------------------------
       
    54 // CMccVideoSink::CMccVideoSink
       
    55 // C++ default constructor can NOT contain any code, that
       
    56 // might leave.
       
    57 // -----------------------------------------------------------------------------
       
    58 //
       
    59 CMccVideoSink::CMccVideoSink() :
       
    60     CMccDataSink( KMccVideoSinkUid )
       
    61     {
       
    62     iAudioFourCC = TFourCC( KMccFourCCIdAMRNB );
       
    63     iVideoFourCC = TFourCC( KMccFourCCIdH263 );
       
    64     }
       
    65 
       
    66 // -----------------------------------------------------------------------------
       
    67 // CMccVideoSink::NewSinkL
       
    68 // Static constructor.
       
    69 // -----------------------------------------------------------------------------
       
    70 //
       
    71 MDataSink* CMccVideoSink::NewSinkL( TUid /*aImplementationUid*/, 
       
    72                                       const TDesC8& /*aInitData*/ )
       
    73     {       
       
    74     __V_SOURCESINK_CONTROLL("CMccVideoSink::NewSinkL" )
       
    75     CMccVideoSink* self = new ( ELeave ) CMccVideoSink();
       
    76     return static_cast<MDataSink*>( self ); 
       
    77     }
       
    78 
       
    79 // -----------------------------------------------------------------------------
       
    80 // CMccVideoSink::ConstructSinkL
       
    81 // class MDataSink inherited 2nd phase construction
       
    82 // -----------------------------------------------------------------------------
       
    83 //
       
    84 void CMccVideoSink::ConstructSinkL( const TDesC8& aInitData )
       
    85     {
       
    86     __V_SOURCESINK_CONTROLL( "CMccVideoSink::ConstructSinkL (initdata)" )
       
    87 
       
    88     __ASSERT_ALWAYS( aInitData.Length(), User::Leave( KErrArgument ) );
       
    89     
       
    90     TMccVideoSinkSettingBuf settingsBuf;
       
    91         settingsBuf.Copy( aInitData );
       
    92         TMccVideoSinkSetting& settings = settingsBuf();
       
    93                                
       
    94     iAudioReady = ETrue;
       
    95     iVideoReady = ETrue;
       
    96 	
       
    97 	delete iMediaInterface;
       
    98 	iMediaInterface = NULL;    
       
    99     iMediaInterface = CMccVideoSinkImpl::NewL( 
       
   100             settings, 
       
   101             MCC_ENDPOINT_ID( static_cast<MDataSink*>( this ) ) );
       
   102                                  
       
   103     __V_SOURCESINK_CONTROLL( "CMccVideoSink::ConstructSinkL complete")
       
   104     
       
   105 
       
   106     }
       
   107 
       
   108 // -----------------------------------------------------------------------------
       
   109 // CMccVideoSink::~CMccVideoSink
       
   110 // Destructor
       
   111 // -----------------------------------------------------------------------------
       
   112 //
       
   113 CMccVideoSink::~CMccVideoSink()
       
   114 	{
       
   115 	__V_SOURCESINK_CONTROLL( "CMccVideoSink::~CMccVideoSink" )
       
   116     delete iMediaInterface;
       
   117     }
       
   118     
       
   119 // -----------------------------------------------------------------------------
       
   120 // CMccVideoSink::SinkThreadLogon
       
   121 //
       
   122 // Method to 'logon' the data sink to the same thread that sink will be consuming
       
   123 // data in. Thread specific initialisation is done here.
       
   124 // -----------------------------------------------------------------------------
       
   125 //
       
   126 TInt CMccVideoSink::SinkThreadLogon( MAsyncEventHandler& aEventHandler ) 
       
   127     {
       
   128     __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkThreadLogon" )
       
   129 
       
   130 	if ( iMediaInterface )
       
   131 		{
       
   132 		return iMediaInterface->SinkThreadLogon( aEventHandler );
       
   133 		}
       
   134 	else
       
   135 		{
       
   136 		return KErrNotFound;	
       
   137 		}
       
   138     }
       
   139 
       
   140 // -----------------------------------------------------------------------------
       
   141 // CMccVideoSink::SinkThreadLogoff
       
   142 //
       
   143 // Method to 'logoff' the data sink from the same thread that sink consumes 
       
   144 // data in. Thread specific releasing of resources is done here.
       
   145 // -----------------------------------------------------------------------------
       
   146 //
       
   147 void CMccVideoSink::SinkThreadLogoff() 
       
   148     {
       
   149     __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkThreadLogoff" )
       
   150     if ( iMediaInterface )
       
   151         {        
       
   152         __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkThreadLogoff, stopping player" )
       
   153         if ( iMediaInterface->SinkThreadLogoff() )
       
   154             {
       
   155             iMediaInterface->Stop();
       
   156             }
       
   157         }
       
   158     
       
   159     __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkThreadLogoff, exit" )
       
   160     }
       
   161 
       
   162 // -----------------------------------------------------------------------------
       
   163 // CMccVideoSink::SetSinkDataTypeCode
       
   164 // Sets the datatype code ( codec )
       
   165 // ----------------------------------------------------------------------------- 
       
   166 //
       
   167 TInt CMccVideoSink::SetSinkDataTypeCode( TFourCC aCodec, TMediaId aMediaId )
       
   168     {
       
   169     __V_SOURCESINK_CONTROLL_INT2( "CMccVideoSink::SetSinkDataTypeCode, fourcc:",
       
   170     aCodec.FourCC(), "media type:", aMediaId.iMediaType.iUid )	
       
   171 
       
   172     if ( KUidMediaTypeVideo == aMediaId.iMediaType &&
       
   173     	aCodec == iVideoFourCC )
       
   174         {
       
   175         iVideoReady = EFalse;
       
   176         return KErrNone;
       
   177         }
       
   178     else if ( KUidMediaTypeAudio == aMediaId.iMediaType &&
       
   179     	aCodec == iAudioFourCC )
       
   180         {
       
   181         iAudioReady = EFalse;
       
   182         return KErrNone;
       
   183         }
       
   184     else
       
   185         {
       
   186         return KErrNotSupported;
       
   187         }
       
   188 	
       
   189 	}
       
   190 
       
   191 // -----------------------------------------------------------------------------
       
   192 // CMccVideoSink::SinkDataTypeCode
       
   193 // Returns the datatype code ( codec )
       
   194 // -----------------------------------------------------------------------------
       
   195 //
       
   196 TFourCC CMccVideoSink::SinkDataTypeCode( TMediaId aMediaId )
       
   197     {
       
   198     __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkDataTypeCode" ) 
       
   199 
       
   200     if ( KUidMediaTypeVideo == aMediaId.iMediaType )
       
   201         {
       
   202         iVideoReady = EFalse;
       
   203         return iVideoFourCC;
       
   204         }
       
   205     else if ( KUidMediaTypeAudio == aMediaId.iMediaType  )
       
   206         {
       
   207         iAudioReady = EFalse;
       
   208         return iAudioFourCC;
       
   209         }
       
   210     else
       
   211         {
       
   212         return TFourCC( KMMFFourCCCodeNULL );
       
   213         }
       
   214     }
       
   215 
       
   216 // -----------------------------------------------------------------------------
       
   217 // CMccVideoSink::EmptyVideoSinkBufferL
       
   218 // NOT SUPPORTED. MDataSink pure virtual function must be implemented.
       
   219 // -----------------------------------------------------------------------------
       
   220 //
       
   221 void CMccVideoSink::EmptyBufferL( CMMFBuffer* aBuffer, 
       
   222                                   MDataSource* aSupplier, 
       
   223                                   TMediaId aMediaId )
       
   224     {
       
   225     __V_SOURCESINK_MEDIA( "CMccVideoSink::EmptyBufferL" ) 
       
   226     __ASSERT_ALWAYS( aBuffer, User::Leave( KErrArgument ) );
       
   227     __ASSERT_ALWAYS( aSupplier, User::Leave( KErrArgument ) );
       
   228                          
       
   229     TRtpRecvHeader header;
       
   230     header.iTimestamp = aBuffer->TimeToPlay().Int64();
       
   231 	header.iMarker = aBuffer->LastBuffer();
       
   232 	header.iSeqNum = aBuffer->FrameNumber();
       
   233 	
       
   234 	if ( aMediaId.iMediaType == KUidMediaTypeAudio )
       
   235 	    {
       
   236 	    header.iPayloadType = iAudioPayloadType;
       
   237 	    }
       
   238 	else
       
   239 	    {
       
   240 	    header.iPayloadType = iVideoPayloadType;
       
   241 	    }
       
   242 	
       
   243     EmptyVideoSinkBufferL(aBuffer, aSupplier, aMediaId, header);
       
   244     aSupplier->BufferEmptiedL( aBuffer );
       
   245     }
       
   246  
       
   247 // -----------------------------------------------------------------------------
       
   248 // CMccVideoSink::SetVideoCodecL
       
   249 // -----------------------------------------------------------------------------
       
   250 //
       
   251 void CMccVideoSink::SetVideoCodecL( const TMccCodecInfo& aVideoCodec )
       
   252 	{
       
   253 	__V_SOURCESINK_CONTROLL( "CMccVideoSink::SetVideoCodecL" ) 
       
   254     __ASSERT_ALWAYS( iMediaInterface, User::Leave( KErrArgument ) );
       
   255 
       
   256 	iVideoFourCC = aVideoCodec.iFourCC;
       
   257     iMaxVideoBitRate = aVideoCodec.iMaxBitrate;	
       
   258 	iVideoCodecMode = aVideoCodec.iCodecMode;
       
   259 	iVideoPayloadType = aVideoCodec.iPayloadType;
       
   260 	iMediaInterface->FormatVideoSDPInfoL( aVideoCodec );	
       
   261     iVideoReady = ETrue;		
       
   262 	}
       
   263 
       
   264 // -----------------------------------------------------------------------------
       
   265 // CMccVideoSink::SetAudioCodecL
       
   266 // -----------------------------------------------------------------------------
       
   267 //	
       
   268 void CMccVideoSink::SetAudioCodecL( const TMccCodecInfo& aAudioCodec )
       
   269     {
       
   270     __V_SOURCESINK_CONTROLL( "CMccVideoSink::SetAudioCodecL" ) 
       
   271     __ASSERT_ALWAYS( iMediaInterface, User::Leave( KErrArgument ) );
       
   272     
       
   273     iAudioFourCC = aAudioCodec.iFourCC;
       
   274 	iAudioCodecMode = aAudioCodec.iCodecMode;
       
   275 	iAudioPayloadType = aAudioCodec.iPayloadType;
       
   276 	iMediaInterface->FormatAudioSDPInfoL( aAudioCodec );	
       
   277     iAudioReady = ETrue;
       
   278     }
       
   279 
       
   280 // -----------------------------------------------------------------------------
       
   281 // CMccVideoSink::SetCurrentUser
       
   282 // -----------------------------------------------------------------------------
       
   283 //    
       
   284 void CMccVideoSink::SetCurrentUser( MAsyncEventHandler* aEventHandler )
       
   285     {
       
   286    	__V_SOURCESINK_CONTROLL( "CMccVideoSink::SetCurrentUser" ) 
       
   287     if ( iMediaInterface )
       
   288         {
       
   289         iMediaInterface->SetCurrentUser( aEventHandler );
       
   290         }
       
   291     }
       
   292     
       
   293 // -----------------------------------------------------------------------------
       
   294 // CMccVideoSink::EmptyBufferL
       
   295 // -----------------------------------------------------------------------------
       
   296 //
       
   297 void CMccVideoSink::EmptyVideoSinkBufferL( CMMFBuffer* aBuffer, 
       
   298 		                          MDataSource* aSupplier,
       
   299 		                          TMediaId aMediaId,
       
   300 		                          TRtpRecvHeader& aHeaderInfo )
       
   301 	{
       
   302     __V_SOURCESINK_MEDIA( "CMccVideoSink::EmptyVideoSinkBufferL with \
       
   303 RTP header param:" )   
       
   304     __V_SOURCESINK_MEDIA_INT1( "CMccVideoSink::EmptyVideoSinkBufferL iPadding=" , 
       
   305                              aHeaderInfo.iPadding )
       
   306     __V_SOURCESINK_MEDIA_INT1( "CMccVideoSink::EmptyVideoSinkBufferL iExtension=", 
       
   307                              aHeaderInfo.iExtension )
       
   308     __V_SOURCESINK_MEDIA_INT1( "CMccVideoSink::EmptyVideoSinkBufferL iCsrcCount=", 
       
   309                              aHeaderInfo.iCsrcCount )
       
   310     __V_SOURCESINK_MEDIA_INT1( "CMccVideoSink::EmptyVideoSinkBufferL iMarker=", 
       
   311                              aHeaderInfo.iMarker )
       
   312     __V_SOURCESINK_MEDIA_INT1( "CMccVideoSink::EmptyVideoSinkBufferL iPayloadType=", 
       
   313                              aHeaderInfo.iPayloadType )
       
   314     __V_SOURCESINK_MEDIA_INT1( "CMccVideoSink::EmptyVideoSinkBufferL iSeqNum=", 
       
   315                              aHeaderInfo.iSeqNum )
       
   316     __V_SOURCESINK_MEDIA_INT1( "CMccVideoSink::EmptyVideoSinkBufferL iTimestamp=", 
       
   317                              aHeaderInfo.iTimestamp )
       
   318     __V_SOURCESINK_MEDIA_INT1( "CMccVideoSink::EmptyVideoSinkBufferL iHeaderExtension=",
       
   319                              (TInt)aHeaderInfo.iHeaderExtension )
       
   320     __V_SOURCESINK_MEDIA_INT1( "CMccVideoSink::EmptyVideoSinkBufferL iCsrcList=",
       
   321                              (TInt)aHeaderInfo.iCsrcList )
       
   322                           
       
   323     __ASSERT_ALWAYS( aBuffer, User::Leave( KErrArgument ) );
       
   324     __ASSERT_ALWAYS( aSupplier, User::Leave( KErrArgument ) );
       
   325     
       
   326     iMediaInterface->EmptyBufferL( aBuffer, aSupplier, aMediaId, aHeaderInfo );    	
       
   327 	}
       
   328 	
       
   329 		                       
       
   330 // -----------------------------------------------------------------------------
       
   331 // CMccVideoSink::BufferFilledL
       
   332 // NOT SUPPORTED. MDataSink pure virtual function must be implemented.
       
   333 // -----------------------------------------------------------------------------
       
   334 //
       
   335 void CMccVideoSink::BufferFilledL( CMMFBuffer* /*aBuffer*/ )
       
   336     {
       
   337     __V_SOURCESINK_MEDIA( "CMccVideoSink::EmptyBufferL, \
       
   338 Leave with KErrNotSupported" )
       
   339 
       
   340     __ASSERT_ALWAYS( EFalse, User::Leave( KErrNotSupported ) );
       
   341     }
       
   342 
       
   343 // -----------------------------------------------------------------------------
       
   344 // CMccVideoSink::CanCreateSinkBuffer
       
   345 // NOT SUPPORTED. MDataSink pure virtual function must be implemented.
       
   346 // -----------------------------------------------------------------------------
       
   347 //
       
   348 TBool CMccVideoSink::CanCreateSinkBuffer()
       
   349     {
       
   350     __V_SOURCESINK_CONTROLL( "CMccVideoSink::CanCreateSinkBuffer, EFalse" ) 
       
   351     return EFalse;
       
   352     }
       
   353 
       
   354 // -----------------------------------------------------------------------------
       
   355 // CMccVideoSink::CreateSinkBufferL
       
   356 // NOT SUPPORTED. MDataSink pure virtual function must be implemented.
       
   357 // -----------------------------------------------------------------------------
       
   358 //
       
   359 CMMFBuffer* CMccVideoSink::CreateSinkBufferL( TMediaId /*aMediaId*/,
       
   360                                                 TBool& /*aReference*/ )
       
   361     {
       
   362     __V_SOURCESINK_CONTROLL( "CMccVideoSink::CreateSinkBufferL, \
       
   363 leave with KErrNotSupported" ) 
       
   364 	User::Leave( KErrNotSupported );	
       
   365 	return NULL;
       
   366 	}
       
   367 
       
   368 // -----------------------------------------------------------------------------
       
   369 // CMccVideoSink::SinkPrimeL
       
   370 // Prime the sink. 
       
   371 // -----------------------------------------------------------------------------
       
   372 //
       
   373 void CMccVideoSink::SinkPrimeL()
       
   374     { 
       
   375     __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkPrimeL" )
       
   376     __ASSERT_ALWAYS( iMediaInterface, User::Leave( KErrArgument ) );
       
   377 
       
   378     if ( iVideoReady && iAudioReady )
       
   379         {        
       
   380         iMediaInterface->OpenL();
       
   381         }
       
   382     }
       
   383 
       
   384 // -----------------------------------------------------------------------------
       
   385 // CMccVideoSink::SinkPlayL
       
   386 // Start the playout operation.
       
   387 // -----------------------------------------------------------------------------
       
   388 //
       
   389 void CMccVideoSink::SinkPlayL()
       
   390     {
       
   391     __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkPlayL" )
       
   392     __ASSERT_ALWAYS( iMediaInterface, User::Leave( KErrArgument ) );
       
   393     iMediaInterface->StartL();
       
   394     }
       
   395 
       
   396 // -----------------------------------------------------------------------------
       
   397 // CMccVideoSink::SinkPauseL
       
   398 // Pauses the playout operation.
       
   399 // -----------------------------------------------------------------------------
       
   400 //
       
   401 void CMccVideoSink::SinkPauseL()
       
   402     {
       
   403     __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkPauseL" )
       
   404     __ASSERT_ALWAYS( iMediaInterface, User::Leave( KErrArgument ) );
       
   405     iMediaInterface->PauseL();
       
   406     }
       
   407 
       
   408 // -----------------------------------------------------------------------------
       
   409 // CMccVideoSink::SinkStopL
       
   410 // Stop the playout operation. 
       
   411 // -----------------------------------------------------------------------------
       
   412 //
       
   413 void CMccVideoSink::SinkStopL()
       
   414     {
       
   415     __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkStopL" )
       
   416     __ASSERT_ALWAYS( iMediaInterface, User::Leave( KErrArgument ) );
       
   417     iMediaInterface->Stop();  
       
   418     }
       
   419 
       
   420 // -----------------------------------------------------------------------------
       
   421 // CMccVideoSink::SetSinkPrioritySettings
       
   422 // -----------------------------------------------------------------------------
       
   423 //   
       
   424 void CMccVideoSink::SetSinkPrioritySettings( 
       
   425     const TMMFPrioritySettings& aPrioritySettings )
       
   426     {
       
   427     __V_SOURCESINK_CONTROLL( "CMccVideoSink::SetSinkPrioritySettings" )
       
   428     
       
   429     if ( iMediaInterface )
       
   430         {
       
   431         iMediaInterface->SetPriority( aPrioritySettings.iPriority, 
       
   432                                       aPrioritySettings.iPref );
       
   433         }
       
   434     }
       
   435 
       
   436 // ---------------------------------------------------------------------------
       
   437 // CMccVideoSink::SinkCustomCommand()
       
   438 // 
       
   439 // ---------------------------------------------------------------------------
       
   440 //
       
   441 void CMccVideoSink::SinkCustomCommand( TMMFMessage& /*aMessage*/ )
       
   442     {
       
   443     __V_SOURCESINK_CONTROLL( "CMccVideoSink::SinkCustomCommand" )
       
   444     }
       
   445 
       
   446 // ---------------------------------------------------------------------------
       
   447 // CMccVideoSink::GetParameterL()
       
   448 // ---------------------------------------------------------------------------
       
   449 //
       
   450 void CMccVideoSink::GetParameterL( TUint32 aParam, TDes8& aVal )
       
   451     {
       
   452     __V_SOURCESINK_CONTROLL( "CMccVideoSink::GetParameterL" )
       
   453     
       
   454     __ASSERT_ALWAYS( iMediaInterface, User::Leave( KErrNotReady ) );
       
   455     
       
   456         
       
   457     switch ( aParam )
       
   458         {
       
   459         case KMccDisplayLocalVideo:
       
   460             {
       
   461             TMccVideoSinkSettingBuf settingsBuf;
       
   462 	        settingsBuf.Copy( aVal );
       
   463 	        TMccVideoSinkSetting& settings = settingsBuf();
       
   464             iMediaInterface->GetCurrentSettings( settings );
       
   465             aVal.Copy( settingsBuf );
       
   466             break;
       
   467             }
       
   468         case KMccPrerollTime:
       
   469             {
       
   470             TInt preroll = 0;
       
   471             iMediaInterface->GetActualPrerollL( preroll );
       
   472             (*reinterpret_cast<TPckgBuf<TInt>* >(&aVal))() = preroll;
       
   473             break;
       
   474             }
       
   475         default:
       
   476             {
       
   477             User::Leave( KErrArgument );
       
   478             break;
       
   479             }
       
   480         }
       
   481         
       
   482         
       
   483     __V_SOURCESINK_CONTROLL( "CMccVideoSink::GetParameterL, exit" )
       
   484     }
       
   485 
       
   486 // ---------------------------------------------------------------------------
       
   487 // CMccVideoSink::SetParameterL() 
       
   488 // ---------------------------------------------------------------------------
       
   489 //       
       
   490 void CMccVideoSink::SetParameterL( TUint32 aParam, const TDesC8& aVal )
       
   491     {
       
   492     __V_SOURCESINK_CONTROLL( "CMccVideoSink::SetParameterL" )
       
   493     
       
   494     __ASSERT_ALWAYS( iMediaInterface, User::Leave( KErrNotReady ) );
       
   495  
       
   496     switch ( aParam )
       
   497         {
       
   498         case KMccDisplayLocalVideo:
       
   499             {
       
   500             TMccVideoSinkSettingBuf settingsBuf;
       
   501         	settingsBuf.Copy( aVal );
       
   502         	TMccVideoSinkSetting& settings = settingsBuf();
       
   503             iMediaInterface->UpdateSettingsL( settings );
       
   504             break;
       
   505             }
       
   506         case KMccSpeakerVolume:
       
   507             {
       
   508             TPckgBuf<TInt> volBuf;
       
   509         	volBuf.Copy( aVal );
       
   510             iMediaInterface->SetVolumeL( volBuf() );
       
   511             break;
       
   512             }
       
   513         case KMccSpeakerMaxVolume:
       
   514             {
       
   515             TPckgBuf<TInt> maxVolBuf;
       
   516         	maxVolBuf.Copy( aVal );
       
   517             iMediaInterface->SetMaxVolume( maxVolBuf() );
       
   518             break;
       
   519             }
       
   520         default:
       
   521             {
       
   522             User::Leave( KErrArgument );
       
   523             break;
       
   524             }
       
   525         }
       
   526         
       
   527     __V_SOURCESINK_CONTROLL( "CMccVideoSink::SetParameterL, exit" )
       
   528     }
       
   529 
       
   530 // ========================== OTHER EXPORTED FUNCTIONS =========================
       
   531 
       
   532 //  End of File  
       
   533