qtmobility/plugins/multimedia/symbian/openmaxal/mediarecorder/qxarecordsession.cpp
changeset 14 6fbed849b4f4
parent 11 06b8e2af4411
child 15 1f895d8a5b2b
--- a/qtmobility/plugins/multimedia/symbian/openmaxal/mediarecorder/qxarecordsession.cpp	Fri Jun 11 14:26:25 2010 +0300
+++ b/qtmobility/plugins/multimedia/symbian/openmaxal/mediarecorder/qxarecordsession.cpp	Wed Jun 23 19:08:38 2010 +0300
@@ -57,7 +57,7 @@
 
 #define RETURN_s_IF_m_impl_IS_NULL(s) \
     if (!m_impl) { \
-        emit error(QMediaRecorder::ResourceError, tr("Service has not been started")); \
+        emit error(QMediaRecorder::ResourceError, QXARecordSession::tr("Service has not been started")); \
         SIGNAL_EMIT_TRACE1("emit error(QMediaRecorder::ResourceError, tr(\"Service has not been started\"))"); \
         return s; \
         }
@@ -68,14 +68,15 @@
  */
 #define RETURN_IF_m_impl_IS_NULL \
     if (!m_impl) { \
-        emit error(QMediaRecorder::ResourceError, tr("Service has not been started")); \
+        emit error(QMediaRecorder::ResourceError, QXARecordSession::tr("Service has not been started")); \
         SIGNAL_EMIT_TRACE1("emit error(QMediaRecorder::ResourceError, tr(\"Service has not been started\"))"); \
         return; \
         }
 
 QXARecordSession::QXARecordSession(QObject *parent)
 :QObject(parent),
-m_state(QMediaRecorder::StoppedState)
+m_state(QMediaRecorder::StoppedState),
+m_previousState(QMediaRecorder::StoppedState)
 {
     QT_TRACE_FUNCTION_ENTRY;
     m_impl = NULL;
@@ -84,11 +85,12 @@
         if (m_impl->postConstruct() == KErrNone) {
             initCodecsList();
             initContainersList();
-            m_containerMimeType = QString();
+            m_containerMimeType = QString("audio/wav");
+            m_audioencodersettings.setCodec("pcm");
             m_audioencodersettings.setBitRate(0);
             m_audioencodersettings.setChannelCount(-1);
-            m_audioencodersettings.setEncodingMode(QtMediaServices::ConstantQualityEncoding);
-            m_audioencodersettings.setQuality(QtMediaServices::NormalQuality);
+            m_audioencodersettings.setEncodingMode(QtMultimedia::ConstantQualityEncoding);
+            m_audioencodersettings.setQuality(QtMultimedia::NormalQuality);
             m_audioencodersettings.setSampleRate(-1);
             QT_TRACE1("Initialized implementation");
         }
@@ -123,9 +125,10 @@
     RETURN_s_IF_m_impl_IS_NULL(false);
 
     // Location can be set only when recorder is in stopped state.
-    if (state() != QMediaRecorder::StoppedState )
+    if (state() != QMediaRecorder::StoppedState) {
         return false;
-
+    }
+    
     // Validate URL
     if (!location.isValid())
         return false;
@@ -139,7 +142,10 @@
     bool retVal = false;
     TPtrC16 tempPtr(reinterpret_cast<const TUint16 *>(newUrlStr.utf16()));
     if (m_impl->setURI(tempPtr) == 0) {
+        QT_TRACE2("Location:", newUrlStr);
         m_outputLocation = location;
+        /* New file, so user can set new settings */
+        m_previousState = QMediaRecorder::StoppedState;
         retVal = true;
     }
     else {
@@ -172,8 +178,16 @@
 
 void QXARecordSession::applySettings()
 {
-    if (m_appliedaudioencodersettings != m_audioencodersettings)
-        setEncoderSettingsToImpl();
+    /* Settings can only be applied when the recorder is in the stopped
+     * state after creation. */
+    if ((state() == QMediaRecorder::StoppedState) && (m_state == m_previousState)) {
+        if (m_appliedaudioencodersettings != m_audioencodersettings)
+            setEncoderSettingsToImpl();
+    }
+    else {
+        emit error(QMediaRecorder::FormatError, tr("Settings cannot be changed once recording started"));
+        SIGNAL_EMIT_TRACE1("emit error(QMediaRecorder::FormatError, tr(\"Settings cannot be changed once recording started\"))");
+    }
 }
 
 void QXARecordSession::record()
@@ -182,6 +196,10 @@
 
     RETURN_IF_m_impl_IS_NULL;
 
+    /* No op if object is already in recording state */
+    if (state() == QMediaRecorder::RecordingState)
+        return;
+
     /* 1. Set encoder settings here */
     if (m_appliedaudioencodersettings != m_audioencodersettings)
         RET_IF_FALSE(setEncoderSettingsToImpl());
@@ -204,6 +222,11 @@
 
     RETURN_IF_m_impl_IS_NULL;
 
+    /* No op if object is already in paused/stopped state */
+    if ((state() == QMediaRecorder::PausedState) || (state() == QMediaRecorder::StoppedState)) {
+        return;
+    }
+
     if (m_impl->pause() == KErrNone) {
         setRecorderState(QMediaRecorder::PausedState);
     }
@@ -221,6 +244,10 @@
 
     RETURN_IF_m_impl_IS_NULL;
 
+    /* No op if object is already in paused state */
+    if (state() == QMediaRecorder::StoppedState)
+        return;
+
     if ((m_impl->stop() == KErrNone)) {
         setRecorderState(QMediaRecorder::StoppedState);
     }
@@ -234,26 +261,45 @@
 
 void QXARecordSession::cbDurationChanged(TInt64 new_pos)
 {
+    QT_TRACE_FUNCTION_ENTRY;
+
     emit durationChanged((qint64)new_pos);
     SIGNAL_EMIT_TRACE1("emit durationChanged((qint64)new_pos);");
+
+    QT_TRACE_FUNCTION_EXIT;
 }
 
 void QXARecordSession::cbAvailableAudioInputsChanged()
 {
+    QT_TRACE_FUNCTION_ENTRY;
+
     emit availableAudioInputsChanged();
     SIGNAL_EMIT_TRACE1("emit availableAudioInputsChanged();");
+
+    QT_TRACE_FUNCTION_EXIT;
 }
 
 void QXARecordSession::cbRecordingStarted()
 {
+    QT_TRACE_FUNCTION_ENTRY;
+
     setRecorderState(QMediaRecorder::RecordingState);
+
+    QT_TRACE_FUNCTION_EXIT;
 }
 
 void QXARecordSession::cbRecordingStopped()
 {
+    QT_TRACE_FUNCTION_ENTRY;
+
     emit error(QMediaRecorder::ResourceError, tr("Resources Unavailable"));
     SIGNAL_EMIT_TRACE1("emit error(QMediaRecorder::ResourceError, tr(\"Resources Unavailable\"))");
     setRecorderState(QMediaRecorder::StoppedState);
+    /* Set record state to Stopped */
+    if (m_impl)
+        m_impl->stop();
+
+    QT_TRACE_FUNCTION_EXIT;
 }
 
 /* For QAudioEndpointSelector begin */
@@ -368,9 +414,12 @@
             for (TInt index = 0; index < sampleRates.Count(); index++)
                 srList.append(sampleRates[index]);
             sampleRates.Close();
-            *continuous = false;
-            if (isContinuous == true)
-                *continuous = true;
+            if (continuous)
+                {
+                *continuous = false;
+                if (isContinuous == true)
+                    *continuous = true;
+                }
         }
     }
 
