qtmobility/plugins/multimedia/symbian/openmaxal/mediarecorder/xarecordsessionimpl.cpp
changeset 14 6fbed849b4f4
parent 11 06b8e2af4411
child 15 1f895d8a5b2b
--- a/qtmobility/plugins/multimedia/symbian/openmaxal/mediarecorder/xarecordsessionimpl.cpp	Fri Jun 11 14:26:25 2010 +0300
+++ b/qtmobility/plugins/multimedia/symbian/openmaxal/mediarecorder/xarecordsessionimpl.cpp	Wed Jun 23 19:08:38 2010 +0300
@@ -51,12 +51,12 @@
 _LIT(KAUDIOCODECAMR, "amr");
 _LIT(KAUDIOCODECAAC, "aac");
 
-_LIT(KCONTAINERWAV, "wav");
+_LIT(KCONTAINERWAV, "audio/wav");
 _LIT(KCONTAINERWAVDESC, "wav container");
-_LIT(KCONTAINERAMR, "amr-nb");
-_LIT(KCONTAINERAMRDESC, "amr-nb File format");
-_LIT(KCONTAINERMP4, "mp4");
-_LIT(KCONTAINERMP4DESC, "mp4 container");
+_LIT(KCONTAINERAMR, "audio/amr");
+_LIT(KCONTAINERAMRDESC, "amr File format");
+_LIT(KCONTAINERMP4, "audio/mpeg");
+_LIT(KCONTAINERMP4DESC, "mpeg container");
 
 const TUint KRecordPosUpdatePeriod = 1000;
 const TUint KMilliToHz = 1000;
@@ -210,7 +210,7 @@
      * If the recorder object was created for a different URI (than aURI), we
      * need to tear it down here.
      */
