25 #include <mmcccodecinformation.h> |
25 #include <mmcccodecinformation.h> |
26 #include "debugtracemacros.h" |
26 #include "debugtracemacros.h" |
27 |
27 |
28 DevSoundWrapperSrc::DevSoundWrapperSrc() |
28 DevSoundWrapperSrc::DevSoundWrapperSrc() |
29 { |
29 { |
30 //init_complete = 0; |
30 init_complete = 0; |
31 dev_sound = NULL; |
31 dev_sound = NULL; |
32 buffersize = 0; |
32 buffersize = 0; |
33 dev_count = 0; |
33 dev_count = 0; |
34 speechbitrate = 0; |
|
35 caps.iRate = EMMFSampleRate8000Hz; |
34 caps.iRate = EMMFSampleRate8000Hz; |
36 caps.iEncoding = EMMFSoundEncoding16BitPCM; |
35 caps.iEncoding = EMMFSoundEncoding16BitPCM; |
37 caps.iChannels = EMMFMono; |
36 caps.iChannels = EMMFMono; |
38 fourcc = KMMFFourCCCodePCM16; |
37 fourcc = KMMFFourCCCodePCM16; |
39 iCallbackError = KErrNone; |
38 iCallbackError = KErrNone; |
47 void DevSoundWrapperSrc::InitializeComplete(TInt aError) |
46 void DevSoundWrapperSrc::InitializeComplete(TInt aError) |
48 { |
47 { |
49 TRACE_PRN_FN_ENT; |
48 TRACE_PRN_FN_ENT; |
50 TRequestStatus* stat = &(AL->iStatus); |
49 TRequestStatus* stat = &(AL->iStatus); |
51 |
50 |
52 iCallbackError = aError; |
51 if (aError == KErrNone) |
|
52 { |
|
53 init_complete = 1; |
|
54 } |
|
55 else |
|
56 { |
|
57 init_complete = 0; |
|
58 } |
|
59 |
53 User::RequestComplete(stat, aError); |
60 User::RequestComplete(stat, aError); |
54 TRACE_PRN_FN_EXT; |
61 TRACE_PRN_FN_EXT; |
55 } |
62 } |
56 /************************************************************/ |
63 /************************************************************/ |
57 |
64 |
84 else |
91 else |
85 { |
92 { |
86 User::RequestComplete(stat, KErrNotFound); |
93 User::RequestComplete(stat, KErrNotFound); |
87 iCallbackError = KErrNotFound; |
94 iCallbackError = KErrNotFound; |
88 } |
95 } |
89 TRACE_PRN_FN_EXT; |
96 // TRACE_PRN_FN_EXT; |
90 } |
97 } |
91 /********************************************************/ |
98 /********************************************************/ |
92 |
99 |
93 void DevSoundWrapperSrc::RecordError(TInt aError) |
100 void DevSoundWrapperSrc::RecordError(TInt aError) |
94 { |
101 { |
95 TRACE_PRN_FN_ENT; |
102 TRACE_PRN_FN_ENT; |
96 TRACE_PRN_N1(_L("DevSoundWrapperSrc::RecordError %d"),aError); |
103 TRACE_PRN_N1(_L("DevSoundWrapperSrc::RecordError %d"),aError); |
97 iCallbackError = aError; |
104 iCallbackError = aError; |
98 TRequestStatus* stat = &(AL->iStatus); |
|
99 /// need to check this, error can occure before and after calling |
|
100 /// the StartActiveScheduler and might and might not be waiting for |
|
101 /// completing the request |
|
102 if( AL->IsActive() ) |
|
103 { |
|
104 /// need to complete the request for coming out from blocking call. |
|
105 User::RequestComplete(stat, aError); |
|
106 iCallbackError = aError; |
|
107 } |
|
108 TRACE_PRN_FN_EXT; |
105 TRACE_PRN_FN_EXT; |
109 } |
106 } |
110 /**********************************************************/ |
107 /**********************************************************/ |
111 |
108 |
112 void DevSoundWrapperSrc::ConvertError(TInt /*aError*/) |
109 void DevSoundWrapperSrc::ConvertError(TInt /*aError*/) |
177 |
174 |
178 /*******************************************************/ |
175 /*******************************************************/ |
179 int initialize_devsound(GstDevsoundSrc* ds) |
176 int initialize_devsound(GstDevsoundSrc* ds) |
180 { |
177 { |
181 TRACE_PRN_FN_ENT; |
178 TRACE_PRN_FN_ENT; |
|
179 int ret = 0; |
182 DevSoundWrapperSrc* handle = (DevSoundWrapperSrc*) ds->handle; |
180 DevSoundWrapperSrc* handle = (DevSoundWrapperSrc*) ds->handle; |
183 |
181 |
184 handle->AL->InitialiseActiveListener(); |
182 handle->AL->InitialiseActiveListener(); |
185 |
183 |
186 TRAP(handle->iCallbackError, handle->dev_sound->InitializeL(*handle, handle->fourcc, EMMFStateRecording)); |
184 TRAP(ret, handle->dev_sound->InitializeL(*handle, handle->fourcc, EMMFStateRecording)); |
187 |
185 |
188 if ( handle->iCallbackError ) |
186 if (ret) |
189 { |
187 { |
190 TRACE_PRN_FN_EXT; |
188 TRACE_PRN_FN_EXT; |
191 return handle->iCallbackError; |
189 return ret; |
192 } |
190 } |
193 |
191 |
194 handle->AL->StartActiveScheduler(); |
192 handle->AL->StartActiveScheduler(); |
195 |
193 |
196 if (KErrNone == handle->iCallbackError ) |
194 if (handle->init_complete == 1) |
197 { |
195 { |
198 TMMFPrioritySettings temp; |
196 TMMFPrioritySettings temp; |
199 temp.iPref = (TMdaPriorityPreference) ds->preference; |
197 temp.iPref = (TMdaPriorityPreference) ds->preference; |
200 temp.iPriority = ds->priority; |
198 temp.iPriority = ds->priority; |
201 handle->dev_sound->SetPrioritySettings(temp); |
199 handle->dev_sound->SetPrioritySettings(temp); |
202 |
200 |
203 handle->iCallbackError = SetConfigurations(handle); |
201 SetConfigurations(handle); |
204 } |
202 ret = KErrNone; |
205 |
|
206 TRACE_PRN_IF_ERR(handle->iCallbackError); |
|
207 TRACE_PRN_FN_EXT; |
|
208 return handle->iCallbackError; |
|
209 } |
|
210 /*********************************************************/ |
|
211 |
|
212 int stop_devsound(GstDevsoundSrc *ds) |
|
213 { |
|
214 TRACE_PRN_FN_ENT; |
|
215 DevSoundWrapperSrc* handle = (DevSoundWrapperSrc*) ds->handle; |
|
216 handle->dev_sound->Stop(); |
|
217 TRACE_PRN_FN_EXT; |
|
218 return 0; |
|
219 } |
|
220 |
|
221 int pause_devsound(GstDevsoundSrc *ds) |
|
222 { |
|
223 TRACE_PRN_FN_ENT; |
|
224 DevSoundWrapperSrc* handle = (DevSoundWrapperSrc*) ds->handle; |
|
225 handle->dev_sound->Pause(); |
|
226 TRACE_PRN_FN_EXT; |
|
227 return 0; |
|
228 } |
|
229 |
|
230 int resume_devsound(GstDevsoundSrc *ds) |
|
231 { |
|
232 TRACE_PRN_FN_ENT; |
|
233 DevSoundWrapperSrc* handle = (DevSoundWrapperSrc*) ds->handle; |
|
234 if(handle->dev_sound->IsResumeSupported()) |
|
235 { |
|
236 handle->iCallbackError = handle->dev_sound->Resume(); |
|
237 } |
203 } |
238 else |
204 else |
239 { |
205 { |
240 if( KErrNone == recordinit(handle) ) |
206 ret = KErrNotFound; |
241 initproperties(ds); |
207 } |
242 } |
208 |
243 TRACE_PRN_FN_EXT; |
209 TRACE_PRN_IF_ERR(ret); |
244 return 0; |
210 TRACE_PRN_FN_EXT; |
245 } |
211 return ret; |
|
212 } |
|
213 /*********************************************************/ |
246 |
214 |
247 int open_device(DevSoundWrapperSrc **handle) |
215 int open_device(DevSoundWrapperSrc **handle) |
248 { |
216 { |
249 (*handle)->iCallbackError = KErrNone; |
217 int retcode = KErrNone; |
250 TRACE_PRN_FN_ENT; |
218 TRACE_PRN_FN_ENT; |
251 |
219 |
252 (*handle)->dev_count++; |
220 (*handle)->dev_count++; |
253 |
221 |
254 (*handle)->as = CActiveScheduler::Current(); |
222 (*handle)->as = CActiveScheduler::Current(); |
263 } |
231 } |
264 |
232 |
265 (*handle)->AL = new CActiveListener; |
233 (*handle)->AL = new CActiveListener; |
266 ((*handle)->AL)->asw = new CActiveSchedulerWait(); |
234 ((*handle)->AL)->asw = new CActiveSchedulerWait(); |
267 |
235 |
268 TRAP( (*handle)->iCallbackError,(*handle)->dev_sound = CMMFDevSound::NewL() ); |
236 TRAP( retcode,(*handle)->dev_sound = CMMFDevSound::NewL() ); |
269 |
237 |
270 if (!(*handle)->AL || !((*handle)->AL)->asw || !(*handle)->dev_sound |
238 if (!(*handle)->AL || !((*handle)->AL)->asw || !(*handle)->dev_sound |
271 || !(*handle)->as) |
239 || !(*handle)->as) |
272 { |
240 { |
273 return KErrNoMemory; |
241 retcode = KErrNoMemory; |
274 } |
242 } |
275 |
243 |
276 TRAP((*handle)->iCallbackError ,(*handle)->iAudoInputRecord = CAudioInput::NewL(*(*handle)->dev_sound)); |
244 TRACE_PRN_FN_EXT; |
277 if ( KErrNone == (*handle)->iCallbackError ) |
245 |
278 { |
246 return retcode; |
279 RArray<CAudioInput::TAudioInputPreference> inputArray; |
|
280 inputArray.Append( CAudioInput::EDefaultMic ); |
|
281 // Set Audio Input |
|
282 (*handle)->iAudoInputRecord->SetAudioInputL( inputArray.Array( ) ); |
|
283 inputArray.Close(); |
|
284 } |
|
285 TRACE_PRN_FN_EXT; |
|
286 |
|
287 return (*handle)->iCallbackError; |
|
288 } |
247 } |
289 |
248 |
290 /*********************************************************/ |
249 /*********************************************************/ |
291 |
250 |
292 int close_devsound(GstDevsoundSrc *ds) |
251 int close_devsound(GstDevsoundSrc *ds) |
293 { |
252 { |
294 TRACE_PRN_FN_ENT; |
253 TRACE_PRN_FN_ENT; |
295 CMMFDevSound *dev_sound= 0; |
254 (STATIC_CAST(DevSoundWrapperSrc*, ds->handle))->dev_sound->Stop(); |
296 dev_sound = (STATIC_CAST(DevSoundWrapperSrc*, ds->handle))->dev_sound; |
|
297 dev_sound->Stop(); |
|
298 g_list_foreach(ds->supportedbitrates, (GFunc) g_free, NULL); |
255 g_list_foreach(ds->supportedbitrates, (GFunc) g_free, NULL); |
299 g_list_free(ds->supportedbitrates); |
256 g_list_free(ds->supportedbitrates); |
300 |
257 |
301 g_list_foreach(ds->fmt, (GFunc) g_free, NULL); |
258 g_list_foreach(ds->fmt, (GFunc) g_free, NULL); |
302 g_list_free(ds->fmt); |
259 g_list_free(ds->fmt); |
303 ds->fmt = NULL; |
260 |
304 delete (STATIC_CAST(DevSoundWrapperSrc*, ds->handle))->iAudoInputRecord; |
|
305 delete dev_sound; |
|
306 delete ds->handle; |
261 delete ds->handle; |
307 TRACE_PRN_FN_EXT; |
262 TRACE_PRN_FN_EXT; |
308 return 0; |
263 return 0; |
309 } |
|
310 /************************************************************/ |
|
311 void update_devsound_speech_bitrate(DevSoundWrapperSrc *handle, TUint bitrate) |
|
312 { |
|
313 handle->speechbitrate = bitrate; |
|
314 } |
264 } |
315 /************************************************************/ |
265 /************************************************************/ |
316 |
266 |
317 int SetConfigurations(DevSoundWrapperSrc *handle) |
267 int SetConfigurations(DevSoundWrapperSrc *handle) |
318 { |
268 { |
323 temp_caps = (handle->dev_sound)->Capabilities(); |
273 temp_caps = (handle->dev_sound)->Capabilities(); |
324 |
274 |
325 handle->gain = (handle->dev_sound)->MaxGain(); |
275 handle->gain = (handle->dev_sound)->MaxGain(); |
326 (handle->dev_sound)->SetGain(handle->gain); |
276 (handle->dev_sound)->SetGain(handle->gain); |
327 handle->caps.iBufferSize = temp_caps.iBufferSize; |
277 handle->caps.iBufferSize = temp_caps.iBufferSize; |
328 |
278 |
|
279 TRAP(ret, (handle->dev_sound)->SetConfigL(handle->caps) ); |
|
280 if (ret) |
|
281 { |
|
282 return ret; |
|
283 } |
|
284 |
|
285 (handle->caps) = (handle->dev_sound)->Config(); |
|
286 |
329 switch (handle->fourcc) |
287 switch (handle->fourcc) |
330 { |
288 { |
331 case KMccFourCCIdG711: |
289 case KMccFourCCIdG711: |
332 { |
290 { |
333 if (!handle->iG711EncoderIntfc) |
291 if (!handle->iG711EncoderIntfc) |
362 { |
320 { |
363 break; |
321 break; |
364 } |
322 } |
365 } |
323 } |
366 |
324 |
367 if (ret) |
|
368 return ret; |
|
369 |
|
370 if (!handle->iSpeechEncoderConfig && handle->fourcc |
325 if (!handle->iSpeechEncoderConfig && handle->fourcc |
371 != KMMFFourCCCodePCM16) |
326 != KMMFFourCCCodePCM16) |
372 { |
327 { |
373 |
328 |
374 TRAP(ret, handle->iSpeechEncoderConfig |
329 TRAP(ret, handle->iSpeechEncoderConfig |
375 = CSpeechEncoderConfig::NewL(*handle->dev_sound)); |
330 = CSpeechEncoderConfig::NewL(*handle->dev_sound)); |
376 if (ret) |
331 } |
377 return ret; |
|
378 |
|
379 if(handle->speechbitrate > 0) |
|
380 { |
|
381 ret = set_speech_encoder_bit_rate(handle,handle->speechbitrate); |
|
382 if(ret) |
|
383 return ret; |
|
384 } |
|
385 } |
|
386 |
|
387 TRAP(ret, (handle->dev_sound)->SetConfigL(handle->caps) ); |
|
388 if (ret) |
|
389 { |
|
390 return ret; |
|
391 } |
|
392 |
|
393 (handle->caps) = (handle->dev_sound)->Config(); |
|
394 |
332 |
395 TRACE_PRN_FN_EXT; |
333 TRACE_PRN_FN_EXT; |
396 return ret; |
334 return ret; |
397 } |
335 } |
398 |
336 |
598 /******************************************************************/ |
536 /******************************************************************/ |
599 |
537 |
600 void set_rate(DevSoundWrapperSrc *handle, int rate) |
538 void set_rate(DevSoundWrapperSrc *handle, int rate) |
601 { |
539 { |
602 handle->caps.iRate = rate; |
540 handle->caps.iRate = rate; |
603 TRACE_PRN_N1(_L("set_rate %d"),rate); |
|
604 } |
541 } |
605 /******************************************************************/ |
542 /******************************************************************/ |
606 void set_channels(DevSoundWrapperSrc *handle, int channels) |
543 void set_channels(DevSoundWrapperSrc *handle, int channels) |
607 { |
544 { |
608 handle->caps.iChannels = channels; |
545 handle->caps.iChannels = channels; |
609 TRACE_PRN_N1(_L("set_channels %d"),channels); |
|
610 } |
546 } |
611 /****************************************************************/ |
547 /****************************************************************/ |
612 void set_encoding(DevSoundWrapperSrc *handle, int encoding) |
548 void set_encoding(DevSoundWrapperSrc *handle, int encoding) |
613 { |
549 { |
614 handle->caps.iEncoding = encoding; |
550 handle->caps.iEncoding = encoding; |
619 handle->caps.iBufferSize = size; |
555 handle->caps.iBufferSize = size; |
620 } |
556 } |
621 /*****************************************************************/ |
557 /*****************************************************************/ |
622 void set_fourcc(DevSoundWrapperSrc *handle, int fourcc) |
558 void set_fourcc(DevSoundWrapperSrc *handle, int fourcc) |
623 { |
559 { |
624 TRACE_PRN_FN_ENT; |
|
625 handle->fourcc = fourcc; |
560 handle->fourcc = fourcc; |
626 TRACE_PRN_N1(_L("set_fourcc %d"),fourcc); |
|
627 TRACE_PRN_FN_EXT; |
|
628 } |
561 } |
629 |
562 |
630 /*******************************************************************/ |
563 /*******************************************************************/ |
631 |
564 |
632 int recordinit(DevSoundWrapperSrc *handle) |
565 int recordinit(DevSoundWrapperSrc *handle) |
633 { |
566 { |
634 TRACE_PRN_FN_ENT; |
567 TRACE_PRN_FN_ENT; |
|
568 int ret = 0; |
635 ((handle)->AL)->InitialiseActiveListener(); |
569 ((handle)->AL)->InitialiseActiveListener(); |
636 handle->iCallbackError = KErrNone; |
570 handle->iCallbackError = KErrNone; |
637 |
571 |
638 TRAP(handle->iCallbackError, (handle->dev_sound)->RecordInitL() ); |
572 TRAP(ret, (handle->dev_sound)->RecordInitL() ); |
639 |
573 |
640 if (!handle->iCallbackError) |
574 if (ret) |
641 { |
575 { |
642 ((handle)->AL)->StartActiveScheduler(); |
576 TRACE_PRN_FN_EXT; |
643 } |
577 return ret; |
644 |
578 } |
645 TRACE_PRN_FN_EXT; |
579 ((handle)->AL)->StartActiveScheduler(); |
646 return handle->iCallbackError; |
580 |
|
581 if ((handle->iCallbackError) != KErrNone) |
|
582 { |
|
583 TRACE_PRN_FN_EXT; |
|
584 return (handle->iCallbackError); |
|
585 } |
|
586 TRACE_PRN_FN_EXT; |
|
587 return KErrNone; |
|
588 |
647 } |
589 } |
648 |
590 |
649 /*******************************************************************/ |
591 /*******************************************************************/ |
650 int record_data(DevSoundWrapperSrc *handle) |
592 int record_data(DevSoundWrapperSrc *handle) |
651 { |
593 { |
662 /*********************************************************************/ |
604 /*********************************************************************/ |
663 |
605 |
664 int pre_init_setconf(GstDevsoundSrc *ds) |
606 int pre_init_setconf(GstDevsoundSrc *ds) |
665 { |
607 { |
666 TRACE_PRN_FN_ENT; |
608 TRACE_PRN_FN_ENT; |
667 |
609 int ret = 0; |
668 DevSoundWrapperSrc* dsPtr = STATIC_CAST(DevSoundWrapperSrc*, ds->handle); |
610 DevSoundWrapperSrc* dsPtr = STATIC_CAST(DevSoundWrapperSrc*, ds->handle); |
669 dsPtr->iCallbackError = KErrNone; |
611 |
670 // NOTE: it is too late for setting prio/pref here |
612 // NOTE: it is too late for setting prio/pref here |
671 if (ds->pending.preferenceupdate == 1 || ds->pending.priorityupdate == 1) |
613 if (ds->pending.preferenceupdate == 1 || ds->pending.priorityupdate == 1) |
672 { |
614 { |
673 ds->pending.preferenceupdate = FALSE; |
615 ds->pending.preferenceupdate = FALSE; |
674 ds->pending.priorityupdate = FALSE; |
616 ds->pending.priorityupdate = FALSE; |
681 |
623 |
682 if (ds->pending.leftbalanceupdate == 1 || ds->pending.rightbalanceupdate |
624 if (ds->pending.leftbalanceupdate == 1 || ds->pending.rightbalanceupdate |
683 == 1) |
625 == 1) |
684 { |
626 { |
685 |
627 |
686 TRAP( dsPtr->iCallbackError, (dsPtr->dev_sound)->SetRecordBalanceL(ds->leftbalance, |
628 TRAP( ret, (dsPtr->dev_sound)->SetRecordBalanceL(ds->leftbalance, |
687 ds->rightbalance) ); |
629 ds->rightbalance) ); |
688 ds->pending.leftbalanceupdate = FALSE; |
630 ds->pending.leftbalanceupdate = FALSE; |
689 ds->pending.rightbalanceupdate = FALSE; |
631 ds->pending.rightbalanceupdate = FALSE; |
690 } |
632 } |
691 TRACE_PRN_FN_EXT; |
633 TRACE_PRN_FN_EXT; |
692 return dsPtr->iCallbackError; |
634 return ret; |
693 } |
635 } |
694 /*********************************************************/ |
636 /*********************************************************/ |
695 void getsupporteddatatypes(GstDevsoundSrc *ds) |
637 void getsupporteddatatypes(GstDevsoundSrc *ds) |
696 { |
638 { |
697 TRACE_PRN_FN_ENT; |
639 TRACE_PRN_FN_ENT; |