qtmobility/examples/audiorecorder/audiorecorder.cpp
changeset 14 6fbed849b4f4
parent 11 06b8e2af4411
child 15 1f895d8a5b2b
--- a/qtmobility/examples/audiorecorder/audiorecorder.cpp	Fri Jun 11 14:26:25 2010 +0300
+++ b/qtmobility/examples/audiorecorder/audiorecorder.cpp	Wed Jun 23 19:08:38 2010 +0300
@@ -45,7 +45,7 @@
 #include <qmediaservice.h>
 #include <qaudioencodercontrol.h>
 
-#include <QtMultimedia/qaudioformat.h>
+#include <qaudioformat.h>
 
 #include "audiorecorder.h"
 
@@ -56,8 +56,8 @@
 
     if (capture->supportedAudioCodecs().size() > 0) {
         QAudioEncoderSettings audioSettings;
-        audioSettings.setQuality(QtMediaServices::LowQuality);
-        audioSettings.setEncodingMode(QtMediaServices::ConstantQualityEncoding);
+        audioSettings.setQuality(QtMultimedia::LowQuality);
+        audioSettings.setEncodingMode(QtMultimedia::ConstantQualityEncoding);
         audioSettings.setCodec(capture->supportedAudioCodecs().first());
         capture->setEncodingSettings(audioSettings,QVideoEncoderSettings(),
                 capture->supportedContainers().first());
@@ -82,6 +82,12 @@
     deviceBox->setSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::Fixed);
     deviceBox->setMinimumSize(200,10);
 
+    QLabel* encmodeLabel = new QLabel;
+    encmodeLabel->setText(tr("Encode Mode"));
+    encModeBox = new QComboBox(this);
+    encModeBox->setSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::Fixed);
+    encModeBox->setMinimumSize(200,10);
+
     QLabel* containerLabel = new QLabel;
     containerLabel->setText(tr("File Container"));
     containersBox = new QComboBox(this);
@@ -116,7 +122,14 @@
     for(int i = 0; i < inputs.size(); i++)
         deviceBox->addItem(inputs.at(i));
 
+    QList<QString> encmodes;
+    encmodes <<"ConstantQuality"<<"ConstantBitRate";
+    for(int i = 0; i < encmodes.size(); i++)
+        encModeBox->addItem(encmodes.at(i));
+
     QStringList codecs = capture->supportedAudioCodecs();
+    if (codecs.count() == 2)
+        swap(codecs[0], codecs[1]);
     for(int i = 0; i < codecs.count(); i++)
         codecsBox->addItem(codecs.at(i));
 
@@ -145,58 +158,71 @@
     connect(capture, SIGNAL(stateChanged(QMediaRecorder::State)), this, SLOT(stateChanged(QMediaRecorder::State)));
     connect(capture, SIGNAL(error(QMediaRecorder::Error)), this, SLOT(errorChanged(QMediaRecorder::Error)));
 
+    if (codecs.count() > 0) {
+    QAudioEncoderSettings audioSettings;
+    audioSettings.setQuality(QtMultimedia::LowQuality);
+    audioSettings.setEncodingMode(QtMultimedia::ConstantQualityEncoding);
+    audioSettings.setCodec(codecs.first());
+    capture->setEncodingSettings(audioSettings,QVideoEncoderSettings(),
+            containers.first());
+    }
+
     layout->addWidget(deviceLabel,0,0,Qt::AlignHCenter);
     connect(deviceBox,SIGNAL(activated(int)),SLOT(deviceChanged(int)));
     layout->addWidget(deviceBox,0,1,1,3,Qt::AlignLeft);
 
-    layout->addWidget(containerLabel,1,0,Qt::AlignHCenter);
-    connect(containersBox,SIGNAL(activated(int)),SLOT(containerChanged(int)));
-    layout->addWidget(containersBox,1,1,1,3,Qt::AlignLeft);
+    layout->addWidget(encmodeLabel,1,0,Qt::AlignHCenter);
+    connect(encModeBox,SIGNAL(activated(int)),SLOT(encmodeChanged(int)));
+    layout->addWidget(encModeBox,1,1,1,3,Qt::AlignLeft);
 
-    layout->addWidget(codecLabel,2,0,Qt::AlignHCenter);
+    layout->addWidget(containerLabel,2,0,Qt::AlignHCenter);
+    connect(containersBox,SIGNAL(activated(int)),SLOT(containerChanged(int)));
+    layout->addWidget(containersBox,2,1,1,3,Qt::AlignLeft);
+
+    layout->addWidget(codecLabel,3,0,Qt::AlignHCenter);
     connect(codecsBox,SIGNAL(activated(int)),SLOT(codecChanged(int)));
-    layout->addWidget(codecsBox,2,1,1,3,Qt::AlignLeft);   
+    layout->addWidget(codecsBox,3,1,1,3,Qt::AlignLeft);
     
-    layout->addWidget(sampleRateLabel,3,0,Qt::AlignHCenter);
+    layout->addWidget(sampleRateLabel,4,0,Qt::AlignHCenter);
     connect(sampleRateBox,SIGNAL(activated(int)),SLOT(sampleRateChanged(int)));
-    layout->addWidget(sampleRateBox,3,1,1,3,Qt::AlignLeft);
+    layout->addWidget(sampleRateBox,4,1,1,3,Qt::AlignLeft);
     
-    layout->addWidget(channelLabel,4,0,Qt::AlignHCenter);
+    layout->addWidget(channelLabel,5,0,Qt::AlignHCenter);
     connect(channelBox,SIGNAL(activated(int)),SLOT(channelCountChanged(int)));
