tsrc/consoleplayer/player/src/externalplayer.cpp
author hgs
Fri, 03 Sep 2010 19:37:02 -0500
changeset 33 e1b6d78dfe6a
permissions -rw-r--r--
201035
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Contributors:
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * Description:
hgs
parents:
diff changeset
    15
 * Source file for the main class of the external player executable.
hgs
parents:
diff changeset
    16
 * 
hgs
parents:
diff changeset
    17
 */
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include "externalplayer.h"
hgs
parents:
diff changeset
    20
#include "mmfplayerwindow.h"
hgs
parents:
diff changeset
    21
#include "testappbase.h"
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
// This is the implementation for the external player executable.
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
class CExternalPlayerExe : public CActive
hgs
parents:
diff changeset
    26
    {
hgs
parents:
diff changeset
    27
public:
hgs
parents:
diff changeset
    28
    
hgs
parents:
diff changeset
    29
    static void ExecuteL()
hgs
parents:
diff changeset
    30
        {
hgs
parents:
diff changeset
    31
        CExternalPlayerExe* self = new(ELeave) CExternalPlayerExe;
hgs
parents:
diff changeset
    32
        CleanupStack::PushL( self );
hgs
parents:
diff changeset
    33
        self->MainL();
hgs
parents:
diff changeset
    34
        CleanupStack::PopAndDestroy( self );    
hgs
parents:
diff changeset
    35
        }
hgs
parents:
diff changeset
    36
    
hgs
parents:
diff changeset
    37
private:
hgs
parents:
diff changeset
    38
    
hgs
parents:
diff changeset
    39
    CExternalPlayerExe() : CActive( EPriorityStandard )
hgs
parents:
diff changeset
    40
        {
hgs
parents:
diff changeset
    41
        CActiveScheduler::Add( this );
hgs
parents:
diff changeset
    42
        }
hgs
parents:
diff changeset
    43
    
hgs
parents:
diff changeset
    44
    ~CExternalPlayerExe()
hgs
parents:
diff changeset
    45
        {
hgs
parents:
diff changeset
    46
        Cancel();
hgs
parents:
diff changeset
    47
        iMsgQueue.Close();
hgs
parents:
diff changeset
    48
        iChunk.Close();
hgs
parents:
diff changeset
    49
        delete iVideoPlayer;
hgs
parents:
diff changeset
    50
        delete iWindowGroup;
hgs
parents:
diff changeset
    51
        delete iScreenDevice;
hgs
parents:
diff changeset
    52
        iWs.Close();
hgs
parents:
diff changeset
    53
        iFs.Close();
hgs
parents:
diff changeset
    54
        }
hgs
parents:
diff changeset
    55
    
hgs
parents:
diff changeset
    56
    void MainL()
hgs
parents:
diff changeset
    57
        {
hgs
parents:
diff changeset
    58
        TInt err = KErrNone;
hgs
parents:
diff changeset
    59
                
hgs
parents:
diff changeset
    60
        User::LeaveIfError( iFs.Connect() );        
hgs
parents:
diff changeset
    61
        
hgs
parents:
diff changeset
    62
        User::LeaveIfError( iWs.Connect() );    
hgs
parents:
diff changeset
    63
        
hgs
parents:
diff changeset
    64
        iScreenDevice = new(ELeave) CWsScreenDevice( iWs );
hgs
parents:
diff changeset
    65
        User::LeaveIfError( iScreenDevice->Construct() );
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
        TBuf<200> commandLine;
hgs
parents:
diff changeset
    68
        User::CommandLine( commandLine );
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
        TInt startIndex = commandLine.Find(KMsgQueuePrefix);
hgs
parents:
diff changeset
    71
        
hgs
parents:
diff changeset
    72
        if( startIndex < 0 )
hgs
parents:
diff changeset
    73
            {
hgs
parents:
diff changeset
    74
            err = startIndex;
hgs
parents:
diff changeset
    75
            }
hgs
parents:
diff changeset
    76
        else
hgs
parents:
diff changeset
    77
            {
hgs
parents:
diff changeset
    78
            TPtrC msgQueueName = commandLine.Right( commandLine.Length() - startIndex - KMsgQueuePrefix().Length());
hgs
parents:
diff changeset
    79
            err = iMsgQueue.CreateGlobal( msgQueueName, 3 );
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
            if( err == KErrNone )
hgs
parents:
diff changeset
    82
                {
hgs
parents:
diff changeset
    83
                TBuf<80> chunkName;
hgs
parents:
diff changeset
    84
                chunkName.Copy( msgQueueName );
hgs
parents:
diff changeset
    85
                chunkName.Append( _L("_chunk") );
hgs
parents:
diff changeset
    86
                err = iChunk.CreateGlobal( chunkName, 2048, 2048 );  // 2K chunk        
hgs
parents:
diff changeset
    87
                }            
hgs
parents:
diff changeset
    88
            }
hgs
parents:
diff changeset
    89
        
hgs
parents:
diff changeset
    90
        RProcess::Rendezvous( err );
hgs
parents:
diff changeset
    91
        
hgs
parents:
diff changeset
    92
        if( err == KErrNone )
hgs
parents:
diff changeset
    93
            {
hgs
parents:
diff changeset
    94
            SetActive();
hgs
parents:
diff changeset
    95
            iMsgQueue.NotifyDataAvailable( iStatus );
hgs
parents:
diff changeset
    96
        
hgs
parents:
diff changeset
    97
            CActiveScheduler::Start();
hgs
parents:
diff changeset
    98
            }
hgs
parents:
diff changeset
    99
        }
hgs
parents:
diff changeset
   100
    
hgs
parents:
diff changeset
   101
    // inherited from CActive
hgs
parents:
diff changeset
   102
    
hgs
parents:
diff changeset
   103
    void RunL()
hgs
parents:
diff changeset
   104
        {        
hgs
parents:
diff changeset
   105
        if( iStatus == KErrNone )
hgs
parents:
diff changeset
   106
            {
hgs
parents:
diff changeset
   107
            TInt err = KErrNone;
hgs
parents:
diff changeset
   108
        
hgs
parents:
diff changeset
   109
            TExternalPlayerCommands msg;
hgs
parents:
diff changeset
   110
            iMsgQueue.Receive( msg );
hgs
parents:
diff changeset
   111
            
hgs
parents:
diff changeset
   112
            RDebug::Printf( "EXTERNALPLAYER RunL() msg=%i", msg );
hgs
parents:
diff changeset
   113
    
hgs
parents:
diff changeset
   114
            switch( msg )
hgs
parents:
diff changeset
   115
                {
hgs
parents:
diff changeset
   116
                case EExternalPlayer_StartPlayback:
hgs
parents:
diff changeset
   117
                    {
hgs
parents:
diff changeset
   118
                    TStartPlayback* chunk = (TStartPlayback*)iChunk.Base();
hgs
parents:
diff changeset
   119
                    
hgs
parents:
diff changeset
   120
                    TPtrC8 filename( chunk->name, chunk->length );
hgs
parents:
diff changeset
   121
                    iLocation.Copy( filename ); 
hgs
parents:
diff changeset
   122
                    iLocationIsFilename = chunk->locationIsFilename;
hgs
parents:
diff changeset
   123
                    
hgs
parents:
diff changeset
   124
                    iWindowTopRight.iX  = chunk->x;
hgs
parents:
diff changeset
   125
                    iWindowTopRight.iY  = chunk->y;
hgs
parents:
diff changeset
   126
                    iWindowSize.iWidth  = chunk->width;
hgs
parents:
diff changeset
   127
                    iWindowSize.iHeight = chunk->height;
hgs
parents:
diff changeset
   128
                    
hgs
parents:
diff changeset
   129
                    iWindowGroup = new RWindowGroup( iWs );
hgs
parents:
diff changeset
   130
                    err = iWindowGroup->ConstructChildApp( chunk->idOfParentWindowGroup,  
hgs
parents:
diff changeset
   131
                                                           KNullWsHandle, 
hgs
parents:
diff changeset
   132
                                                           false );
hgs
parents:
diff changeset
   133
                    ASSERT( err == KErrNone );   
hgs
parents:
diff changeset
   134
                    
hgs
parents:
diff changeset
   135
                    TStartPlaybackReturn* chunkReturn = (TStartPlaybackReturn*)iChunk.Base();
hgs
parents:
diff changeset
   136
                    
hgs
parents:
diff changeset
   137
                    chunkReturn->windowGroupId = iWindowGroup->Identifier();
hgs
parents:
diff changeset
   138
                    
hgs
parents:
diff changeset
   139
                    iVideoPlayer = CMmfPlayerWindow::NewL( iFs, 
hgs
parents:
diff changeset
   140
                                                           iWs, 
hgs
parents:
diff changeset
   141
                                                           *iScreenDevice, 
hgs
parents:
diff changeset
   142
                                                           *iWindowGroup,
hgs
parents:
diff changeset
   143
                                                           iWindowTopRight,
hgs
parents:
diff changeset
   144
                                                           iWindowSize,
hgs
parents:
diff changeset
   145
                                                           true,  // transparent
hgs
parents:
diff changeset
   146
                                                           KRgbTransparent,
hgs
parents:
diff changeset
   147
                                                           true );
hgs
parents:
diff changeset
   148
                    
hgs
parents:
diff changeset
   149
                    if( iLocationIsFilename )
hgs
parents:
diff changeset
   150
                        {
hgs
parents:
diff changeset
   151
                        iVideoPlayer->StartWithFilenameL( iLocation, CPlayerWindow::EBestFit);
hgs
parents:
diff changeset
   152
                        }
hgs
parents:
diff changeset
   153
                    else
hgs
parents:
diff changeset
   154
                        {
hgs
parents:
diff changeset
   155
                        iVideoPlayer->StartWithUrlL( iLocation, CPlayerWindow::EBestFit);                
hgs
parents:
diff changeset
   156
                        }
hgs
parents:
diff changeset
   157
                    
hgs
parents:
diff changeset
   158
                    RDebug::Printf( "EXTERNALPLAYER player started" );
hgs
parents:
diff changeset
   159
                    break;
hgs
parents:
diff changeset
   160
                    }
hgs
parents:
diff changeset
   161
                case EExternalPlayer_ExecuteOperation:
hgs
parents:
diff changeset
   162
                    {
hgs
parents:
diff changeset
   163
                    TExecuteOperation* chunk = (TExecuteOperation*)iChunk.Base();
hgs
parents:
diff changeset
   164
                    err = iVideoPlayer->ExecuteOperation(chunk->operation );
hgs
parents:
diff changeset
   165
                    break;
hgs
parents:
diff changeset
   166
                    }
hgs
parents:
diff changeset
   167
                case EExternalPlayer_MoveWindow:
hgs
parents:
diff changeset
   168
                    {
hgs
parents:
diff changeset
   169
                    TMoveWindow* chunk = (TMoveWindow*)iChunk.Base();
hgs
parents:
diff changeset
   170
                    iVideoPlayer->MoveWindow( TPoint(chunk->centerX, chunk->centerY) );
hgs
parents:
diff changeset
   171
                    break;
hgs
parents:
diff changeset
   172
                    }
hgs
parents:
diff changeset
   173
                case EExternalPlayer_Shutdown:
hgs
parents:
diff changeset
   174
                    {
hgs
parents:
diff changeset
   175
                    RDebug::Printf( "EXTERNALPLAYER player stopped" );
hgs
parents:
diff changeset
   176
                    
hgs
parents:
diff changeset
   177
                    CActiveScheduler::Stop();
hgs
parents:
diff changeset
   178
                    break;
hgs
parents:
diff changeset
   179
                    }
hgs
parents:
diff changeset
   180
                }
hgs
parents:
diff changeset
   181
            
hgs
parents:
diff changeset
   182
            RProcess::Rendezvous( err );
hgs
parents:
diff changeset
   183
            
hgs
parents:
diff changeset
   184
            SetActive();
hgs
parents:
diff changeset
   185
            iMsgQueue.NotifyDataAvailable( iStatus );
hgs
parents:
diff changeset
   186
            }
hgs
parents:
diff changeset
   187
        }
hgs
parents:
diff changeset
   188
    
hgs
parents:
diff changeset
   189
    void DoCancel()
hgs
parents:
diff changeset
   190
        {
hgs
parents:
diff changeset
   191
        iMsgQueue.CancelDataAvailable();
hgs
parents:
diff changeset
   192
        }    
hgs
parents:
diff changeset
   193
    
hgs
parents:
diff changeset
   194
    RFs                                iFs;
hgs
parents:
diff changeset
   195
    RWsSession                         iWs;
hgs
parents:
diff changeset
   196
    CWsScreenDevice*                   iScreenDevice; 
hgs
parents:
diff changeset
   197
    RWindowGroup*                      iWindowGroup;
hgs
parents:
diff changeset
   198
    CPlayerWindow*                     iVideoPlayer;
hgs
parents:
diff changeset
   199
    RMsgQueue<TExternalPlayerCommands> iMsgQueue;
hgs
parents:
diff changeset
   200
    RChunk                             iChunk;
hgs
parents:
diff changeset
   201
    TFileName                          iLocation;
hgs
parents:
diff changeset
   202
    bool                               iLocationIsFilename;
hgs
parents:
diff changeset
   203
    TPoint                             iWindowTopRight;
hgs
parents:
diff changeset
   204
    TSize                              iWindowSize;
hgs
parents:
diff changeset
   205
    
hgs
parents:
diff changeset
   206
    };
hgs
parents:
diff changeset
   207
hgs
parents:
diff changeset
   208
GLDEF_C TInt E32Main()
hgs
parents:
diff changeset
   209
    {
hgs
parents:
diff changeset
   210
    __UHEAP_MARK;
hgs
parents:
diff changeset
   211
    
hgs
parents:
diff changeset
   212
    CActiveScheduler* scheduler = new CActiveScheduler;
hgs
parents:
diff changeset
   213
    CTrapCleanup* cleanup = CTrapCleanup::New();
hgs
parents:
diff changeset
   214
    if( scheduler != NULL && cleanup != NULL )
hgs
parents:
diff changeset
   215
    {
hgs
parents:
diff changeset
   216
        CActiveScheduler::Install( scheduler );
hgs
parents:
diff changeset
   217
        TRAP_IGNORE( CExternalPlayerExe::ExecuteL() );
hgs
parents:
diff changeset
   218
    }
hgs
parents:
diff changeset
   219
    delete cleanup;
hgs
parents:
diff changeset
   220
    delete scheduler;
hgs
parents:
diff changeset
   221
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
   222
    return 0;
hgs
parents:
diff changeset
   223
    }
hgs
parents:
diff changeset
   224