-    if (!m_URIName && m_MORecorder) {
+    if (m_MORecorder) {
         (*m_MORecorder)->Destroy(m_MORecorder);
         m_MORecorder = NULL;
         m_RecordItf = NULL;
@@ -238,11 +238,11 @@
         TRACE_LOG(_L("XARecordSessionImpl::Record: MORecorder/RecordItf is not created"));
         returnValue = createMediaRecorderObject();
         RET_ERR_IF_ERR(returnValue);
+
+        returnValue = setEncoderSettingsToMediaRecorder();
+        RET_ERR_IF_ERR(returnValue);
     }
 
-    returnValue = setEncoderSettingsToMediaRecorder();
-    RET_ERR_IF_ERR(returnValue);
-
     XAuint32 state;
     XAresult xa_result = (*m_RecordItf)->GetRecordState(m_RecordItf, &state);
     returnValue = mapError(xa_result, ETrue);
@@ -425,8 +425,10 @@
     TRACE_FUNCTION_ENTRY;
 
     TInt32 err(KErrGeneral);
-    if (m_DefaultAudioInputDeviceNames->MdcaCount() >= 0)
+    if (m_DefaultAudioInputDeviceNames->MdcaCount() >= 0) {
         endPoint.Set(m_DefaultAudioInputDeviceNames->MdcaPoint(0));
+        err = KErrNone;
+    }
 
     TRACE_FUNCTION_EXIT;
     return err;
@@ -578,29 +580,7 @@
     if (found == false)
         return returnValue;
 
-    XAuint32 numCaps = 0;
-    XAAudioCodecDescriptor codecDesc;
-    XAresult xa_result = (*m_AudioEncCapsItf)->GetAudioEncoderCapabilities(
-                                        m_AudioEncCapsItf,
-                                        encoderId,
-                                        &numCaps,
-                                        &codecDesc);
-    returnValue = mapError(xa_result, ETrue);
-    RET_ERR_IF_ERR(returnValue);
-
-    /* TODO What do we do if we have more than one caps?? */
-    aIsContinuous = codecDesc.isFreqRangeContinuous;
-    if (aIsContinuous) {
-        aSampleRates.Append(codecDesc.minSampleRate / KMilliToHz);
-        aSampleRates.Append(codecDesc.maxSampleRate / KMilliToHz);
-    }
-    else {
-        XAuint32 numSRSupported = codecDesc.numSampleRatesSupported;
-        XAmilliHertz *pSampleRatesSupported(NULL);
-        pSampleRatesSupported = codecDesc.pSampleRatesSupported;
-        for (TInt index = 0; index < numSRSupported; index++)
-            aSampleRates.Append((*(pSampleRatesSupported + index)) / KMilliToHz);
-    }
+    returnValue = getSampleRatesByAudioCodecID(encoderId, aSampleRates);
 
     TRACE_FUNCTION_EXIT;
     return returnValue;
@@ -704,12 +684,20 @@
 void XARecordSessionImpl::setBitRate(TUint32 aBitRate) {
     TRACE_FUNCTION_ENTRY;
     m_BitRate = aBitRate;
+    TRACE_LOG((_L("BitRate[%d]"), m_BitRate));
+    TRACE_FUNCTION_EXIT;
+}
+
+void XARecordSessionImpl::setOptimalBitRate() {
+    TRACE_FUNCTION_ENTRY;
+    m_BitRate = 0xffffffff;
     TRACE_FUNCTION_EXIT;
 }
 
 void XARecordSessionImpl::setChannels(TUint32 aChannels) {
     TRACE_FUNCTION_ENTRY;
     m_ChannelsOut = aChannels;
+    TRACE_LOG((_L("ChannelCount[%d]"), m_ChannelsOut));
     TRACE_FUNCTION_EXIT;
 }
 
@@ -723,12 +711,27 @@
     TRACE_FUNCTION_ENTRY;
     /* convert Hz to MilliHz */
     m_SampleRate = aSampleRate * KMilliToHz;
+    TRACE_LOG((_L("SampleRate[%d]"), aSampleRate));
     TRACE_FUNCTION_EXIT;
 }
 
 void XARecordSessionImpl::setOptimalSampleRate() {
     TRACE_FUNCTION_ENTRY;
-    m_SampleRate = 0xffffffff;
+    m_SampleRate = 0;
+
+    if (m_AudioEncoderId == XA_AUDIOCODEC_AMR) {
+        m_SampleRate = 8000 * KMilliToHz;
+    } else {
+        RArray<TInt32> sampleRates;
+        TInt res = getSampleRatesByAudioCodecID(m_AudioEncoderId, sampleRates);
+        if ((res == KErrNone) && (sampleRates.Count() > 0)) {
+            /* Sort the array and pick the middle range sample rate */
+            sampleRates.SortUnsigned();
+            m_SampleRate = sampleRates[sampleRates.Count()/2]  * KMilliToHz;
+        }
+        sampleRates.Close();
+    }
+
     TRACE_FUNCTION_EXIT;
 }
 
@@ -762,6 +765,20 @@
         bitrates.SortUnsigned();
         m_BitRate = bitrates[0];
     }
+    bitrates.Close();
+
+    if (m_AudioEncoderId == XA_AUDIOCODEC_AMR) {
+        m_SampleRate = 8000 * KMilliToHz;
+    } else {
+        RArray<TInt32> samplerates;
+        TInt res = getSampleRatesByAudioCodecID(m_AudioEncoderId, samplerates);
+        if ((res == KErrNone) && (samplerates.Count() > 0) ) {
+            /* Sort the array and pick the lowest bit rate */
+            samplerates.SortUnsigned();
+            m_SampleRate = samplerates[0] * KMilliToHz;
+        }
+        samplerates.Close();    
+    }    
 }
 
 void XARecordSessionImpl::setLowQuality()
@@ -774,6 +791,20 @@
         bitrates.SortUnsigned();
         m_BitRate = bitrates[bitrates.Count()*1/4];
     }
