gst_plugins_symbian/gst/devsound/devsoundsrcwrapper.cpp
branchRCL_3
changeset 8 7e817e7e631c
parent 7 567bb019e3e3
equal deleted inserted replaced
7:567bb019e3e3 8:7e817e7e631c
    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 
    65     }
    72     }
    66 /*******************************************************/
    73 /*******************************************************/
    67 
    74 
    68 void DevSoundWrapperSrc::BufferToBeEmptied(CMMFBuffer* aBuffer)
    75 void DevSoundWrapperSrc::BufferToBeEmptied(CMMFBuffer* aBuffer)
    69     {
    76     {
    70     TRACE_PRN_FN_ENT;
    77 //    TRACE_PRN_FN_ENT;
    71 
    78 
    72     buffer = aBuffer;
    79     buffer = aBuffer;
    73     bufferreadpos = 0;
    80     bufferreadpos = 0;
    74     CMMFDataBuffer* buf = STATIC_CAST (CMMFDataBuffer*, buffer);
    81     CMMFDataBuffer* buf = STATIC_CAST (CMMFDataBuffer*, buffer);
    75     buffersize = buf->Data().Length();
    82     buffersize = buf->Data().Length();
    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;
   745     get_g729_vad_mode(dsPtr, &ds->g729vadmode);
   687     get_g729_vad_mode(dsPtr, &ds->g729vadmode);
   746     get_ilbc_vad_mode(dsPtr, &ds->ilbcvadmode);
   688     get_ilbc_vad_mode(dsPtr, &ds->ilbcvadmode);
   747     TRACE_PRN_FN_EXT;
   689     TRACE_PRN_FN_EXT;
   748     }
   690     }
   749 
   691 
   750 int call_back_error(DevSoundWrapperSrc* dsPtr)
       
   751     {
       
   752     TRACE_PRN_FN_ENT;
       
   753     return dsPtr->iCallbackError;
       
   754     TRACE_PRN_FN_EXT;
       
   755     }
       
   756