os/mm/devsound/devsoundrefplugin/src/platsec/SoundDevice/MmfDevSoundCallbackHandler.cpp
First public contribution.
1 // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
16 #include "SoundDeviceBody.h"
17 #include "MmfDevSoundCallbackHandler.h"
18 #include "MmfAudioClientServer.h"
20 CMsgQueueHandler* CMsgQueueHandler::NewL(RMMFDevSoundProxy* aDevSoundProxy,
21 MDevSoundObserver& aDevSoundObserver,
22 RMsgQueue<TMMFDevSoundQueueItem>* aMsgQueue,
23 MMMFDevSoundCustomInterfaceObserver& aDevSoundIntfcObserver)
25 CMsgQueueHandler* self = new(ELeave) CMsgQueueHandler(aDevSoundProxy, aDevSoundObserver, aMsgQueue, aDevSoundIntfcObserver);
26 CleanupStack::PushL(self);
32 void CMsgQueueHandler::SetObserver(MDevSoundObserver& aDevSoundObserver)
34 iDevSoundObserver = &aDevSoundObserver;
37 CMsgQueueHandler::CMsgQueueHandler(RMMFDevSoundProxy* aDevSoundProxy,
38 MDevSoundObserver& aDevSoundObserver,
39 RMsgQueue<TMMFDevSoundQueueItem>* aMsgQueue,
40 MMMFDevSoundCustomInterfaceObserver& aDevSoundIntfcObserver) :
41 CActive(EPriorityStandard), iDevSoundProxy(aDevSoundProxy),
42 iDevSoundObserver(&aDevSoundObserver), iMsgQueue(aMsgQueue), iDevSoundIntfcObserver(aDevSoundIntfcObserver)
44 CActiveScheduler::Add(this);
47 void CMsgQueueHandler::ConstructL()
51 CMsgQueueHandler::~CMsgQueueHandler()
58 void CMsgQueueHandler::ReceiveEvents()
60 iMsgQueue->NotifyDataAvailable(iStatus);
64 void CMsgQueueHandler::RunL()
66 TInt queueErr = iMsgQueue->Receive(iCurrentItem);
69 if (!queueErr || queueErr == KErrUnderflow)
71 // Signal that we're ready to process the next message
72 iMsgQueue->NotifyDataAvailable(iStatus);
78 iCurrentRequest = iCurrentItem.iRequest;
79 switch (iCurrentRequest)
81 case EMMFDevSoundProxyICEvent:
84 case EMMFDevSoundProxyBTBFEvent:
86 TRAP(err, DoBTBFCompleteL());
89 iDevSoundObserver->PlayError(err);
93 case EMMFDevSoundProxyBTBEEvent:
95 TRAP(err, DoBTBECompleteL());
98 iDevSoundObserver->RecordError(err);
102 case EMMFDevSoundProxyPEEvent:
103 DoPlayErrorComplete();
105 case EMMFDevSoundProxyREEvent:
106 DoRecordErrorComplete();
108 case EMMFDevSoundProxyTFEvent:
109 DoToneFinishedComplete();
111 case EMMFDevSoundProxySETCEvent:
112 DoSendEventToClientComplete();
114 case EMMFDevSoundCustomCommandCloseMuxDemuxPair:
116 TMMFEvent pckgevent = iCurrentItem.iEventPckg();
117 TInt handle = pckgevent.iEventType.iUid;
118 iDevSoundIntfcObserver.CloseCustomInterface(handle);
128 TInt CMsgQueueHandler::RunError(TInt aError)
131 event.iErrorCode = aError;
132 iDevSoundObserver->SendEventToClient(event);
136 void CMsgQueueHandler::DoCancel()
138 iMsgQueue->CancelDataAvailable();
141 void CMsgQueueHandler::DoInitComplete()
143 iDevSoundObserver->InitializeComplete(iCurrentItem.iErrorCode);
146 void CMsgQueueHandler::DoPlayErrorComplete()
148 iDevSoundObserver->PlayError(iCurrentItem.iErrorCode);
151 void CMsgQueueHandler::DoBTBFCompleteL()
153 // Wanted to push both the message request and the message's data
154 // through the queue in one go but the data is too large so try
155 // issuing a new request for the data before doing all this...
156 User::LeaveIfError(iDevSoundProxy->BufferToBeFilledData(iSetPckg));
158 TMMFDevSoundProxyHwBuf set;
159 set.iBufferType = iSetPckg().iBufferType;
160 set.iRequestSize = iSetPckg().iRequestSize;
161 set.iBufferSize = iSetPckg().iBufferSize;
162 set.iLastBuffer = iSetPckg().iLastBuffer;
164 CMMFDataBuffer* buffer = CMMFDescriptorBuffer::NewL(set.iBufferSize);
165 CleanupStack::PushL(buffer);
166 buffer->SetRequestSizeL(set.iRequestSize);
167 CleanupStack::Pop(buffer);
168 buffer->SetLastBuffer(set.iLastBuffer);
169 iDevSoundProxy->SetBuffer(buffer);//DevSoundProxy takes the ownership of "buffer"
171 iDevSoundObserver->BufferToBeFilled(buffer);
174 void CMsgQueueHandler::DoBTBECompleteL()
176 User::LeaveIfError(iDevSoundProxy->BufferToBeEmptiedData(iSetPckg));
178 TMMFDevSoundProxyHwBuf aSet;
179 aSet.iBufferType = iSetPckg().iBufferType;
180 aSet.iRequestSize = iSetPckg().iRequestSize;
181 aSet.iBufferSize = iSetPckg().iBufferSize;
182 aSet.iLastBuffer = iSetPckg().iLastBuffer;
189 iBuffer = CMMFDescriptorBuffer::NewL(aSet.iBufferSize);
190 iBuffer->SetRequestSizeL(aSet.iRequestSize);
191 iBuffer->SetLastBuffer(aSet.iLastBuffer);
193 User::LeaveIfError(iDevSoundProxy->GetRecordedBufferL(*iBuffer));
195 iDevSoundObserver->BufferToBeEmptied(iBuffer);
198 void CMsgQueueHandler::DoRecordErrorComplete()
200 iDevSoundObserver->RecordError(iCurrentItem.iErrorCode);
203 void CMsgQueueHandler::DoToneFinishedComplete()
205 iDevSoundObserver->ToneFinished(iCurrentItem.iErrorCode);
208 void CMsgQueueHandler::DoSendEventToClientComplete()
210 iDevSoundObserver->SendEventToClient(iCurrentItem.iEventPckg());