+    bitrates.Close();
+
+    if (m_AudioEncoderId == XA_AUDIOCODEC_AMR) {
+        m_SampleRate = 8000 * KMilliToHz;
+    } else {
+        RArray<TInt32> samplerates;
+        TInt res = getSampleRatesByAudioCodecID(m_AudioEncoderId, samplerates);
+        if ((res == KErrNone) && (samplerates.Count() > 0) ) {
+            /* Sort the array and pick the lowest bit rate */
+            samplerates.SortUnsigned();
+            m_SampleRate = samplerates[samplerates.Count()*1/4] * KMilliToHz;
+        }
+        samplerates.Close();    
+    }    
 }
 
 void XARecordSessionImpl::setNormalQuality()
@@ -786,6 +817,20 @@
         bitrates.SortUnsigned();
         m_BitRate = bitrates[bitrates.Count()/2];
     }
+    bitrates.Close();
+
+    if (m_AudioEncoderId == XA_AUDIOCODEC_AMR) {
+        m_SampleRate = 8000 * KMilliToHz;
+    } else {
+        RArray<TInt32> samplerates;
+        TInt res = getSampleRatesByAudioCodecID(m_AudioEncoderId, samplerates);
+        if ((res == KErrNone) && (samplerates.Count() > 0) ) {
+            /* Sort the array and pick the lowest bit rate */
+            samplerates.SortUnsigned();
+            m_SampleRate = samplerates[samplerates.Count()*1/2] * KMilliToHz;
+        }
+        samplerates.Close();    
+    }    
 }
 
 void XARecordSessionImpl::setHighQuality()
@@ -798,6 +843,20 @@
         bitrates.SortUnsigned();
         m_BitRate = bitrates[bitrates.Count()*3/4];
     }
+    bitrates.Close();
+
+    if (m_AudioEncoderId == XA_AUDIOCODEC_AMR) {
+        m_SampleRate = 8000 * KMilliToHz;
+    } else {
+        RArray<TInt32> samplerates;
+        TInt res = getSampleRatesByAudioCodecID(m_AudioEncoderId, samplerates);
+        if ((res == KErrNone) && (samplerates.Count() > 0) ) {
+            /* Sort the array and pick the lowest bit rate */
+            samplerates.SortUnsigned();
+            m_SampleRate = samplerates[samplerates.Count()*3/4] * KMilliToHz;
+        }
+        samplerates.Close();    
+    }    
 }
 
 void XARecordSessionImpl::setVeryHighQuality()
@@ -810,6 +869,20 @@
         bitrates.SortUnsigned();
         m_BitRate = bitrates[bitrates.Count()-1];
     }
+    bitrates.Close();
+
+    if (m_AudioEncoderId == XA_AUDIOCODEC_AMR) {
+        m_SampleRate = 8000 * KMilliToHz;
+    } else {
+        RArray<TInt32> samplerates;
+        TInt res = getSampleRatesByAudioCodecID(m_AudioEncoderId, samplerates);
+        if ((res == KErrNone) && (samplerates.Count() > 0) ) {
+            /* Sort the array and pick the lowest bit rate */
+            samplerates.SortUnsigned();
+            m_SampleRate = samplerates[samplerates.Count()-1] * KMilliToHz;
+        }
+        samplerates.Close();    
+    }    
 }
 
 /* Internal function */
@@ -839,7 +912,7 @@
         TPtr8 uriPtr = m_URIName->Des();
         m_Uri.URI = (XAchar*) uriPtr.PtrZ();
         m_Mime.formatType    = XA_DATAFORMAT_MIME;
-        m_Mime.containerType = XA_CONTAINERTYPE_WAV;
+        m_Mime.containerType = m_ContainerType;
         TPtr8 mimeTypePtr(m_WAVMime->Des());
         m_Mime.mimeType = (XAchar*)mimeTypePtr.Ptr();
         m_DataSink.pLocator = (void*) &m_Uri;
