mdfdevvideoextensions/nga_mdf_postprocessor_shai/src/NGAPostProcSessionManager.cpp
author hgs
Thu, 16 Sep 2010 18:57:38 +0100
changeset 58 b6dbf97aba93
permissions -rw-r--r--
2010wk36_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
58
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
     1
/*
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
     2
* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
     3
* All rights reserved.
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
     8
*
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
     9
* Initial Contributors:
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    11
*
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    12
* Contributors:
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    13
*
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    14
* Description:
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    15
*
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    16
*/
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    17
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    18
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    19
#include <e32base.h>
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    20
#include <graphics/surfaceupdateclient.h> //RSurfaceUpdateSession
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    21
#include <graphics/surfacemanager.h> //RSurfaceManager
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    22
#include <graphics/suerror.h> //KAllScreens
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    23
 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    24
#include "NGAPostProcSessionManager.h" 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    25
#include "NGAPostProcSessionManagerObserver.h"
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    26
#include "MdfRDebug.h"
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    27
#include "NGAPostProcNotifier.h"
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    28
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    29
// --- Constants ---
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    30
const TInt KMessageSlots      = 4; 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    31
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    32
//**************************************************
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    33
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    34
CNGAPostProcSessionManager* CNGAPostProcSessionManager::NewL() 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    35
{ 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    36
   PP_DEBUG(_L("CNGAPostProcSessionManager:NewL() ++"));
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    37
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    38
    CNGAPostProcSessionManager* self = new (ELeave) CNGAPostProcSessionManager; 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    39
    CleanupStack::PushL(self);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    40
    self->ConstructL(); 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    41
    CleanupStack::Pop();
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    42
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    43
   PP_DEBUG(_L("CNGAPostProcSessionManager:NewL() --"));
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    44
    return self; 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    45
}
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    46
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    47
CNGAPostProcSessionManager::CNGAPostProcSessionManager() 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    48
:iSurfaceUpdateSession(NULL),
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    49
 iObserver(NULL)
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    50
 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    51
{
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    52
}
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    53
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    54
void CNGAPostProcSessionManager::ConstructL() 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    55
{ 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    56
   PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:ConstructL() ++"), this);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    57
    
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    58
    iSurfaceUpdateSession = new (ELeave) RSurfaceUpdateSession();
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    59
    User::LeaveIfError(iSurfaceUpdateSession->Connect(KMessageSlots));
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    60
    
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    61
   PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:ConstructL() --"), this);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    62
}
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    63
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    64
void CNGAPostProcSessionManager::CreateNotifierL(TInt aNumSurfaceBuffers)
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    65
    {
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    66
    PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:CreateNotifierL() ++"), this);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    67
    
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    68
    CNGAPostProcNotifier* notifier;
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    69
    for(TInt index = 0; index < aNumSurfaceBuffers; ++index)
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    70
        {
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    71
        notifier = CNGAPostProcNotifier::NewL(*this);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    72
        CleanupStack::PushL(notifier);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    73
        
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    74
        iAOList.AppendL(notifier); 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    75
        
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    76
        CleanupStack::Pop();
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    77
        }   
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    78
    PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:CreateNotifierL() --"), this);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    79
    }
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    80
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    81
CNGAPostProcSessionManager::~CNGAPostProcSessionManager()
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    82
{
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    83
   PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:~() ++"), this);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    84
   //Its safer to destry notifiers before surfaceupdatesession object since notifiers
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    85
   //guarantee synchronous cancellation.
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    86
   iAOList.ResetAndDestroy();
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    87
   
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    88
    if(iSurfaceUpdateSession)
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    89
    {
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    90
    	CancelUpdate();
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    91
    	iSurfaceUpdateSession->Close();
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    92
    	delete iSurfaceUpdateSession;
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    93
    	iSurfaceUpdateSession = NULL;
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    94
	}
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    95
    
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    96
    
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    97
   PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:~() --"), this);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    98
}
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
    99
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   100
TInt CNGAPostProcSessionManager::PostPicture(const TSurfaceId& aSurfaceId,
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   101
								TInt aBufId, TBool aNotifyRequired) 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   102
{ 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   103
   PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:PostPicture() ++"), this);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   104
   TInt err = KErrNone;
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   105
	if(aNotifyRequired)
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   106
	{
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   107
	    CNGAPostProcNotifier* notifier = NULL;
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   108
		for(TInt j=0; j < iAOList.Count(); j++)
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   109
		{
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   110
            //notifier = iAOList[j];
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   111
            if(!iAOList[j]->IsActive())
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   112
            {
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   113
                notifier = iAOList[j];
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   114
                iAOList.Remove(j);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   115
                //iAOList.Compress(); //why this is required? may create fragmentation.
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   116
                break;
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   117
            }
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   118
		}
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   119
		if(!notifier)
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   120
		{
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   121
			
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   122
			return KErrInUse;
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   123
	        
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   124
		}
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   125
		
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   126
		notifier->SetBufferId(aBufId);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   127
		notifier->Activate();
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   128
		iSurfaceUpdateSession->NotifyWhenAvailable(notifier->iStatus);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   129
		iAOList.Append(notifier);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   130
		
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   131
		
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   132
	}
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   133
	err = iSurfaceUpdateSession->SubmitUpdate(KAllScreens, aSurfaceId, aBufId);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   134
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   135
   PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:PostPicture() -- err = %d"), this, err);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   136
   return err;
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   137
}
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   138
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   139
void CNGAPostProcSessionManager::CancelUpdate() 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   140
{ 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   141
   PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:CancelUpdate() ++"), this);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   142
	iSurfaceUpdateSession->CancelAllUpdateNotifications();
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   143
   PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:CancelUpdate() --"), this);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   144
}
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   145
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   146
void CNGAPostProcSessionManager::CancelNotifiers() 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   147
{ 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   148
    
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   149
   PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:CancelNotifiers() ++"), this);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   150
   TInt notifierCount = iAOList.Count();
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   151
   for (TInt i = notifierCount - 1; i >= 0; --i) //reverse loop since the active notifier is appended to the list
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   152
   {
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   153
       if (iAOList[i]->IsActive())
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   154
       {
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   155
           iAOList[i]->Cancel();
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   156
       }
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   157
       else
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   158
       {
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   159
           break;
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   160
       }
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   161
   }
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   162
   
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   163
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   164
   
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   165
   PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:CancelNotifiers() --"), this);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   166
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   167
	
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   168
	
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   169
}
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   170
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   171
void CNGAPostProcSessionManager::HandleBufferRelease(TInt aBufId, TInt aStatus) 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   172
{ 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   173
   PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:HandleBufferRelease() ++"), this);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   174
    if(iObserver)
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   175
    {
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   176
		iObserver->BufferAvailable(aBufId, aStatus);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   177
	}
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   178
   PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:HandleBufferRelease() --"), this);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   179
}
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   180
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   181
void CNGAPostProcSessionManager::SetObserver(MNGAPostProcSessionManagerObserver& aObserver) 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   182
{ 
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   183
   PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:SetClockSource() ++"), this);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   184
	iObserver = &aObserver;
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   185
   PP_DEBUG(_L("CNGAPostProcSessionManager[%x]:SetClockSource() --"), this);
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   186
}
b6dbf97aba93 2010wk36_01
hgs
parents:
diff changeset
   187