|
1 /* |
|
2 * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: VOIP Audio Services Downlink stream APIs. |
|
15 * |
|
16 */ |
|
17 |
|
18 #include <e32base.h> |
|
19 #include <mmffourcc.h> |
|
20 #include <voipdatabuffer.h> |
|
21 #include "debugtracemacros.h" |
|
22 #include "VoIPAudioSession.h" |
|
23 #include "VoIPAudioClientServer.h" |
|
24 #include "VoIPFormatIntfcImpl.h" |
|
25 #include "VoIPBaseCodecIntfcImpl.h" |
|
26 #include "VoIPILBCDecoderIntfcImpl.h" |
|
27 #include "VoIPG711DecoderIntfcImpl.h" |
|
28 #include "VoIPG729DecoderIntfcImpl.h" |
|
29 #include "VoIPJitterBufferIntfcImpl.h" |
|
30 #include "VoIPSharedData.h" |
|
31 #include "VoIPDownlinkStreamImpl.h" |
|
32 |
|
33 // --------------------------------------------------------------------------- |
|
34 // CVoIPAudioDownlinkStreamImpl::NewL |
|
35 // --------------------------------------------------------------------------- |
|
36 // |
|
37 CVoIPAudioDownlinkStreamImpl* |
|
38 CVoIPAudioDownlinkStreamImpl::NewL(const TMMFPrioritySettings aPriority) |
|
39 { |
|
40 CVoIPAudioDownlinkStreamImpl* self = |
|
41 new (ELeave) CVoIPAudioDownlinkStreamImpl(); |
|
42 CleanupStack::PushL(self); |
|
43 self->ConstructL(aPriority); |
|
44 CleanupStack::Pop(self); |
|
45 return self; |
|
46 } |
|
47 |
|
48 // --------------------------------------------------------------------------- |
|
49 // CVoIPAudioDownlinkStreamImpl::~CVoIPAudioDownlinkStreamImpl |
|
50 // --------------------------------------------------------------------------- |
|
51 // |
|
52 CVoIPAudioDownlinkStreamImpl::~CVoIPAudioDownlinkStreamImpl() |
|
53 { |
|
54 Close(); |
|
55 |
|
56 if (iMsgQHandler) |
|
57 { |
|
58 iMsgQHandler->Cancel(); |
|
59 delete iMsgQHandler; |
|
60 } |
|
61 |
|
62 if (iMsgQComHandler) |
|
63 { |
|
64 iMsgQComHandler->Cancel(); |
|
65 delete iMsgQComHandler; |
|
66 } |
|
67 |
|
68 if (iMsgQueue.Handle() > 0) |
|
69 { |
|
70 iMsgQueue.Close(); |
|
71 } |
|
72 |
|
73 if (iMsgComQueue.Handle() > 0) |
|
74 { |
|
75 iMsgComQueue.Close(); |
|
76 } |
|
77 |
|
78 if (iVoIPAudioSession.Handle() > 0) |
|
79 { |
|
80 iVoIPAudioSession.Close(); |
|
81 } |
|
82 } |
|
83 |
|
84 // --------------------------------------------------------------------------- |
|
85 // CVoIPAudioDownlinkStreamImpl::CVoIPAudioDownlinkStreamImpl |
|
86 // --------------------------------------------------------------------------- |
|
87 // |
|
88 CVoIPAudioDownlinkStreamImpl::CVoIPAudioDownlinkStreamImpl() : |
|
89 iBufferPtr(0, 0, 0) |
|
90 { |
|
91 } |
|
92 |
|
93 // --------------------------------------------------------------------------- |
|
94 // CVoIPAudioDownlinkStreamImpl::ConstructL |
|
95 // --------------------------------------------------------------------------- |
|
96 // |
|
97 void CVoIPAudioDownlinkStreamImpl::ConstructL( |
|
98 const TMMFPrioritySettings aPriority) |
|
99 { |
|
100 // Pass ownership to the parent class |
|
101 CVoIPAudioDownlinkStream::ConstructL(this); |
|
102 iPriority = aPriority; |
|
103 iG711FrameSize = KVoIPG711FrameLen20ms; |
|
104 iFormat = EG711; |
|
105 TInt err = iVoIPAudioSession.Connect(); |
|
106 User::LeaveIfError(err); |
|
107 } |
|
108 |
|
109 // --------------------------------------------------------------------------- |
|
110 // CVoIPAudioDownlinkStreamImpl::Open |
|
111 // --------------------------------------------------------------------------- |
|
112 // |
|
113 TInt CVoIPAudioDownlinkStreamImpl::Open(MVoIPDownlinkObserver& aObserver) |
|
114 { |
|
115 iObserver = &aObserver; |
|
116 |
|
117 TInt err = CreateQueue(KDnLinkQueue, KVoIPMsgQSlots, EMsgBufQueue); |
|
118 |
|
119 if (err == KErrNone) |
|
120 { |
|
121 err = CreateQueue(KDnLinkComQueue, KVoIPMsgComQSlots, EMsgComQueue); |
|
122 } |
|
123 |
|
124 if (err == KErrNone) |
|
125 { |
|
126 err = iVoIPAudioSession.OpenDownlink(iPriority); |
|
127 } |
|
128 |
|
129 return err; |
|
130 } |
|
131 |
|
132 // --------------------------------------------------------------------------- |
|
133 // CVoIPAudioDownlinkStreamImpl::GetVersion |
|
134 // Returns version of this component. |
|
135 // --------------------------------------------------------------------------- |
|
136 // |
|
137 TInt CVoIPAudioDownlinkStreamImpl::GetVersion(TVersion& aVersion) |
|
138 { |
|
139 aVersion = TVersion(1, 0, 0); |
|
140 return KErrNone; |
|
141 } |
|
142 |
|
143 // --------------------------------------------------------------------------- |
|
144 // CVoIPAudioDownlinkStreamImpl::GetMaxVolume |
|
145 // --------------------------------------------------------------------------- |
|
146 // |
|
147 TInt CVoIPAudioDownlinkStreamImpl::GetMaxVolume(TInt& aVolume) |
|
148 { |
|
149 aVolume = iVoIPAudioSession.GetMaxVolume(); |
|
150 return KErrNone; |
|
151 } |
|
152 |
|
153 // --------------------------------------------------------------------------- |
|
154 // CVoIPAudioDownlinkStreamImpl::SetVolume |
|
155 // --------------------------------------------------------------------------- |
|
156 // |
|
157 TInt CVoIPAudioDownlinkStreamImpl::SetVolume(TInt aVolume) |
|
158 { |
|
159 TInt err = iVoIPAudioSession.SetVolume(aVolume); |
|
160 return err; |
|
161 } |
|
162 |
|
163 // --------------------------------------------------------------------------- |
|
164 // CVoIPAudioDownlinkStreamImpl::GetVolume |
|
165 // --------------------------------------------------------------------------- |
|
166 // |
|
167 TInt CVoIPAudioDownlinkStreamImpl::GetVolume(TInt& aVolume) |
|
168 { |
|
169 aVolume = iVoIPAudioSession.GetVolume(); |
|
170 return KErrNone; |
|
171 } |
|
172 |
|
173 // --------------------------------------------------------------------------- |
|
174 // CVoIPAudioDownlinkStreamImpl::GetSupportedFormatsL |
|
175 // --------------------------------------------------------------------------- |
|
176 // |
|
177 void CVoIPAudioDownlinkStreamImpl::GetSupportedFormatsL( |
|
178 const TMMFPrioritySettings aPriority, |
|
179 RArray<TVoIPCodecFormat>& aFormats) |
|
180 { |
|
181 if (!iCodecFormats || aFormats.Count() <= 0) |
|
182 { |
|
183 RArray<TUint32> codecIDs; |
|
184 CleanupClosePushL(codecIDs); |
|
185 codecIDs.Reset(); |
|
186 iVoIPAudioSession.GetSupportedDecoders(aPriority, codecIDs, |
|
187 iG711FrameSize); |
|
188 |
|
189 TUint32 codec = 0; |
|
190 TInt count = codecIDs.Count(); |
|
191 TVoIPCodecFormat format; |
|
192 aFormats.Reset(); |
|
193 |
|
194 for (TInt i = 0; i < count; i++) |
|
195 { |
|
196 codec = codecIDs[i]; |
|
197 |
|
198 #ifdef _DEBUG |
|
199 TInt8 a = codec; |
|
200 TInt8 b = codec >> 8; |
|
201 TInt8 c = codec >> 16; |
|
202 TInt8 d = codec >> 24; |
|
203 RDebug::Print(_L("%c%c%c%c"), a, b, c, d); |
|
204 #endif |
|
205 format = ConvertFourCC(codec); |
|
206 if (format != ENULL) |
|
207 { |
|
208 aFormats.Append(format); |
|
209 } |
|
210 } |
|
211 |
|
212 iCodecFormats = &aFormats; |
|
213 CleanupStack::PopAndDestroy(&codecIDs); |
|
214 } |
|
215 } |
|
216 |
|
217 // --------------------------------------------------------------------------- |
|
218 // CVoIPAudioDownlinkStreamImpl::SetFormatL |
|
219 // --------------------------------------------------------------------------- |
|
220 // |
|
221 void CVoIPAudioDownlinkStreamImpl::SetFormatL(TVoIPCodecFormat aFormat, |
|
222 CVoIPFormatIntfc*& aIntfc) |
|
223 { |
|
224 // Check if requested codec is on the list of supported codecs |
|
225 if (!IsCodecSupportedL(aFormat)) |
|
226 { |
|
227 iFormat = ENULL; |
|
228 } |
|
229 |
|
230 // TODO: reuse when switching codecs on the fly and same codec is selected |
|
231 delete aIntfc; |
|
232 aIntfc = NULL; |
|
233 |
|
234 switch (iFormat) |
|
235 { |
|
236 case EG711: |
|
237 case EG711_10MS: |
|
238 { |
|
239 aIntfc = CVoIPG711DecoderIntfcImpl::NewL(this); |
|
240 iBufferLen = iG711FrameSize; |
|
241 break; |
|
242 } |
|
243 case EG729: |
|
244 { |
|
245 aIntfc = CVoIPG729DecoderIntfcImpl::NewL(this); |
|
246 iBufferLen = KVoIPG729FrameLen; |
|
247 break; |
|
248 } |
|
249 case EILBC: |
|
250 { |
|
251 aIntfc = CVoIPILBCDecoderIntfcImpl::NewL(this); |
|
252 iBufferLen = KVoIPILBCFrameLen; |
|
253 break; |
|
254 } |
|
255 case EAMR_NB: |
|
256 { |
|
257 aIntfc = CVoIPBaseCodecIntfcImpl::NewL(this); |
|
258 iBufferLen = KVoIPAMRNBFrameLen; |
|
259 break; |
|
260 } |
|
261 case EPCM16: |
|
262 { |
|
263 aIntfc = CVoIPBaseCodecIntfcImpl::NewL(this); |
|
264 iBufferLen = KVoIPPCM16FrameLen; |
|
265 break; |
|
266 } |
|
267 default: |
|
268 { |
|
269 iFormat = ENULL; |
|
270 iBufferLen = 0; |
|
271 User::Leave(KErrNotSupported); |
|
272 } |
|
273 } |
|
274 |
|
275 TUint32 codecFourCC = CodecFourCC(iFormat); |
|
276 iVoIPAudioSession.SetDecoder(codecFourCC); |
|
277 } |
|
278 |
|
279 // --------------------------------------------------------------------------- |
|
280 // CVoIPAudioDownlinkStreamImpl::GetFormat |
|
281 // --------------------------------------------------------------------------- |
|
282 // |
|
283 TVoIPCodecFormat CVoIPAudioDownlinkStreamImpl::GetFormat() |
|
284 { |
|
285 return iFormat; |
|
286 } |
|
287 |
|
288 // --------------------------------------------------------------------------- |
|
289 // CVoIPAudioDownlinkStreamImpl::SetAudioDevice |
|
290 // --------------------------------------------------------------------------- |
|
291 // |
|
292 TInt CVoIPAudioDownlinkStreamImpl::SetAudioDevice( |
|
293 const TVoIPOutputDevice aDevice) |
|
294 { |
|
295 TInt err = iVoIPAudioSession.SetAudioDevice(aDevice); |
|
296 return err; |
|
297 } |
|
298 |
|
299 // --------------------------------------------------------------------------- |
|
300 // CVoIPAudioDownlinkStreamImpl::GetAudioDevice |
|
301 // --------------------------------------------------------------------------- |
|
302 // |
|
303 TInt CVoIPAudioDownlinkStreamImpl::GetAudioDevice(TVoIPOutputDevice& aDevice) |
|
304 { |
|
305 TInt err = iVoIPAudioSession.GetAudioDevice(aDevice); |
|
306 return err; |
|
307 } |
|
308 |
|
309 // --------------------------------------------------------------------------- |
|
310 // CVoIPAudioDownlinkStreamImpl::Start |
|
311 // --------------------------------------------------------------------------- |
|
312 // |
|
313 TInt CVoIPAudioDownlinkStreamImpl::Start() |
|
314 { |
|
315 TInt err = iVoIPAudioSession.StartDownlink(); |
|
316 return err; |
|
317 } |
|
318 |
|
319 // --------------------------------------------------------------------------- |
|
320 // CVoIPAudioDownlinkStreamImpl::Stop |
|
321 // --------------------------------------------------------------------------- |
|
322 // |
|
323 TInt CVoIPAudioDownlinkStreamImpl::Stop() |
|
324 { |
|
325 TInt err = iVoIPAudioSession.StopDownlink(); |
|
326 return err; |
|
327 } |
|
328 |
|
329 // --------------------------------------------------------------------------- |
|
330 // CVoIPAudioDownlinkStreamImpl::Close |
|
331 // --------------------------------------------------------------------------- |
|
332 // |
|
333 void CVoIPAudioDownlinkStreamImpl::Close() |
|
334 { |
|
335 iVoIPAudioSession.CloseDownlink(); |
|
336 } |
|
337 |
|
338 // --------------------------------------------------------------------------- |
|
339 // CVoIPAudioDownlinkStreamImpl::BufferFilled |
|
340 // --------------------------------------------------------------------------- |
|
341 // |
|
342 TInt CVoIPAudioDownlinkStreamImpl::BufferFilled(CVoIPDataBuffer* aBuffer) |
|
343 { |
|
344 TUint bufSeq = 0; |
|
345 aBuffer->GetPayloadPtr(iBufferPtr); |
|
346 CVoIPDataBuffer::TVoIPBufferType type; |
|
347 aBuffer->GetBufferType(type); |
|
348 |
|
349 if (type == CVoIPDataBuffer::EJitterBuffer) |
|
350 { |
|
351 static_cast<CVoIPJBDataBuffer*> (aBuffer)->GetBufferSequence(bufSeq); |
|
352 } |
|
353 |
|
354 TInt err = iVoIPAudioSession.BufferFilled(iBufferPtr, bufSeq); |
|
355 return err; |
|
356 } |
|
357 |
|
358 // --------------------------------------------------------------------------- |
|
359 // CVoIPAudioDownlinkStreamImpl::CreateJitterBufferIntfcL |
|
360 // --------------------------------------------------------------------------- |
|
361 // |
|
362 void CVoIPAudioDownlinkStreamImpl::CreateJitterBufferIntfcL( |
|
363 CVoIPJitterBufferIntfc*& aJBIntfc) |
|
364 { |
|
365 aJBIntfc = CVoIPJitterBufferIntfcImpl::NewL(&iVoIPAudioSession); |
|
366 } |
|
367 |
|
368 // --------------------------------------------------------------------------- |
|
369 // CVoIPAudioDownlinkStreamImpl::GetSession |
|
370 // --------------------------------------------------------------------------- |
|
371 // |
|
372 RVoIPAudioSession* CVoIPAudioDownlinkStreamImpl::GetSession() |
|
373 { |
|
374 return &iVoIPAudioSession; |
|
375 } |
|
376 |
|
377 // --------------------------------------------------------------------------- |
|
378 // CVoIPAudioStream::CreateQueue |
|
379 // --------------------------------------------------------------------------- |
|
380 // |
|
381 TInt CVoIPAudioDownlinkStreamImpl::CreateQueue(const TDesC& aQueueName, |
|
382 const TInt aNumSlots, const TQueueType aQueueType) |
|
383 { |
|
384 TInt err = KErrNone; |
|
385 |
|
386 if (aQueueType == EMsgBufQueue) |
|
387 { |
|
388 if (iMsgQueue.Handle() <= 0) |
|
389 { |
|
390 err = iMsgQueue.CreateGlobal(aQueueName, aNumSlots); |
|
391 if (err != KErrNone) |
|
392 { |
|
393 return err; |
|
394 } |
|
395 } |
|
396 |
|
397 TRAP(err, ReceiveMsgQHandlerEventsL()); |
|
398 } |
|
399 else if (aQueueType == EMsgComQueue) |
|
400 { |
|
401 if (iMsgComQueue.Handle() <= 0) |
|
402 { |
|
403 err = iMsgComQueue.CreateGlobal(aQueueName, aNumSlots); |
|
404 if (err != KErrNone) |
|
405 { |
|
406 return err; |
|
407 } |
|
408 } |
|
409 |
|
410 TRAP(err, ReceiveMsgQComHandlerEventsL()); |
|
411 } |
|
412 |
|
413 return err; |
|
414 } |
|
415 |
|
416 // --------------------------------------------------------------------------- |
|
417 // CVoIPAudioStream::ReceiveMsgQHandlerEventsL |
|
418 // Starts message queue handler (A/O) to monitor server side events |
|
419 // --------------------------------------------------------------------------- |
|
420 // |
|
421 void CVoIPAudioDownlinkStreamImpl::ReceiveMsgQHandlerEventsL() |
|
422 { |
|
423 if (iMsgQHandler) |
|
424 { |
|
425 iMsgQHandler->Cancel(); |
|
426 } |
|
427 else |
|
428 { |
|
429 iMsgQHandler = CQueueHandler::NewL(this, &iMsgQueue, iBufferLen); |
|
430 } |
|
431 |
|
432 iMsgQHandler->Start(); |
|
433 } |
|
434 |
|
435 // --------------------------------------------------------------------------- |
|
436 // CVoIPAudioStream::ReceiveMsgQComHandlerEventsL |
|
437 // Starts message queue handler (A/O) to monitor server side events |
|
438 // --------------------------------------------------------------------------- |
|
439 // |
|
440 void CVoIPAudioDownlinkStreamImpl::ReceiveMsgQComHandlerEventsL() |
|
441 { |
|
442 if (iMsgQComHandler) |
|
443 { |
|
444 iMsgQComHandler->Cancel(); |
|
445 } |
|
446 else |
|
447 { |
|
448 iMsgQComHandler = CQueueHandler::NewL(this, &iMsgComQueue); |
|
449 } |
|
450 |
|
451 iMsgQComHandler->Start(); |
|
452 } |
|
453 |
|
454 // --------------------------------------------------------------------------- |
|
455 // CVoIPAudioStream::CodecFourCC |
|
456 // --------------------------------------------------------------------------- |
|
457 // |
|
458 TUint32 CVoIPAudioDownlinkStreamImpl::CodecFourCC(TVoIPCodecFormat aFormat) |
|
459 { |
|
460 TUint32 codecFourCC; |
|
461 |
|
462 switch (aFormat) |
|
463 { |
|
464 case EG711_10MS: |
|
465 case EG711: |
|
466 { |
|
467 codecFourCC = KMccFourCCIdG711; |
|
468 break; |
|
469 } |
|
470 case EG729: |
|
471 { |
|
472 codecFourCC = KMccFourCCIdG729; |
|
473 break; |
|
474 } |
|
475 case EILBC: |
|
476 { |
|
477 codecFourCC = KMccFourCCIdILBC; |
|
478 break; |
|
479 } |
|
480 case EAMR_NB: |
|
481 { |
|
482 codecFourCC = KMccFourCCIdAMRNB; |
|
483 break; |
|
484 } |
|
485 case EPCM16: |
|
486 { |
|
487 codecFourCC = KMMFFourCCCodePCM16; |
|
488 break; |
|
489 } |
|
490 default: |
|
491 { |
|
492 codecFourCC = KFourCCNULL; |
|
493 } |
|
494 } |
|
495 |
|
496 return codecFourCC; |
|
497 } |
|
498 |
|
499 // ----------------------------------------------------------------------------- |
|
500 // CVoIPAudioDownlinkStreamImpl::ConvertFourCC |
|
501 // ----------------------------------------------------------------------------- |
|
502 // |
|
503 TVoIPCodecFormat CVoIPAudioDownlinkStreamImpl::ConvertFourCC(TUint32 aCodec) |
|
504 { |
|
505 TVoIPCodecFormat format; |
|
506 |
|
507 switch (aCodec) |
|
508 { |
|
509 case KMccFourCCIdG711: |
|
510 { |
|
511 if (iG711FrameSize == KVoIPG711FrameLen10ms) |
|
512 { |
|
513 format = EG711_10MS; |
|
514 TRACE_PRN_N(_L("VoIP->DNL: G711 10ms frame rate detected")); |
|
515 } |
|
516 else |
|
517 { |
|
518 format = EG711; |
|
519 } |
|
520 break; |
|
521 } |
|
522 case KMccFourCCIdG729: |
|
523 format = EG729; |
|
524 break; |
|
525 case KMccFourCCIdILBC: |
|
526 format = EILBC; |
|
527 break; |
|
528 case KMccFourCCIdAMRNB: |
|
529 format = EAMR_NB; |
|
530 break; |
|
531 case KMMFFourCCCodePCM16: |
|
532 format = EPCM16; |
|
533 break; |
|
534 default: |
|
535 format = ENULL; |
|
536 break; |
|
537 } |
|
538 |
|
539 return format; |
|
540 } |
|
541 |
|
542 // ----------------------------------------------------------------------------- |
|
543 // CVoIPAudioDownlinkStreamImpl::IsCodecSupportedL |
|
544 // ----------------------------------------------------------------------------- |
|
545 // |
|
546 TBool CVoIPAudioDownlinkStreamImpl::IsCodecSupportedL( |
|
547 TVoIPCodecFormat aFormat) |
|
548 { |
|
549 TBool status = EFalse; |
|
550 |
|
551 if (!iCodecFormats) |
|
552 { |
|
553 // Client hasn't called GetSupportedFormatsL |
|
554 RArray<TVoIPCodecFormat> codecs; |
|
555 CleanupClosePushL(codecs); |
|
556 codecs.Reset(); |
|
557 GetSupportedFormatsL(iPriority, codecs); //sets iCodecFormats |
|
558 status = FindFormat(aFormat); |
|
559 CleanupStack::PopAndDestroy(&codecs); |
|
560 iCodecFormats = NULL; |
|
561 } |
|
562 else |
|
563 { |
|
564 status = FindFormat(aFormat); |
|
565 } |
|
566 |
|
567 return status; |
|
568 } |
|
569 |
|
570 // ----------------------------------------------------------------------------- |
|
571 // CVoIPAudioDownlinkStreamImpl::FindFormat |
|
572 // ----------------------------------------------------------------------------- |
|
573 // |
|
574 TBool CVoIPAudioDownlinkStreamImpl::FindFormat(TVoIPCodecFormat aFormat) |
|
575 { |
|
576 TBool found = EFalse; |
|
577 |
|
578 if (iCodecFormats) |
|
579 { |
|
580 if (iCodecFormats->Count() > 0) |
|
581 { |
|
582 if (iCodecFormats->Find(aFormat) == KErrNotFound) |
|
583 { |
|
584 // For backward compatibility with VAS 1.0 |
|
585 if (aFormat == EG711) |
|
586 { |
|
587 if (iCodecFormats->Find(EG711_10MS) != KErrNotFound) |
|
588 { |
|
589 iFormat = EG711_10MS; |
|
590 found = ETrue; |
|
591 } |
|
592 } |
|
593 } |
|
594 else |
|
595 { |
|
596 iFormat = aFormat; |
|
597 found = ETrue; |
|
598 } |
|
599 } |
|
600 } |
|
601 |
|
602 return found; |
|
603 } |
|
604 |
|
605 // ======== CALLBACK FUNCTIONS ======== |
|
606 |
|
607 // --------------------------------------------------------------------------- |
|
608 // CVoIPAudioDownlinkStreamImpl::FillBuffer |
|
609 // From MQueueHandlerObserver |
|
610 // --------------------------------------------------------------------------- |
|
611 // |
|
612 void CVoIPAudioDownlinkStreamImpl::FillBuffer(CVoIPDataBuffer* aBuffer) |
|
613 { |
|
614 iObserver->FillBuffer(*this, aBuffer); |
|
615 } |
|
616 |
|
617 // --------------------------------------------------------------------------- |
|
618 // CVoIPAudioDownlinkStreamImpl::Event |
|
619 // From MQueueHandlerObserver |
|
620 // --------------------------------------------------------------------------- |
|
621 // |
|
622 void CVoIPAudioDownlinkStreamImpl::Event(TInt aEventType, TInt aError) |
|
623 { |
|
624 iObserver->Event(*this, aEventType, aError); |
|
625 } |
|
626 |
|
627 // End of file |