@@ -1081,7 +1154,6 @@
 
     XAAudioInputDescriptor audioInputDescriptor;
     for (TInt index = 0; index < numInputs; index++) {
-        m_InputDeviceIDs.Append(deviceIds[index]);
         xa_result = (*m_AudioIODevCapsItf)->QueryAudioInputCapabilities(
                 m_AudioIODevCapsItf,
                 deviceIds[index],
@@ -1101,7 +1173,9 @@
         /* Using TRAP with returnValue results in compiler error */
         TRAPD(err2, m_AudioInputDeviceNames->AppendL(name));
         returnValue = err2;
-        RET_ERR_IF_ERR(returnValue);
+        if (returnValue != KErrNone)
+            continue;
+        m_InputDeviceIDs.Append(deviceIds[index]);
     }
 
     numInputs = MAX_NUMBER_INPUT_DEVICES;
@@ -1116,7 +1190,6 @@
     RET_ERR_IF_ERR(returnValue);
 
     for (TInt index = 0; index < numInputs; index++) {
-        m_DefaultInputDeviceIDs.Append(deviceIds[index]);
         xa_result = (*m_AudioIODevCapsItf)->QueryAudioInputCapabilities(
                 m_AudioIODevCapsItf,
                 deviceIds[index],
@@ -1135,7 +1208,9 @@
         /* Using TRAP with returnValue results in compiler error */
         TRAPD(err2, m_DefaultAudioInputDeviceNames->AppendL(name));
         returnValue = err2;
-        RET_ERR_IF_ERR(returnValue);
+        if (returnValue != KErrNone)
+            continue;
+        m_DefaultInputDeviceIDs.Append(deviceIds[index]);
     }
 
     TRACE_FUNCTION_EXIT;
@@ -1158,7 +1233,7 @@
         settings.channelsOut = m_ChannelsOut;
     if (m_SampleRate != 0xffffffff)
         settings.sampleRate = m_SampleRate;
-    if (m_BitRate != 0)
+    if ((m_BitRate != 0) && (m_BitRate != 0xffffffff))
         settings.bitRate = m_BitRate;
     if (m_RateControl != 0)
         settings.rateControl = m_RateControl;
@@ -1209,6 +1284,41 @@
     return returnValue;
 }
 
+TInt32 XARecordSessionImpl::getSampleRatesByAudioCodecID(XAuint32 encoderId,
+                      RArray<TInt32> &aSampleRates)
+{
+    TRACE_FUNCTION_ENTRY;
+
+    if (!m_AudioEncCapsItf)
+        return KErrGeneral;
+
+    XAuint32 numCaps = 0;
+    XAAudioCodecDescriptor codecDesc;
+    XAresult xa_result = (*m_AudioEncCapsItf)->GetAudioEncoderCapabilities(
+                                        m_AudioEncCapsItf,
+                                        encoderId,
+                                        &numCaps,
+                                        &codecDesc);
+    TInt returnValue = mapError(xa_result, ETrue);
+    RET_ERR_IF_ERR(returnValue);
+
+    /* TODO What do we do if we have more than one caps?? */
+    if (codecDesc.isFreqRangeContinuous == XA_BOOLEAN_TRUE) {
+        aSampleRates.Append(codecDesc.minSampleRate / KMilliToHz);
+        aSampleRates.Append(codecDesc.maxSampleRate / KMilliToHz);
+    }
+    else {
+        XAuint32 numSRSupported = codecDesc.numSampleRatesSupported;
+        XAmilliHertz *pSampleRatesSupported(NULL);
+        pSampleRatesSupported = codecDesc.pSampleRatesSupported;
+        for (TInt index = 0; index < numSRSupported; index++)
+            aSampleRates.Append((*(pSampleRatesSupported + index)) / KMilliToHz);
+    }
+
+    TRACE_FUNCTION_ENTRY;
+    return returnValue;
+}
+
 /* Local function implementation */
 void cbXAObjectItf(
             XAObjectItf caller,