--- 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,