os/mm/devsound/devsoundrefplugin/src/platsec/SoundDevice/MmfDevSoundCallbackHandler.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
#include "SoundDeviceBody.h"
sl@0
    17
#include "MmfDevSoundCallbackHandler.h"
sl@0
    18
#include "MmfAudioClientServer.h"
sl@0
    19
sl@0
    20
CMsgQueueHandler* CMsgQueueHandler::NewL(RMMFDevSoundProxy* aDevSoundProxy,
sl@0
    21
										 MDevSoundObserver& aDevSoundObserver,
sl@0
    22
										 RMsgQueue<TMMFDevSoundQueueItem>* aMsgQueue,
sl@0
    23
										 MMMFDevSoundCustomInterfaceObserver& aDevSoundIntfcObserver)
sl@0
    24
	{
sl@0
    25
	CMsgQueueHandler* self = new(ELeave) CMsgQueueHandler(aDevSoundProxy, aDevSoundObserver, aMsgQueue, aDevSoundIntfcObserver);
sl@0
    26
	CleanupStack::PushL(self);
sl@0
    27
	self->ConstructL();
sl@0
    28
	CleanupStack::Pop();
sl@0
    29
	return self;
sl@0
    30
	}
sl@0
    31
sl@0
    32
void CMsgQueueHandler::SetObserver(MDevSoundObserver& aDevSoundObserver)
sl@0
    33
	{
sl@0
    34
	iDevSoundObserver = &aDevSoundObserver;
sl@0
    35
	}
sl@0
    36
sl@0
    37
CMsgQueueHandler::CMsgQueueHandler(RMMFDevSoundProxy* aDevSoundProxy,
sl@0
    38
								   MDevSoundObserver& aDevSoundObserver,
sl@0
    39
								   RMsgQueue<TMMFDevSoundQueueItem>* aMsgQueue,
sl@0
    40
								   MMMFDevSoundCustomInterfaceObserver& aDevSoundIntfcObserver) :
sl@0
    41
								   CActive(EPriorityStandard), iDevSoundProxy(aDevSoundProxy),
sl@0
    42
								   iDevSoundObserver(&aDevSoundObserver), iMsgQueue(aMsgQueue), iDevSoundIntfcObserver(aDevSoundIntfcObserver)
sl@0
    43
	{
sl@0
    44
	CActiveScheduler::Add(this);
sl@0
    45
	}
sl@0
    46
sl@0
    47
void CMsgQueueHandler::ConstructL()
sl@0
    48
	{
sl@0
    49
	}
sl@0
    50
sl@0
    51
CMsgQueueHandler::~CMsgQueueHandler()
sl@0
    52
	{
sl@0
    53
	delete iBuffer;
sl@0
    54
	Cancel();
sl@0
    55
	iMsgQueue->Close();
sl@0
    56
	}
sl@0
    57
sl@0
    58
void CMsgQueueHandler::ReceiveEvents()
sl@0
    59
	{
sl@0
    60
	iMsgQueue->NotifyDataAvailable(iStatus);
sl@0
    61
	SetActive();
sl@0
    62
	}
sl@0
    63
sl@0
    64
void CMsgQueueHandler::RunL()
sl@0
    65
	{
sl@0
    66
	TInt queueErr = iMsgQueue->Receive(iCurrentItem);	
sl@0
    67
	TInt err = KErrNone;
sl@0
    68
sl@0
    69
	if (!queueErr || queueErr == KErrUnderflow)
sl@0
    70
		{
sl@0
    71
		// Signal that we're ready to process the next message
sl@0
    72
		iMsgQueue->NotifyDataAvailable(iStatus);
sl@0
    73
		SetActive();							
sl@0
    74
		}
sl@0
    75
sl@0
    76
	if (!queueErr)
sl@0
    77
		{	
sl@0
    78
		iCurrentRequest = iCurrentItem.iRequest;
sl@0
    79
		switch (iCurrentRequest)
sl@0
    80
			{
sl@0
    81
			case EMMFDevSoundProxyICEvent:
sl@0
    82
				DoInitComplete();
sl@0
    83
				break;
sl@0
    84
			case EMMFDevSoundProxyBTBFEvent:
sl@0
    85
				{
sl@0
    86
				TRAP(err, DoBTBFCompleteL());
sl@0
    87
				if (err)
sl@0
    88
					{
sl@0
    89
					iDevSoundObserver->PlayError(err);
sl@0
    90
					}
sl@0
    91
				}
sl@0
    92
				break;
sl@0
    93
			case EMMFDevSoundProxyBTBEEvent:
sl@0
    94
				{
sl@0
    95
				TRAP(err, DoBTBECompleteL());
sl@0
    96
				if (err)
sl@0
    97
					{
sl@0
    98
					iDevSoundObserver->RecordError(err);
sl@0
    99
					}
sl@0
   100
				}
sl@0
   101
				break;					
sl@0
   102
			case EMMFDevSoundProxyPEEvent:
sl@0
   103
				DoPlayErrorComplete();
sl@0
   104
				break;
sl@0
   105
			case EMMFDevSoundProxyREEvent:
sl@0
   106
				DoRecordErrorComplete();
sl@0
   107
				break;
sl@0
   108
			case EMMFDevSoundProxyTFEvent:
sl@0
   109
				DoToneFinishedComplete();
sl@0
   110
				break;
sl@0
   111
			case EMMFDevSoundProxySETCEvent:
sl@0
   112
				DoSendEventToClientComplete();
sl@0
   113
				break;
sl@0
   114
			case EMMFDevSoundCustomCommandCloseMuxDemuxPair:
sl@0
   115
				{
sl@0
   116
				TMMFEvent pckgevent = iCurrentItem.iEventPckg();
sl@0
   117
				TInt handle = pckgevent.iEventType.iUid;
sl@0
   118
				iDevSoundIntfcObserver.CloseCustomInterface(handle);
sl@0
   119
				}
sl@0
   120
				break;
sl@0
   121
			default:
sl@0
   122
				break;
sl@0
   123
			}
sl@0
   124
		
sl@0
   125
		}
sl@0
   126
	}