-    layout->addWidget(channelBox,4,1,1,3,Qt::AlignLeft);
+    layout->addWidget(channelBox,5,1,1,3,Qt::AlignLeft);
     
-    layout->addWidget(qualityLabel,5,0,Qt::AlignHCenter);
+    layout->addWidget(qualityLabel,6,0,Qt::AlignHCenter);
     connect(qualityBox,SIGNAL(activated(int)),SLOT(qualityChanged(int)));
-    layout->addWidget(qualityBox,5,1,1,3,Qt::AlignLeft);
+    layout->addWidget(qualityBox,6,1,1,3,Qt::AlignLeft);
 
     fileButton = new QPushButton(this);
     fileButton->setText(tr("Output File"));    
     connect(fileButton,SIGNAL(clicked()),SLOT(selectOutputFile()));
-    layout->addWidget(fileButton,6,0,Qt::AlignHCenter);
+    layout->addWidget(fileButton,7,0,Qt::AlignHCenter);
     
     pauseButton = new QPushButton(this);    
     pauseButton->setText(tr("Pause"));
     connect(pauseButton,SIGNAL(clicked()),SLOT(togglePause()));
-    layout->addWidget(pauseButton,6,1,Qt::AlignHCenter);
+    layout->addWidget(pauseButton,7,1,Qt::AlignHCenter);
 
     button = new QPushButton(this);
     button->setText(tr("Record"));
     connect(button,SIGNAL(clicked()),SLOT(toggleRecord()));
-    layout->addWidget(button,6,2,Qt::AlignHCenter);
+    layout->addWidget(button,7,2,Qt::AlignHCenter);
 
     statusLabel = new QLabel;
     statusLabel->setSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::Fixed);
     statusLabel->setMinimumSize(130,10);
     statusLabel->setFrameStyle(QFrame::Panel | QFrame::Sunken);
     statusLabel->setLineWidth(1);
-    layout->addWidget(statusLabel,7,0,Qt::AlignHCenter);
+    layout->addWidget(statusLabel,8,0,Qt::AlignHCenter);
     
     QLabel* durationLabel = new QLabel;
     durationLabel->setText(tr("Duration"));
-    layout->addWidget(durationLabel,7,1,Qt::AlignRight);
+    layout->addWidget(durationLabel,8,1,Qt::AlignRight);
 
     recTime = new QLabel;
-    layout->addWidget(recTime,7,2,Qt::AlignLeft);
+    layout->addWidget(recTime,8,2,Qt::AlignLeft);
     
     window->setLayout(layout);
     setCentralWidget(window);
@@ -304,13 +330,30 @@
     
     switch(idx) {
     case 0:
-        settings.setQuality(QtMediaServices::LowQuality);
+        settings.setQuality(QtMultimedia::LowQuality);
         break;
     case 1:
-        settings.setQuality(QtMediaServices::NormalQuality);
+        settings.setQuality(QtMultimedia::NormalQuality);
         break;
     default:
-        settings.setQuality(QtMediaServices::HighQuality);
+        settings.setQuality(QtMultimedia::HighQuality);
+    }
+    capture->setEncodingSettings(settings);
+}
+
+void AudioRecorder::encmodeChanged(int idx)
+{
+    QAudioEncoderSettings settings = capture->audioSettings();
+
+    switch(idx) {
+    case 0:
+        settings.setEncodingMode(QtMultimedia::ConstantQualityEncoding);
+        break;
+    case 1:
+        settings.setEncodingMode(QtMultimedia::ConstantBitRateEncoding);
+        break;
+    default:
+        settings.setEncodingMode(QtMultimedia::ConstantQualityEncoding);
     }
     capture->setEncodingSettings(settings);
 }
@@ -323,7 +366,8 @@
             currentTime = 0;
         }
 #ifdef Q_OS_SYMBIAN    
-    capture->setOutputLocation(recordPathAudio(destination));
+    if (!paused)    
+        capture->setOutputLocation(recordPathAudio(destination));
 #endif
         capture->record();        
         active = true;
@@ -384,7 +428,16 @@
 
 void AudioRecorder::updateChannelCount(int idx)
 {    
-    QAudioEncoderControl *audioEncoder = qobject_cast<QAudioEncoderControl*>(capture->service()->control(QAudioEncoderControl_iid));
+    QMediaControl *control = audiosource->service()->requestControl(QAudioEncoderControl_iid);
+    if (!control)
+        return;
+
+    QAudioEncoderControl *audioEncoder = qobject_cast<QAudioEncoderControl*>(control);
+    if (!audioEncoder) {
+        audiosource->service()->releaseControl(control);
+        return;
+    }
+
     channelBox->clear();
     QStringList list = audioEncoder->supportedEncodingOptions(codecsBox->itemText(idx));
     QList<int> channels;
@@ -400,7 +453,16 @@
 
 void AudioRecorder::updateQuality(int idx)
 {    
-    QAudioEncoderControl *audioEncoder = qobject_cast<QAudioEncoderControl*>(capture->service()->control(QAudioEncoderControl_iid));
+    QMediaControl *control = audiosource->service()->requestControl(QAudioEncoderControl_iid);
+    if (!control)
+        return;
+
+    QAudioEncoderControl *audioEncoder = qobject_cast<QAudioEncoderControl*>(control);
+    if (!audioEncoder) {
+        audiosource->service()->releaseControl(control);
+        return;
+    }
+
     qualityBox->clear();
     QStringList list = audioEncoder->supportedEncodingOptions(codecsBox->itemText(idx));
     QList<int> channels;