devsound/a3fdevsound/src/devsoundadaptor/cdevcommoncontrol.cpp
author hgs
Mon, 18 Oct 2010 12:47:26 +0100
changeset 4 9d4397b300d1
parent 0 b8ed18f6c07b
permissions -rw-r--r--
2010wk44_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     1
// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     2
// All rights reserved.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     7
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     8
// Initial Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    10
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    11
// Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    12
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    13
// Description:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    14
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    15
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    16
#include "cdevcommoncontrol.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    17
#include <a3f/maudiocontext.h> 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    18
#include <a3f/maudiocodec.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    19
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    20
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    21
CDevCommonControl::CDevCommonControl()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    22
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    23
    TRACE_CREATE();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    24
    DP_CONTEXT(CDevCommonControl::CDevCommonControl, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    25
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    26
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    27
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    28
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    29
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    30
CDevCommonControl::~CDevCommonControl()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    31
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    32
    DP_CONTEXT(CDevCommonControl::~CDevCommonControl, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    33
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    34
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    35
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    36
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    37
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    38
TInt CDevCommonControl::Stop() // from CDevAudioControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    39
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    40
    DP_CONTEXT(CDevCommonControl::Stop, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    41
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    42
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    43
    TInt err = KErrNone;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    44
    switch(iDevAudio->iActiveState)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    45
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    46
        case EDevSoundAdaptorActive_Active:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    47
        case EDevSoundAdaptorPaused_Primed:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    48
            err = iDevAudio->iAudioStream->Stop();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    49
            if (err == KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    50
                {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    51
                err = iDevAudio->CommitAudioContext();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    52
                }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    53
            if (err == KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    54
                {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    55
                iDevAudio->iActiveState = EDevSoundAdaptorStopping;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    56
                }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    57
            break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    58
        case EDevSoundAdaptorGoingActive:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    59
            iDevAudio->iActiveState = EDevSoundAdaptorStopping;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    60
            break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    61
        case EDevSoundAdaptorInitialised_Idle:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    62
        	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    63
        	//If following condition is true, then we are here because of a
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    64
        	//pre-emption clash in last Commit cycle started from
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    65
        	//CDevCommonControl::ContextEventUpdateWithStateEventNoError.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    66
        	if(iDevAudio->iPreviousState == EDevSoundAdaptorUnloading)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    67
        		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    68
				err = Unload();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    69
				break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    70
        		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    71
        	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    72
        default:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    73
            break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    74
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    75
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    76
    if(err == KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    77
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    78
        iDevAudio->iStop = ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    79
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    80
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    81
    DP0_RET(err,"%d");
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    82
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    83
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    84
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    85
TInt CDevCommonControl::Pause() // from CDevAudioControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    86
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    87
    DP_CONTEXT(CDevCommonControl::Pause, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    88
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    89
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    90
    TInt err = iDevAudio->iAudioStream->Prime();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    91
    if ( err == KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    92
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    93
        err = iDevAudio->CommitAudioContext();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    94
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    95
    if (err == KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    96
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    97
        iDevAudio->iActiveState = EDevSoundAdaptorPausing;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    98
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    99
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   100
    DP0_RET(err,"%d");
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   101
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   102
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   103
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   104
TInt CDevCommonControl::Resume() // from CDevAudioControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   105
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   106
    DP_CONTEXT(CDevCommonControl::Resume, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   107
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   108
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   109
    TInt err = KErrNone;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   110
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   111
    //If following condition is true, then we are here because of a
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   112
    //pre-emption clash in last Commit cycle started from
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   113
    //CDevCommonControl::ContextEventUpdateWithStateEventAndError.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   114
    if(iDevAudio->iActiveState == EDevSoundAdaptorInitialised_Idle &&
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   115
    		iDevAudio->iPreviousState == EDevSoundAdaptorUnloading)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   116
    	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   117
		err = Unload();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   118
		DP0_RET(err,"%d");
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   119
    	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   120
    else if(iDevAudio->iActiveState != EDevSoundAdaptorPaused_Primed)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   121
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   122
        DP0_RET(KErrNotReady, "%d");
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   123
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   124
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   125
    if(err == KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   126
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   127
        // Populate gain and balance values set in the Paused state and being cached
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   128
        err = iDevAudio->RequestGainAndBalance(this);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   129
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   130
    if(err == KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   131
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   132
        err = iDevAudio->iAudioStream->Activate();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   133
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   134
    if ( err == KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   135
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   136
        err = iDevAudio->CommitAudioContext();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   137
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   138
    if (err == KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   139
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   140
        iDevAudio->iActiveState = EDevSoundAdaptorActivating;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   141
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   142
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   143
    DP0_RET(err,"%d");
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   144
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   145
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   146
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   147
void CDevCommonControl::StateEvent(MAudioStream& aStream, TInt aError,  // from MAudioProcessingUnitObserver
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   148
                                    TAudioState aNewState)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   149
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   150
    DP_CONTEXT(CDevCommonControl::StateEvent, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   151
    DP3_IN("activeState %d -> newstate %d, (%d)",
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   152
            iDevAudio->iActiveState, aNewState, aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   153
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   154
    __ASSERT_ALWAYS(iDevAudio->iAudioStream == &aStream, Panic(EStreamMismatch));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   155
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   156
    if(aError != KErrNone || iDevAudio->iActiveStreamState != aNewState) 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   157
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   158
        iDevAudio->iActiveStreamState = aNewState;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   159
        iStateEventReceived = ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   160
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   161
    // Since the audiostream already demoted the state for the most of the cases
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   162
    // only is need  when a error comes were the stream was at the middle of A3f two-phase transition
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   163
    else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   164
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   165
        switch (aNewState)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   166
            {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   167
            case EIdle:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   168
                // Demote the stream state
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   169
                iDevAudio->iActiveStreamState = EIdle;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   170
                break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   171
            default:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   172
                break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   173
            }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   174
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   175
    iStateEventError = aError;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   176
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   177
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   178
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   179
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   180
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   181
void CDevCommonControl::ProcessingUnitError(MAudioProcessingUnit* /*aInstance*/, // from MAudioProcessingUnitObserver
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   182
                                                                 TInt aError)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   183
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   184
    DP_CONTEXT(CDevCommonControl::ProcessingUnitError, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   185
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   186
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   187
    if(iCallbackFromAdaptor == KCallbackNone)   
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   188
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   189
        iProcessingUnitError = aError;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   190
        iCallbackFromAdaptor = KCallbackProcessingUnitError;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   191
        iAdaptationObserver->CallbackFromAdaptorReceived(KCallbackProcessingUnitError, aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   192
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   193
    else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   194
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   195
        // Multiple callbacks from adaptor
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   196
        DP0(DLINFO, "Multiple callbacks from adaptor");
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   197
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   198
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   199
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   200
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   201
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   202
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   203
void CDevCommonControl::ContextEvent(TUid aEvent, TInt aError) 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   204
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   205
    DP_CONTEXT(CDevCommonControl::ContextEvent, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   206
    DP3_IN("ContextEvent aEvent=%x iActiveState=%d aError=%d",aEvent, iDevAudio->iActiveState, aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   207
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   208
    // Can't "switch {...}" on UIDs unfortunately:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   209
    if (aEvent == KUidA3FContextUpdateComplete)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   210
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   211
        if(iBeingPreempted)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   212
            {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   213
			if(iStateEventReceived)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   214
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   215
				//use a sub state pattern to make pre-emption cycles like other cycles.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   216
				DP1(DLERR,"Preemption error=%d", aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   217
				iDevAudio->iActiveState = EDevSoundAdaptorBeingPreempted;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   218
				if(iPreemptionClash)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   219
					{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   220
					// remove last request from front of queue without processing it
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   221
					iAdaptationObserver->PreemptionClashWithStateChange();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   222
					iPreemptionClash=EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   223
					}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   224
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   225
            else if(!iStateEventReceived && iPreemptionClash)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   226
        		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   227
				iIgnoreAsyncOpComplete=ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   228
				iPreemptionClash=EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   229
        		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   230
			iBeingPreempted=EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   231
            }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   232
		ContextEventUpdateComplete(aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   233
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   234
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   235
    else if ((aEvent == KUidA3FContextCommitUpdate))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   236
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   237
        iBeingPreempted=EFalse; // clear being preempted
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   238
        iPreemptionClash=EFalse; // clear pre-emption clash flag
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   239
        TBool adaptorControlsContext = iAdaptationObserver->AdaptorControlsContext();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   240
        iIgnoreAsyncOpComplete = !adaptorControlsContext;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   241
            // if we don't control context, always send a PreemptionFinishedCallbackReceived()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   242
		iStateEventReceived=EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   243
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   244
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   245
    else if (aEvent == KUidA3FContextPreEmption)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   246
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   247
        // clear iBeingPreepted - will be set in ContextEventPreEmption if req
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   248
        iBeingPreempted=EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   249
        iPreemptionClash=EFalse; // clear pre-emption clash flag
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   250
        TBool adaptorControlsContext = iAdaptationObserver->AdaptorControlsContext();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   251
		iStateEventReceived=EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   252
        iIgnoreAsyncOpComplete=EFalse; // clear being iIgnoreAsyncOpComplete
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   253
        ContextEventPreEmption(aEvent, aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   254
        if (!adaptorControlsContext)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   255
            {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   256
            iIgnoreAsyncOpComplete = ETrue; // if we don't control context never do AsyncOpComplete
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   257
            }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   258
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   259
    else if (aEvent == KUidA3FContextPreEmptedCommit)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   260
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   261
		DP0(DLINFO,"KUidA3FContextPreEmptedCommit event received, thus clash with Pre-emption");
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   262
        // clear iBeingPreepted - will be set in ContextEventPreEmption if req
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   263
        iBeingPreempted=EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   264
        TBool adaptorControlsContext = iAdaptationObserver->AdaptorControlsContext();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   265
        if (adaptorControlsContext)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   266
        	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   267
			// push current request that was being processed onto front of queue.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   268
        	iAdaptationObserver->PreemptionClash();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   269
        	iPreemptionClash=ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   270
        	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   271
		iStateEventReceived=EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   272
        iIgnoreAsyncOpComplete=EFalse; // clear being iIgnoreAsyncOpComplete
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   273
        ContextEventPreEmption(aEvent, aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   274
        if (!adaptorControlsContext)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   275
            {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   276
            iIgnoreAsyncOpComplete = ETrue; // if we don't control context never do AsyncOpComplete
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   277
            }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   278
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   279
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   280
    else if (aEvent == KUidA3FContextAbort)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   281
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   282
        ContextEventAbort(aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   283
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   284
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   285
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   286
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   287
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   288
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   289
void CDevCommonControl::ContextEventAsynchronousPlayCompletion(TInt aError) // from CDevCommonControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   290
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   291
    DP_CONTEXT(CDevCommonControl::ContextEventAsynchronousPlayCompletion, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   292
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   293
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   294
	iAdaptationObserver->AsynchronousOperationComplete(aError, ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   295
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   296
    if (aError)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   297
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   298
        FinishWithError(aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   299
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   300
           
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   301
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   302
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   303
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   304
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   305
void CDevCommonControl::ContextEventAsynchronousInitializeComplete(TInt aError) // from CDevCommonControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   306
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   307
    DP_CONTEXT(CDevCommonControl::ContextEventAsynchronousInitializeComplete, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   308
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   309
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   310
    iAdaptationObserver->AsynchronousOperationComplete(aError, ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   311
    iAdaptationObserver->InitializeComplete(aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   312
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   313
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   314
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   315
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   316
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   317
void CDevCommonControl::ContextEventUpdateComplete(TInt aError) // from CDevCommonControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   318
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   319
    DP_CONTEXT(CDevCommonControl::ContextEventUpdateComplete, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   320
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   321
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   322
    if (iStateEventReceived)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   323
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   324
        iStateEventReceived = EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   325
        DP0(DLINFO,"Context event for that does involve state change");         
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   326
        
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   327
        if (aError)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   328
            {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   329
            ContextEventUpdateWithStateEventAndError(aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   330
            }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   331
        else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   332
            {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   333
            ContextEventUpdateWithStateEventNoError();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   334
            }   
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   335
        DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   336
        return;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   337
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   338
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   339
    DP0(DLINFO,"Context event for that doesn't involve state change");
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   340
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   341
    if (aError)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   342
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   343
        ContextEventUpdateWithoutStateEventButWithError(aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   344
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   345
    else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   346
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   347
        ContextEventUpdateWithoutStateEventNoError();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   348
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   349
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   350
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   351
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   352
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   353
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   354
void CDevCommonControl::ContextEventPreEmption(TUid aEvent, TInt aError) // from CDevCommonControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   355
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   356
    DP_CONTEXT(CDevCommonControl::ContextEventPreEmption, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   357
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   358
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   359
    DP1(DLERR,"Preemption error=%d", aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   360
    CDevAudioControl::ContextEvent(aEvent, aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   361
    iBeingPreempted=ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   362
        
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   363
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   364
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   365
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   366
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   367
void CDevCommonControl::ContextEventAbort(TInt aError) // from CDevCommonControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   368
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   369
    DP_CONTEXT(CDevCommonControl::ContextEventAbort, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   370
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   371
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   372
    DP1(DLERR,"Abort error=%d", aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   373
    FinishWithError(aError==KErrAbort ? KErrDied:aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   374
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   375
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   376
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   377
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   378
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   379
void CDevCommonControl::ContextEventStopDevSoundNotifications() // from CDevCommonControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   380
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   381
    DP_CONTEXT(CDevCommonControl::ContextEventStopDevSoundNotifications, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   382
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   383
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   384
    iDevAudio->iAudioStream->UnregisterAudioStreamObserver(*this);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   385
    iGainControl->UnregisterAudioGainControlObserver(*this);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   386
    iAudioCodecIf->UnregisterAudioCodecObserver(*this);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   387
    iAudioCodecIf = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   388
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   389
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   390
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   391
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   392
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   393
void CDevCommonControl::ContextEventPauseResumeSequenceDueToEmptyBuffers(TBool aFlush) // from CDevCommonControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   394
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   395
    DP_CONTEXT(CDevCommonControl::ContextEventPauseResumeSequenceDueToEmptyBuffers, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   396
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   397
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   398
    TInt err(KErrNone);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   399
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   400
    if (iPauseResumeSequenceDueToEmptyBuffers)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   401
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   402
        if (aFlush)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   403
            {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   404
            err = iDevAudio->iAudioStream->Flush();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   405
            }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   406
        
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   407
        if ((err) or (aFlush==EFalse))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   408
            {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   409
            iPauseResumeSequenceDueToEmptyBuffers = EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   410
            iAdaptationObserver->CallbackFromAdaptorReceived(KCallbackFlushComplete, err);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   411
            }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   412
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   413
    else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   414
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   415
        iAdaptationObserver->AsynchronousOperationComplete(KErrNone, ETrue);    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   416
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   417
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   418
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   419
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   420
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   421
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   422
void CDevCommonControl::ContextEventStateDevSoundAdaptorUnloading() // from CDevCommonControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   423
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   424
    DP_CONTEXT(CDevCommonControl::ContextEventStateDevSoundAdaptorUnloading, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   425
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   426
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   427
    // Due destruction sequence or reinitialization
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   428
    if (iDevAudio->iClosing or iDevAudio->iReinitializing)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   429
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   430
        TInt err = Uninitialize();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   431
        if (err and iDevAudio->iReinitializing)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   432
            {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   433
            ContextEventAsynchronousInitializeComplete(err);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   434
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   435
            }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   436
        
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   437
        DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   438
        return;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   439
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   440
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   441
    // Notify the user that ProcessingFinished is complete. 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   442
    // Stop call complete, sent callback.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   443
    if (iCallbackFromAdaptor != KCallbackNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   444
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   445
        iAdaptationObserver->AsynchronousOperationComplete(KErrNone, ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   446
        
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   447
        if (iCallbackFromAdaptor == KCallbackProcessingFinished)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   448
            {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   449
            FinishWithError(KErrUnderflow);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   450
            }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   451
        else if (iCallbackFromAdaptor == KCallbackProcessingUnitError)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   452
            {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   453
            FinishWithError(iProcessingUnitError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   454
            }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   455
        
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   456
        iCallbackFromAdaptor = KCallbackNone;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   457
        DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   458
        return;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   459
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   460
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   461
    // Error condition
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   462
    if (iErrorCondition)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   463
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   464
        FinishWithError(iErrorCondition);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   465
        iErrorCondition = KErrNone;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   466
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   467
    else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   468
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   469
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   470
        iAdaptationObserver->AsynchronousOperationComplete(KErrNone, ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   471
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   472
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   473
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   474
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   475
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   476
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   477
void CDevCommonControl::ContextEventStateDevSoundAdaptorLoading() // from CDevCommonControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   478
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   479
    DP_CONTEXT(CDevCommonControl::ContextEventStateDevSoundAdaptorLoading, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   480
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   481
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   482
    iDevAudio->RequestGainAndBalance(this); // TODO handle error
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   483
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   484
    TInt err = iDevAudio->iAudioStream->Activate();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   485
    if (err)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   486
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   487
        DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   488
        return;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   489
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   490
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   491
    err = iDevAudio->CommitAudioContext();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   492
    if (err)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   493
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   494
        ContextEventAsynchronousPlayCompletion(err);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   495
        DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   496
        return;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   497
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   498
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   499
    iDevAudio->iActiveState = EDevSoundAdaptorActivating;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   500
    iAdaptationObserver->AsynchronousOperationComplete(KErrNone, EFalse);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   501
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   502
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   503
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   504
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   505
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   506
void CDevCommonControl::ContextEventStateDevSoundAdaptorStopping() // from CDevCommonControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   507
    {   
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   508
    DP_CONTEXT(CDevCommonControl::ContextEventStateDevSoundAdaptorStopping, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   509
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   510
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   511
    TInt err = Unload();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   512
    if (err)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   513
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   514
        DP0(DLINFO,"Commit failed during stopping");
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   515
        FinishWithError(err);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   516
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   517
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   518
    __ASSERT_DEBUG(err==KErrNone, Panic(ECommitFailedDuringStop));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   519
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   520
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   521
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   522
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   523
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   524
void CDevCommonControl::ContextEventStateDevSoundAdaptorBeingPreempted() // from CDevCommonControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   525
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   526
    DP_CONTEXT(CDevCommonControl::ContextEventStateDevSoundAdaptorBeingPreempted, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   527
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   528
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   529
    __ASSERT_DEBUG(iDevAudio->iActiveStreamState == EInitialized, Panic(EStreamBeingDemotedToEIdle));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   530
    FinishWithError(KErrInUse);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   531
    if (iIgnoreAsyncOpComplete)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   532
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   533
        iAdaptationObserver->PreemptionFinishedCallbackReceived(ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   534
        iIgnoreAsyncOpComplete=EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   535
        DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   536
        return;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   537
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   538
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   539
    ContextEventPauseResumeSequenceDueToEmptyBuffers(EFalse);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   540
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   541
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   542
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   543
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   544
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   545
void CDevCommonControl::ContextEventStateDevSoundAdaptorUninitializing() // from CDevCommonControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   546
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   547
    DP_CONTEXT(CDevCommonControl::ContextEventStateDevSoundAdaptorUninitializing, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   548
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   549
    TInt err = RemoveProcessingUnits();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   550
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   551
    if (err == KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   552
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   553
        iDevAudio->iActiveState = EDevSoundAdaptorRemovingProcessingUnits;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   554
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   555
    else if (iDevAudio->iReinitializing)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   556
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   557
        ContextEventAsynchronousInitializeComplete(err);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   558
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   559
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   560
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   561
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   562
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   563
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   564
void CDevCommonControl::ContextEventErrorStateDevSoundAdaptorActivating(TInt aError) // from CDevCommonControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   565
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   566
    DP_CONTEXT(CDevCommonControl::ContextEventErrorStateDevSoundAdaptorActivating, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   567
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   568
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   569
    // If the resume operation fails as result of EmptyBuffers
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   570
    // Notify about operation complete through CallbackFromAdaptorReceived
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   571
    // and continue to allow client to receive PlayError()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   572
    if (iPauseResumeSequenceDueToEmptyBuffers)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   573
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   574
        iPauseResumeSequenceDueToEmptyBuffers = EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   575
        iAdaptationObserver->CallbackFromAdaptorReceived(KCallbackFlushComplete, KErrNone);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   576
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   577
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   578
    iErrorCondition = aError;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   579
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   580
    TInt err = Unload();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   581
    if (err)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   582
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   583
        DP0(DLINFO,"Commit failed during stopping");
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   584
        FinishWithError(err);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   585
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   586
    __ASSERT_DEBUG(err==KErrNone, Panic(ECommitFailedDuringStop));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   587
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   588
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   589
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   590
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   591
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   592
void CDevCommonControl::ContextEventErrorStateDevSoundAdaptorBeingPreempted() // from CDevCommonControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   593
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   594
    DP_CONTEXT(CDevCommonControl::ContextEventErrorStateDevSoundAdaptorBeingPreempted, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   595
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   596
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   597
__ASSERT_DEBUG(iDevAudio->iActiveStreamState == EInitialized, Panic(EStreamBeingDemotedToEIdle));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   598
    FinishWithError(KErrInUse);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   599
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   600
    if(iIgnoreAsyncOpComplete)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   601
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   602
        iAdaptationObserver->PreemptionFinishedCallbackReceived(ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   603
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   604
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   605
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   606
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   607
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   608
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   609
void CDevCommonControl::ContextEventUpdateWithoutStateEventNoError() // from CDevCommonControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   610
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   611
    DP_CONTEXT(CDevCommonControl::ContextEventUpdateWithoutStateEventNoError, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   612
    DP2_IN("iActiveState=%d iIgnoreAsyncOpComplete=%d",iDevAudio->iActiveState, iIgnoreAsyncOpComplete);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   613
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   614
    if (iDevAudio->iActiveState != EDevSoundAdaptorRemovingProcessingUnits)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   615
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   616
	    if (iIgnoreAsyncOpComplete)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   617
	      {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   618
	      iAdaptationObserver->PreemptionFinishedCallbackReceived(ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   619
	      iIgnoreAsyncOpComplete = EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   620
	      }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   621
	    else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   622
	      {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   623
	      iAdaptationObserver->AsynchronousOperationComplete(KErrNone, ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   624
	      }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   625
        DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   626
        return;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   627
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   628
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   629
    //If the Commit cycle when going into EDevSoundAdaptorRemovingProcessingUnits fails due to pre-emption
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   630
    //clash then we re-apply the client request again.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   631
    if (iDevAudio->iActiveState == EDevSoundAdaptorRemovingProcessingUnits && iIgnoreAsyncOpComplete)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   632
    	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   633
		//Pop front of queue to re-apply the request again via CMMFDevSoundSession::DequeueRequest
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   634
		//from the callback into CMMFDevSoundSession below:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   635
		iAdaptationObserver->PreemptionFinishedCallbackReceived(ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   636
		iIgnoreAsyncOpComplete = EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   637
		DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   638
		return;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   639
    	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   640
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   641
    iDevAudio->iActiveState = EDevSoundAdaptorCreated_Uninitialised;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   642
    
4
9d4397b300d1 2010wk44_01
hgs
parents: 0
diff changeset
   643
    // This will unregister audio callback observers in case they are registered again
9d4397b300d1 2010wk44_01
hgs
parents: 0
diff changeset
   644
    ContextEventStopDevSoundNotifications();
9d4397b300d1 2010wk44_01
hgs
parents: 0
diff changeset
   645
    
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   646
    if (iDevAudio->iReinitializing)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   647
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   648
        TInt err = iDevAudio->Initialize(iDevAudio->iTargetFormat, iDevAudio->iTargetMode);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   649
        if(err)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   650
            {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   651
            ContextEventAsynchronousInitializeComplete(err);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   652
            }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   653
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   654
        iDevAudio->iReinitializing = EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   655
        DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   656
        return;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   657
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   658
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   659
    iDevAudio->iClosing = EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   660
    iAdaptationObserver->AsynchronousOperationComplete(KErrNone, ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   661
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   662
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   663
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   664
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   665
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   666
void CDevCommonControl::ContextEventUpdateWithoutStateEventButWithError(TInt aError) // from CDevCommonControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   667
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   668
    DP_CONTEXT(CDevCommonControl::ContextEventUpdateWithoutStateEventButWithError, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   669
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   670
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   671
    //If flag is true below then it must be due to a stateless normal pre-emption or
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   672
    //stateless pre-emption clash scenario.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   673
    if(iIgnoreAsyncOpComplete)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   674
    	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   675
		//If we are in pre-emption clash then callback below will retry the client request again.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   676
		iAdaptationObserver->PreemptionFinishedCallbackReceived(ETrue); // notify client of end of cycle
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   677
		iIgnoreAsyncOpComplete = EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   678
    	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   679
    else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   680
    	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   681
        TDevSoundAdaptorState previousState = iDevAudio->iPreviousState;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   682
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   683
        DP3(DLINFO,"Error with no state change, state %d, previous %d, error %d during Commit cycle",
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   684
                    iDevAudio->iActiveState, previousState, aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   685
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   686
        // We can end up here for a number of reasons. For non "mid states", this is
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   687
        // a standard error scenario. For some mid-states (e.g. Activating, Loading etc),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   688
        // when we try and "promote" the state, this happens when the promotion is rejected
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   689
        // and we handle thus accordingly. For other mid-states the situation is less clear
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   690
        // and we call AsynchronousOperationComplete() with the error assuming the parent
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   691
        // session will deal with it. Whatever we don't want to stay in a mid-state, so
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   692
        // rewind to the previous ("normal") one if we are in one.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   693
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   694
        // Longer term TODO. If the code were refactored so that the InitializeComplete(),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   695
        // PlayError() etc callback came from AsynchronousOperationComplete() then the
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   696
        // following code might be simpler. Most of the time (at least) we get here because
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   697
        // we are doing a session function, and we can use the function to determine what
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   698
        // to do more easily than relying on the state. As it is, for some mid-states we
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   699
        // try and work out what error code to generate. Not clear this covers 100% cases,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   700
        // although demotion transitions should not fail, so the problem cases might not occur.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   701
        //
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   702
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   703
		//If we reach this condition then it is because of rejection/error during Commit cycle.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   704
		switch (iDevAudio->iActiveState)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   705
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   706
			case EDevSoundAdaptorInitialising:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   707
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   708
				iDevAudio->iActiveState = previousState;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   709
				ContextEventAsynchronousInitializeComplete(aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   710
				break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   711
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   712
			case EDevSoundAdaptorLoading:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   713
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   714
				iDevAudio->iActiveState = previousState;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   715
				ContextEventAsynchronousPlayCompletion(aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   716
				break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   717
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   718
			case EDevSoundAdaptorActivating:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   719
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   720
				iDevAudio->iActiveState = previousState;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   721
				ContextEventAsynchronousPlayCompletion(aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   722
				break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   723
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   724
			case EDevSoundAdaptorRemovingProcessingUnits:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   725
			case EDevSoundAdaptorUninitialising:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   726
			case EDevSoundAdaptorUnloading:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   727
			case EDevSoundAdaptorStopping:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   728
			case EDevSoundAdaptorPausing:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   729
			    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   730
                DP2(DLINFO,"Unexpected mid state [%d] when handling error [%d] during Commit cycle, workback", iDevAudio->iActiveState, aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   731
			    iDevAudio->iActiveState = previousState;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   732
                iAdaptationObserver->AsynchronousOperationComplete(aError, ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   733
			    break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   734
			    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   735
			default:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   736
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   737
				DP2(DLINFO,"Unexpected state [%d] when handling error [%d] during Commit cycle", iDevAudio->iActiveState, aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   738
		        iAdaptationObserver->AsynchronousOperationComplete(aError, ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   739
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   740
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   741
    	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   742
       
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   743
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   744
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   745
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   746
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   747
void CDevCommonControl::ContextEventUpdateWithStateEventNoError() // from CDevCommonControl 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   748
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   749
    DP_CONTEXT(CDevCommonControl::ContextEventUpdateWithStateEventNoError, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   750
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   751
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   752
    switch (iDevAudio->iActiveState)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   753
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   754
    case EDevSoundAdaptorUninitialising:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   755
        iDevAudio->iActiveState = EDevSoundAdaptorUnitialised_Uninitialised;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   756
        ContextEventStateDevSoundAdaptorUninitializing();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   757
        break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   758
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   759
    case EDevSoundAdaptorInitialising:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   760
        iDevAudio->iActiveState = EDevSoundAdaptorInitialised_Initialised;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   761
        ContextEventAsynchronousInitializeComplete(KErrNone);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   762
        break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   763
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   764
    case EDevSoundAdaptorUnloading:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   765
        iDevAudio->iActiveState = EDevSoundAdaptorInitialised_Initialised;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   766
        ContextEventStateDevSoundAdaptorUnloading();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   767
        break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   768
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   769
    case EDevSoundAdaptorLoading:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   770
        iDevAudio->iActiveState = EDevSoundAdaptorGoingActive;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   771
        ContextEventStateDevSoundAdaptorLoading();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   772
        break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   773
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   774
    case EDevSoundAdaptorStopping:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   775
        iDevAudio->iActiveState = EDevSoundAdaptorInitialised_Idle;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   776
        ContextEventStateDevSoundAdaptorStopping();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   777
        break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   778
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   779
    case EDevSoundAdaptorActivating:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   780
        iDevAudio->iActiveState = EDevSoundAdaptorActive_Active;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   781
        ContextEventPauseResumeSequenceDueToEmptyBuffers(EFalse);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   782
        break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   783
        
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   784
    case EDevSoundAdaptorPausing:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   785
        iDevAudio->iActiveState = EDevSoundAdaptorPaused_Primed;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   786
        ContextEventPauseResumeSequenceDueToEmptyBuffers(ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   787
        break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   788
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   789
    case EDevSoundAdaptorBeingPreempted:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   790
        iDevAudio->iActiveState = EDevSoundAdaptorInitialised_Initialised;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   791
        ContextEventStateDevSoundAdaptorBeingPreempted();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   792
        break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   793
        
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   794
    default:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   795
        break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   796
        }   
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   797
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   798
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   799
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   800
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   801
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   802
void CDevCommonControl::ContextEventUpdateWithStateEventAndError(TInt aError) // from CDevCommonControl
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   803
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   804
    DP_CONTEXT(CDevCommonControl::ContextEventUpdateWithStateEventAndError, CtxDevSound, DPLOCAL);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   805
    DP_IN();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   806
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   807
    DP1(DLERR,"ContextEventUpdateWithStateEventAndError error=%d", aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   808
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   809
    switch(iDevAudio->iActiveState)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   810
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   811
    case EDevSoundAdaptorInitialising:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   812
        iDevAudio->iActiveState = EDevSoundAdaptorCreated_Uninitialised;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   813
        iAdaptationObserver->InitializeComplete(aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   814
        break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   815
        
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   816
    case EDevSoundAdaptorLoading:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   817
        iDevAudio->iActiveState = EDevSoundAdaptorInitialised_Initialised;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   818
        FinishWithError(aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   819
        break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   820
        
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   821
    case EDevSoundAdaptorActivating:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   822
        iDevAudio->iActiveState = EDevSoundAdaptorInitialised_Idle;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   823
        ContextEventErrorStateDevSoundAdaptorActivating(aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   824
        break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   825
        
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   826
    case EDevSoundAdaptorBeingPreempted:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   827
        iDevAudio->iActiveState = EDevSoundAdaptorInitialised_Initialised;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   828
        ContextEventErrorStateDevSoundAdaptorBeingPreempted();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   829
        break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   830
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   831
    default:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   832
        break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   833
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   834
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   835
    iCallbackFromAdaptor = KCallbackNone;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   836
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   837
    if(!iIgnoreAsyncOpComplete)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   838
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   839
        iAdaptationObserver->AsynchronousOperationComplete(aError, ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   840
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   841
    else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   842
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   843
        iAdaptationObserver->PreemptionFinishedCallbackReceived(ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   844
        iIgnoreAsyncOpComplete=EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   845
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   846
    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   847
    DP_OUT();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   848
    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   849
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   850
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   851
// end of file