sl@0
   127
sl@0
   128
TInt CMsgQueueHandler::RunError(TInt aError)
sl@0
   129
	{
sl@0
   130
	TMMFEvent event;
sl@0
   131
	event.iErrorCode = aError;
sl@0
   132
	iDevSoundObserver->SendEventToClient(event);
sl@0
   133
	return KErrNone;
sl@0
   134
	}
sl@0
   135
	
sl@0
   136
void CMsgQueueHandler::DoCancel()
sl@0
   137
	{
sl@0
   138
	iMsgQueue->CancelDataAvailable();
sl@0
   139
	}
sl@0
   140
sl@0
   141
void CMsgQueueHandler::DoInitComplete()
sl@0
   142
	{
sl@0
   143
	iDevSoundObserver->InitializeComplete(iCurrentItem.iErrorCode);
sl@0
   144
	}
sl@0
   145
sl@0
   146
void CMsgQueueHandler::DoPlayErrorComplete()
sl@0
   147
	{
sl@0
   148
	iDevSoundObserver->PlayError(iCurrentItem.iErrorCode);
sl@0
   149
	}
sl@0
   150
sl@0
   151
void CMsgQueueHandler::DoBTBFCompleteL()
sl@0
   152
	{
sl@0
   153
	// Wanted to push both the message request and the message's data
sl@0
   154
	// through the queue in one go but the data is too large so try
sl@0
   155
	// issuing a new request for the data before doing all this...
sl@0
   156
	User::LeaveIfError(iDevSoundProxy->BufferToBeFilledData(iSetPckg));
sl@0
   157
	
sl@0
   158
	TMMFDevSoundProxyHwBuf set;
sl@0
   159
	set.iBufferType = iSetPckg().iBufferType;
sl@0
   160
	set.iRequestSize = iSetPckg().iRequestSize;
sl@0
   161
	set.iBufferSize = iSetPckg().iBufferSize;
sl@0
   162
	set.iLastBuffer = iSetPckg().iLastBuffer;
sl@0
   163
sl@0
   164
	CMMFDataBuffer* buffer = CMMFDescriptorBuffer::NewL(set.iBufferSize);
sl@0
   165
	CleanupStack::PushL(buffer);
sl@0
   166
	buffer->SetRequestSizeL(set.iRequestSize);
sl@0
   167
	CleanupStack::Pop(buffer);
sl@0
   168
	buffer->SetLastBuffer(set.iLastBuffer);
sl@0
   169
	iDevSoundProxy->SetBuffer(buffer);//DevSoundProxy takes the ownership of "buffer"
sl@0
   170
sl@0
   171
	iDevSoundObserver->BufferToBeFilled(buffer);
sl@0
   172
	}
sl@0
   173
sl@0
   174
void CMsgQueueHandler::DoBTBECompleteL()
sl@0
   175
	{
sl@0
   176
	User::LeaveIfError(iDevSoundProxy->BufferToBeEmptiedData(iSetPckg));
sl@0
   177
	
sl@0
   178
	TMMFDevSoundProxyHwBuf aSet;
sl@0
   179
	aSet.iBufferType = iSetPckg().iBufferType;
sl@0
   180
	aSet.iRequestSize = iSetPckg().iRequestSize;
sl@0
   181
	aSet.iBufferSize = iSetPckg().iBufferSize;
sl@0
   182
	aSet.iLastBuffer = iSetPckg().iLastBuffer;
sl@0
   183
sl@0
   184
	if(iBuffer)
sl@0
   185
		{
sl@0
   186
		delete iBuffer;
sl@0
   187
		iBuffer = NULL;
sl@0
   188
		}
sl@0
   189
	iBuffer = CMMFDescriptorBuffer::NewL(aSet.iBufferSize);
sl@0
   190
	iBuffer->SetRequestSizeL(aSet.iRequestSize);
sl@0
   191
	iBuffer->SetLastBuffer(aSet.iLastBuffer);
sl@0
   192
	
sl@0
   193
	User::LeaveIfError(iDevSoundProxy->GetRecordedBufferL(*iBuffer));  
sl@0
   194
sl@0
   195
	iDevSoundObserver->BufferToBeEmptied(iBuffer);
sl@0
   196
	}
sl@0
   197
sl@0
   198
void CMsgQueueHandler::DoRecordErrorComplete()
sl@0
   199
	{
sl@0
   200
	iDevSoundObserver->RecordError(iCurrentItem.iErrorCode);
sl@0
   201
	}
sl@0
   202
	
sl@0
   203
void CMsgQueueHandler::DoToneFinishedComplete()
sl@0
   204
	{
sl@0
   205
	iDevSoundObserver->ToneFinished(iCurrentItem.iErrorCode);
sl@0
   206
	}
sl@0
   207
	
sl@0
   208
void CMsgQueueHandler::DoSendEventToClientComplete()
sl@0
   209
	{
sl@0
   210
	iDevSoundObserver->SendEventToClient(iCurrentItem.iEventPckg());	
sl@0
   211
	}