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; |
34 caps.iRate = EMMFSampleRate8000Hz; |
35 caps.iRate = EMMFSampleRate8000Hz; |
35 caps.iEncoding = EMMFSoundEncoding16BitPCM; |
36 caps.iEncoding = EMMFSoundEncoding16BitPCM; |
36 caps.iChannels = EMMFMono; |
37 caps.iChannels = EMMFMono; |
37 fourcc = KMMFFourCCCodePCM16; |
38 fourcc = KMMFFourCCCodePCM16; |
38 iCallbackError = KErrNone; |
39 iCallbackError = KErrNone; |
46 void DevSoundWrapperSrc::InitializeComplete(TInt aError) |
47 void DevSoundWrapperSrc::InitializeComplete(TInt aError) |
47 { |
48 { |
48 TRACE_PRN_FN_ENT; |
49 TRACE_PRN_FN_ENT; |
49 TRequestStatus* stat = &(AL->iStatus); |
50 TRequestStatus* stat = &(AL->iStatus); |
50 |
51 |
51 if (aError == KErrNone) |
52 iCallbackError = aError; |
52 { |
|
53 init_complete = 1; |
|
54 } |
|
55 else |
|
56 { |
|
57 init_complete = 0; |
|
58 } |
|
59 |
|
60 User::RequestComplete(stat, aError); |
53 User::RequestComplete(stat, aError); |
61 TRACE_PRN_FN_EXT; |
54 TRACE_PRN_FN_EXT; |
62 } |
55 } |
63 /************************************************************/ |
56 /************************************************************/ |
64 |
57 |
100 void DevSoundWrapperSrc::RecordError(TInt aError) |
93 void DevSoundWrapperSrc::RecordError(TInt aError) |
101 { |
94 { |
102 TRACE_PRN_FN_ENT; |
95 TRACE_PRN_FN_ENT; |
103 TRACE_PRN_N1(_L("DevSoundWrapperSrc::RecordError %d"),aError); |
96 TRACE_PRN_N1(_L("DevSoundWrapperSrc::RecordError %d"),aError); |
104 iCallbackError = aError; |
97 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 } |
105 TRACE_PRN_FN_EXT; |
108 TRACE_PRN_FN_EXT; |
106 } |
109 } |
107 /**********************************************************/ |
110 /**********************************************************/ |
108 |
111 |
109 void DevSoundWrapperSrc::ConvertError(TInt /*aError*/) |
112 void DevSoundWrapperSrc::ConvertError(TInt /*aError*/) |
174 |
177 |
175 /*******************************************************/ |
178 /*******************************************************/ |
176 int initialize_devsound(GstDevsoundSrc* ds) |
179 int initialize_devsound(GstDevsoundSrc* ds) |
177 { |
180 { |
178 TRACE_PRN_FN_ENT; |
181 TRACE_PRN_FN_ENT; |
179 int ret = 0; |
182 //int ret = 0; |
180 DevSoundWrapperSrc* handle = (DevSoundWrapperSrc*) ds->handle; |
183 DevSoundWrapperSrc* handle = (DevSoundWrapperSrc*) ds->handle; |
181 |
184 |
182 handle->AL->InitialiseActiveListener(); |
185 handle->AL->InitialiseActiveListener(); |
183 |
186 |
184 TRAP(ret, handle->dev_sound->InitializeL(*handle, handle->fourcc, EMMFStateRecording)); |
187 TRAP(handle->iCallbackError, handle->dev_sound->InitializeL(*handle, handle->fourcc, EMMFStateRecording)); |
185 |
188 |
186 if (ret) |
189 if ( handle->iCallbackError ) |
187 { |
190 { |
188 TRACE_PRN_FN_EXT; |
191 TRACE_PRN_FN_EXT; |
189 return ret; |
192 return handle->iCallbackError; |
190 } |
193 } |
191 |
194 |
192 handle->AL->StartActiveScheduler(); |
195 handle->AL->StartActiveScheduler(); |
193 |
196 |
194 if (handle->init_complete == 1) |
197 if (KErrNone == handle->iCallbackError ) |
195 { |
198 { |
196 TMMFPrioritySettings temp; |
199 TMMFPrioritySettings temp; |
197 temp.iPref = (TMdaPriorityPreference) ds->preference; |
200 temp.iPref = (TMdaPriorityPreference) ds->preference; |
198 temp.iPriority = ds->priority; |
201 temp.iPriority = ds->priority; |
199 handle->dev_sound->SetPrioritySettings(temp); |
202 handle->dev_sound->SetPrioritySettings(temp); |
200 |
203 |
201 SetConfigurations(handle); |
204 handle->iCallbackError = SetConfigurations(handle); |
202 ret = KErrNone; |
205 |
203 } |
206 } |
204 else |
207 |
205 { |
208 |
206 ret = KErrNotFound; |
209 TRACE_PRN_IF_ERR(handle->iCallbackError); |
207 } |
210 TRACE_PRN_FN_EXT; |
208 |
211 return handle->iCallbackError; |
209 TRACE_PRN_IF_ERR(ret); |
|
210 TRACE_PRN_FN_EXT; |
|
211 return ret; |
|
212 } |
212 } |
213 /*********************************************************/ |
213 /*********************************************************/ |
214 |
214 |
215 int stop_devsound(GstDevsoundSrc *ds) |
215 int stop_devsound(GstDevsoundSrc *ds) |
216 { |
216 { |
223 |
223 |
224 int pause_devsound(GstDevsoundSrc *ds) |
224 int pause_devsound(GstDevsoundSrc *ds) |
225 { |
225 { |
226 TRACE_PRN_FN_ENT; |
226 TRACE_PRN_FN_ENT; |
227 DevSoundWrapperSrc* handle = (DevSoundWrapperSrc*) ds->handle; |
227 DevSoundWrapperSrc* handle = (DevSoundWrapperSrc*) ds->handle; |
228 if(handle->dev_sound->IsResumeSupported()) |
|
229 { |
|
230 handle->dev_sound->Pause(); |
228 handle->dev_sound->Pause(); |
231 } |
|
232 else |
|
233 { |
|
234 handle->iSamplesRecorded = handle->dev_sound->SamplesRecorded(); |
|
235 handle->dev_sound->Stop(); |
|
236 } |
|
237 TRACE_PRN_FN_EXT; |
229 TRACE_PRN_FN_EXT; |
238 return 0; |
230 return 0; |
239 } |
231 } |
240 |
232 |
241 int resume_devsound(GstDevsoundSrc *ds) |
233 int resume_devsound(GstDevsoundSrc *ds) |
242 { |
234 { |
243 TRACE_PRN_FN_ENT; |
235 TRACE_PRN_FN_ENT; |
244 DevSoundWrapperSrc* handle = (DevSoundWrapperSrc*) ds->handle; |
236 DevSoundWrapperSrc* handle = (DevSoundWrapperSrc*) ds->handle; |
245 if(handle->dev_sound->IsResumeSupported()) |
237 if(handle->dev_sound->IsResumeSupported()) |
246 { |
238 { |
247 handle->dev_sound->Resume(); |
239 |
|
240 handle->iCallbackError = handle->dev_sound->Resume(); |
248 } |
241 } |
249 else |
242 else |
250 { |
243 { |
251 recordinit(handle); |
244 if( KErrNone == recordinit(handle) ) |
252 initproperties(ds); |
245 initproperties(ds); |
253 } |
246 } |
254 TRACE_PRN_FN_EXT; |
247 TRACE_PRN_FN_EXT; |
255 return 0; |
248 return 0; |
256 } |
249 } |
257 |
250 |
258 int open_device(DevSoundWrapperSrc **handle) |
251 int open_device(DevSoundWrapperSrc **handle) |
259 { |
252 { |
260 int retcode = KErrNone; |
253 (*handle)->iCallbackError = KErrNone; |
261 TRACE_PRN_FN_ENT; |
254 TRACE_PRN_FN_ENT; |
262 |
255 |
263 (*handle)->dev_count++; |
256 (*handle)->dev_count++; |
264 |
257 |
265 (*handle)->as = CActiveScheduler::Current(); |
258 (*handle)->as = CActiveScheduler::Current(); |
274 } |
267 } |
275 |
268 |
276 (*handle)->AL = new CActiveListener; |
269 (*handle)->AL = new CActiveListener; |
277 ((*handle)->AL)->asw = new CActiveSchedulerWait(); |
270 ((*handle)->AL)->asw = new CActiveSchedulerWait(); |
278 |
271 |
279 TRAP( retcode,(*handle)->dev_sound = CMMFDevSound::NewL() ); |
272 TRAP( (*handle)->iCallbackError,(*handle)->dev_sound = CMMFDevSound::NewL() ); |
280 |
273 |
281 if (!(*handle)->AL || !((*handle)->AL)->asw || !(*handle)->dev_sound |
274 if (!(*handle)->AL || !((*handle)->AL)->asw || !(*handle)->dev_sound |
282 || !(*handle)->as) |
275 || !(*handle)->as) |
283 { |
276 { |
284 retcode = KErrNoMemory; |
277 return KErrNoMemory; |
285 } |
278 } |
286 |
279 |
287 TRAP(retcode ,(*handle)->iAudoInputRecord = CAudioInput::NewL(*(*handle)->dev_sound)); |
280 TRAP((*handle)->iCallbackError ,(*handle)->iAudoInputRecord = CAudioInput::NewL(*(*handle)->dev_sound)); |
288 RArray<CAudioInput::TAudioInputPreference> inputArray; |
281 if ( KErrNone == (*handle)->iCallbackError ) |
|
282 { |
|
283 RArray<CAudioInput::TAudioInputPreference> inputArray; |
289 inputArray.Append( CAudioInput::EDefaultMic ); |
284 inputArray.Append( CAudioInput::EDefaultMic ); |
290 // Set Audio Input |
285 // Set Audio Input |
291 (*handle)->iAudoInputRecord->SetAudioInputL( inputArray.Array( ) ); |
286 (*handle)->iAudoInputRecord->SetAudioInputL( inputArray.Array( ) ); |
292 inputArray.Close(); |
287 inputArray.Close(); |
293 |
288 } |
294 TRACE_PRN_FN_EXT; |
289 TRACE_PRN_FN_EXT; |
295 |
290 |
296 return retcode; |
291 return (*handle)->iCallbackError; |
297 } |
292 } |
298 |
293 |
299 /*********************************************************/ |
294 /*********************************************************/ |
300 |
295 |
301 int close_devsound(GstDevsoundSrc *ds) |
296 int close_devsound(GstDevsoundSrc *ds) |
302 { |
297 { |
303 TRACE_PRN_FN_ENT; |
298 TRACE_PRN_FN_ENT; |
304 (STATIC_CAST(DevSoundWrapperSrc*, ds->handle))->dev_sound->Stop(); |
299 CMMFDevSound *dev_sound= 0; |
|
300 dev_sound = (STATIC_CAST(DevSoundWrapperSrc*, ds->handle))->dev_sound; |
|
301 dev_sound->Stop(); |
305 g_list_foreach(ds->supportedbitrates, (GFunc) g_free, NULL); |
302 g_list_foreach(ds->supportedbitrates, (GFunc) g_free, NULL); |
306 g_list_free(ds->supportedbitrates); |
303 g_list_free(ds->supportedbitrates); |
307 |
304 |
308 g_list_foreach(ds->fmt, (GFunc) g_free, NULL); |
305 g_list_foreach(ds->fmt, (GFunc) g_free, NULL); |
309 g_list_free(ds->fmt); |
306 g_list_free(ds->fmt); |
310 ds->fmt = NULL; |
307 ds->fmt = NULL; |
311 delete (STATIC_CAST(DevSoundWrapperSrc*, ds->handle))->iAudoInputRecord; |
308 delete (STATIC_CAST(DevSoundWrapperSrc*, ds->handle))->iAudoInputRecord; |
|
309 delete dev_sound; |
312 delete ds->handle; |
310 delete ds->handle; |
313 TRACE_PRN_FN_EXT; |
311 TRACE_PRN_FN_EXT; |
314 return 0; |
312 return 0; |
|
313 } |
|
314 /************************************************************/ |
|
315 void update_devsound_speech_bitrate(DevSoundWrapperSrc *handle, TUint bitrate) |
|
316 { |
|
317 handle->speechbitrate = bitrate; |
315 } |
318 } |
316 /************************************************************/ |
319 /************************************************************/ |
317 |
320 |
318 int SetConfigurations(DevSoundWrapperSrc *handle) |
321 int SetConfigurations(DevSoundWrapperSrc *handle) |
319 { |
322 { |
324 temp_caps = (handle->dev_sound)->Capabilities(); |
327 temp_caps = (handle->dev_sound)->Capabilities(); |
325 |
328 |
326 handle->gain = (handle->dev_sound)->MaxGain(); |
329 handle->gain = (handle->dev_sound)->MaxGain(); |
327 (handle->dev_sound)->SetGain(handle->gain); |
330 (handle->dev_sound)->SetGain(handle->gain); |
328 handle->caps.iBufferSize = temp_caps.iBufferSize; |
331 handle->caps.iBufferSize = temp_caps.iBufferSize; |
329 |
332 |
330 TRAP(ret, (handle->dev_sound)->SetConfigL(handle->caps) ); |
|
331 if (ret) |
|
332 { |
|
333 return ret; |
|
334 } |
|
335 |
|
336 (handle->caps) = (handle->dev_sound)->Config(); |
|
337 |
|
338 switch (handle->fourcc) |
333 switch (handle->fourcc) |
339 { |
334 { |
340 case KMccFourCCIdG711: |
335 case KMccFourCCIdG711: |
341 { |
336 { |
342 if (!handle->iG711EncoderIntfc) |
337 if (!handle->iG711EncoderIntfc) |
371 { |
366 { |
372 break; |
367 break; |
373 } |
368 } |
374 } |
369 } |
375 |
370 |
|
371 if (ret) |
|
372 return ret; |
|
373 |
376 if (!handle->iSpeechEncoderConfig && handle->fourcc |
374 if (!handle->iSpeechEncoderConfig && handle->fourcc |
377 != KMMFFourCCCodePCM16) |
375 != KMMFFourCCCodePCM16) |
378 { |
376 { |
379 |
377 |
380 TRAP(ret, handle->iSpeechEncoderConfig |
378 TRAP(ret, handle->iSpeechEncoderConfig |
381 = CSpeechEncoderConfig::NewL(*handle->dev_sound)); |
379 = CSpeechEncoderConfig::NewL(*handle->dev_sound)); |
382 } |
380 if (ret) |
|
381 return ret; |
|
382 |
|
383 if(handle->speechbitrate > 0) |
|
384 { |
|
385 ret = set_speech_encoder_bit_rate(handle,handle->speechbitrate); |
|
386 if(ret) |
|
387 return ret; |
|
388 } |
|
389 } |
|
390 |
|
391 TRAP(ret, (handle->dev_sound)->SetConfigL(handle->caps) ); |
|
392 if (ret) |
|
393 { |
|
394 return ret; |
|
395 } |
|
396 |
|
397 (handle->caps) = (handle->dev_sound)->Config(); |
383 |
398 |
384 TRACE_PRN_FN_EXT; |
399 TRACE_PRN_FN_EXT; |
385 return ret; |
400 return ret; |
386 } |
401 } |
387 |
402 |
619 /*******************************************************************/ |
634 /*******************************************************************/ |
620 |
635 |
621 int recordinit(DevSoundWrapperSrc *handle) |
636 int recordinit(DevSoundWrapperSrc *handle) |
622 { |
637 { |
623 TRACE_PRN_FN_ENT; |
638 TRACE_PRN_FN_ENT; |
624 int ret = 0; |
639 |
625 ((handle)->AL)->InitialiseActiveListener(); |
640 ((handle)->AL)->InitialiseActiveListener(); |
626 handle->iCallbackError = KErrNone; |
641 handle->iCallbackError = KErrNone; |
627 |
642 |
628 TRAP(ret, (handle->dev_sound)->RecordInitL() ); |
643 TRAP(handle->iCallbackError, (handle->dev_sound)->RecordInitL() ); |
629 |
644 |
630 if (ret) |
645 if (!handle->iCallbackError) |
631 { |
646 { |
632 TRACE_PRN_FN_EXT; |
647 ((handle)->AL)->StartActiveScheduler(); |
633 return ret; |
648 } |
634 } |
649 TRACE_PRN_FN_EXT; |
635 ((handle)->AL)->StartActiveScheduler(); |
650 return handle->iCallbackError; |
636 |
|
637 if ((handle->iCallbackError) != KErrNone) |
|
638 { |
|
639 TRACE_PRN_FN_EXT; |
|
640 return (handle->iCallbackError); |
|
641 } |
|
642 TRACE_PRN_FN_EXT; |
|
643 return KErrNone; |
|
644 |
|
645 } |
651 } |
646 |
652 |
647 /*******************************************************************/ |
653 /*******************************************************************/ |
648 int record_data(DevSoundWrapperSrc *handle) |
654 int record_data(DevSoundWrapperSrc *handle) |
649 { |
655 { |
660 /*********************************************************************/ |
666 /*********************************************************************/ |
661 |
667 |
662 int pre_init_setconf(GstDevsoundSrc *ds) |
668 int pre_init_setconf(GstDevsoundSrc *ds) |
663 { |
669 { |
664 TRACE_PRN_FN_ENT; |
670 TRACE_PRN_FN_ENT; |
665 int ret = 0; |
|
666 DevSoundWrapperSrc* dsPtr = STATIC_CAST(DevSoundWrapperSrc*, ds->handle); |
671 DevSoundWrapperSrc* dsPtr = STATIC_CAST(DevSoundWrapperSrc*, ds->handle); |
667 |
672 dsPtr->iCallbackError = 0; |
668 // NOTE: it is too late for setting prio/pref here |
673 // NOTE: it is too late for setting prio/pref here |
669 if (ds->pending.preferenceupdate == 1 || ds->pending.priorityupdate == 1) |
674 if (ds->pending.preferenceupdate == 1 || ds->pending.priorityupdate == 1) |
670 { |
675 { |
671 ds->pending.preferenceupdate = FALSE; |
676 ds->pending.preferenceupdate = FALSE; |
672 ds->pending.priorityupdate = FALSE; |
677 ds->pending.priorityupdate = FALSE; |
679 |
684 |
680 if (ds->pending.leftbalanceupdate == 1 || ds->pending.rightbalanceupdate |
685 if (ds->pending.leftbalanceupdate == 1 || ds->pending.rightbalanceupdate |
681 == 1) |
686 == 1) |
682 { |
687 { |
683 |
688 |
684 TRAP( ret, (dsPtr->dev_sound)->SetRecordBalanceL(ds->leftbalance, |
689 TRAP( dsPtr->iCallbackError, (dsPtr->dev_sound)->SetRecordBalanceL(ds->leftbalance, |
685 ds->rightbalance) ); |
690 ds->rightbalance) ); |
686 ds->pending.leftbalanceupdate = FALSE; |
691 ds->pending.leftbalanceupdate = FALSE; |
687 ds->pending.rightbalanceupdate = FALSE; |
692 ds->pending.rightbalanceupdate = FALSE; |
688 } |
693 } |
689 TRACE_PRN_FN_EXT; |
694 TRACE_PRN_FN_EXT; |
690 return ret; |
695 return dsPtr->iCallbackError; |
691 } |
696 } |
692 /*********************************************************/ |
697 /*********************************************************/ |
693 void getsupporteddatatypes(GstDevsoundSrc *ds) |
698 void getsupporteddatatypes(GstDevsoundSrc *ds) |
694 { |
699 { |
695 TRACE_PRN_FN_ENT; |
700 TRACE_PRN_FN_ENT; |