@@ -385,7 +434,15 @@
 
 void QXARecordSession::setAudioSettings(const QAudioEncoderSettings &settings)
 {
-    m_audioencodersettings = settings;
+    /* Settings can only be set when the recorder is in the stopped
+     * state after creation. */
+    if ((state() == QMediaRecorder::StoppedState) && (m_state == m_previousState)) {
+        m_audioencodersettings = settings;
+    }
+    else {
+        emit error(QMediaRecorder::FormatError, tr("Settings cannot be changed once recording started"));
+        SIGNAL_EMIT_TRACE1("emit error(QMediaRecorder::FormatError, tr(\"Settings cannot be changed once recording started\"))");
+    }
 }
 
 QStringList QXARecordSession::supportedEncodingOptions(const QString &codec)
@@ -393,7 +450,11 @@
     QT_TRACE_FUNCTION_ENTRY;
     Q_UNUSED(codec);
     QStringList options;
-    options << "bitrate";
+    if ((codec.compare("aac") == 0) ||
+            (codec.compare("amr") == 0))
+        {
+        options << "bitrate";
+        }
 
     QT_TRACE_FUNCTION_EXIT;
     return options;
@@ -474,6 +535,7 @@
 void QXARecordSession::setRecorderState(QMediaRecorder::State state)
 {
     if (state != m_state) {
+        m_previousState = m_state;
         m_state = state;
         emit stateChanged(m_state);
         SIGNAL_EMIT_TRACE1("emit stateChanged(m_state);");
@@ -533,8 +595,11 @@
     m_impl->setContainerType(tempPtr);
 
     /* Validate and set bitrate only if encoding mode is other than quality encoding */
-    if (m_audioencodersettings.encodingMode() != QtMediaServices::ConstantQualityEncoding) {
-        if (m_audioencodersettings.bitRate() < 0 ) {
+    if (m_audioencodersettings.encodingMode() != QtMultimedia::ConstantQualityEncoding) {
+        if (m_audioencodersettings.bitRate() == -1) {
+            m_impl->setOptimalBitRate();
+        }
+        else if (m_audioencodersettings.bitRate() < 0 ) {
             emit error(QMediaRecorder::FormatError, tr("Invalid bitrate"));
             SIGNAL_EMIT_TRACE1("emit error(QMediaRecorder::FormatError, tr(\"Invalid bitrate\"))");
             return false;
@@ -563,27 +628,28 @@
         m_impl->setCodec(tempPtr);
     }
     else {
+        QT_TRACE2("Codec selected is :", m_audioencodersettings.codec().toLower());
         emit error(QMediaRecorder::FormatError, tr("Invalid codec"));
         SIGNAL_EMIT_TRACE1("emit error(QMediaRecorder::FormatError, tr(\"Invalid codec\"));");
         return false;
     }
 
     switch (m_audioencodersettings.encodingMode()) {
-    case QtMediaServices::ConstantQualityEncoding: {
+    case QtMultimedia::ConstantQualityEncoding: {
             switch (m_audioencodersettings.quality()) {
-            case QtMediaServices::VeryLowQuality:
+            case QtMultimedia::VeryLowQuality:
                 m_impl->setVeryLowQuality();
                 break;
-            case QtMediaServices::LowQuality:
+            case QtMultimedia::LowQuality:
                 m_impl->setLowQuality();
                 break;
-            case QtMediaServices::NormalQuality:
+            case QtMultimedia::NormalQuality:
                 m_impl->setNormalQuality();
                 break;
-            case QtMediaServices::HighQuality:
+            case QtMultimedia::HighQuality:
                 m_impl->setHighQuality();
                 break;
-            case QtMediaServices::VeryHighQuality:
+            case QtMultimedia::VeryHighQuality:
                 m_impl->setVeryHighQuality();
                 break;
             default:
@@ -593,7 +659,7 @@
             }; /* end of switch (m_audioencodersettings.quality())*/
         }
         break;
-    case QtMediaServices::ConstantBitRateEncoding: {
+    case QtMultimedia::ConstantBitRateEncoding: {
             TInt32 status = m_impl->setCBRMode();
             if (status == KErrNotSupported) {
                 emit error(QMediaRecorder::FormatError, tr("Invalid encoding mode setting"));
@@ -607,7 +673,7 @@
             }
         }
         break;
-    case QtMediaServices::AverageBitRateEncoding: {
+    case QtMultimedia::AverageBitRateEncoding: {
             TInt32 status = m_impl->setVBRMode();
             if (status == KErrNotSupported) {
                 emit error(QMediaRecorder::FormatError, tr("Invalid encoding mode setting"));
@@ -621,7 +687,7 @@
             }
         }
         break;
-    case QtMediaServices::TwoPassEncoding:
+    case QtMultimedia::TwoPassEncoding:
         // fall through
     default: {
             emit error(QMediaRecorder::FormatError, tr("Invalid encoding mode setting"));
@@ -630,16 +696,19 @@
         }
     }; /* switch (m_audioencodersettings.encodingMode()) */
 
-    if (m_audioencodersettings.sampleRate() == -1) {
-        m_impl->setOptimalSampleRate();
-    }
-    else if (m_audioencodersettings.sampleRate() <= 0) {
-        emit error(QMediaRecorder::FormatError, tr("Invalid sample rate"));
-        SIGNAL_EMIT_TRACE1("emit error(QMediaRecorder::FormatError, tr(\"Invalid sample rate\"));");
-        return false;
-    }
-    else {
-        m_impl->setSampleRate(m_audioencodersettings.sampleRate());
+    /* Validate and set bitrate only if encoding mode is other than quality encoding */
+    if (m_audioencodersettings.encodingMode() != QtMultimedia::ConstantQualityEncoding) {
+        if (m_audioencodersettings.sampleRate() == -1) {
+            m_impl->setOptimalSampleRate();
+        }
+        else if (m_audioencodersettings.sampleRate() <= 0) {
+            emit error(QMediaRecorder::FormatError, tr("Invalid sample rate"));
+            SIGNAL_EMIT_TRACE1("emit error(QMediaRecorder::FormatError, tr(\"Invalid sample rate\"));");
+            return false;
+        }
+        else {
+            m_impl->setSampleRate(m_audioencodersettings.sampleRate());
+        }
     }
     m_appliedaudioencodersettings = m_audioencodersettings;
     QT_TRACE_FUNCTION_EXIT;