summaryrefslogtreecommitdiffstats
path: root/plugins/multimedia/symbian/mmf/audiosource/s60audiocapturesession.cpp
diff options
context:
space:
mode:
authorAntti <qt-info@nokia.com>2010-03-17 21:51:50 +0200
committerAntti <qt-info@nokia.com>2010-03-17 21:51:50 +0200
commit00f0eddcb74b1aaa837b8453bb4a1029e1a7badc (patch)
treed8b03894b277cfdefcc32a766a2cbcc48e31865b /plugins/multimedia/symbian/mmf/audiosource/s60audiocapturesession.cpp
parent3d9dd7a50ad0597acb0e67375bdd50aef1a19991 (diff)
Symbian: Directory changes. Separate camera to own service.
-add openmax backend to symbian builds -introduce mmf folder for radio, mediaplayer and audio recording service
Diffstat (limited to 'plugins/multimedia/symbian/mmf/audiosource/s60audiocapturesession.cpp')
-rw-r--r--plugins/multimedia/symbian/mmf/audiosource/s60audiocapturesession.cpp390
1 files changed, 390 insertions, 0 deletions
diff --git a/plugins/multimedia/symbian/mmf/audiosource/s60audiocapturesession.cpp b/plugins/multimedia/symbian/mmf/audiosource/s60audiocapturesession.cpp
new file mode 100644
index 0000000000..fdff36b5af
--- /dev/null
+++ b/plugins/multimedia/symbian/mmf/audiosource/s60audiocapturesession.cpp
@@ -0,0 +1,390 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore/qdebug.h>
+#include <QtCore/qurl.h>
+
+#include <QMediaRecorder>
+
+#include "s60audiocapturesession.h"
+
+#include <Mda\Common\Audio.h>
+#include <Mda\Common\Resource.h>
+#include <Mda\Client\Utility.h>
+#include <MdaAudioSampleEditor.h>
+
+#include <QDir>
+
+#include <mmf\common\mmfcontrollerpluginresolver.h>
+#include <mmf\common\mmfcontroller.h>
+
+#include <private/qcore_symbian_p.h>
+
+#include <BADESCA.H>
+
+S60AudioCaptureSession::S60AudioCaptureSession(QObject *parent):
+ QObject(parent), m_recorderUtility(NULL)
+{
+ TRAPD(err, m_recorderUtility = CMdaAudioRecorderUtility::NewL(*this));
+ qWarning() << err;
+
+ TRAP(err, fetchAudioCodecsL());
+ qWarning() << err;
+
+}
+
+S60AudioCaptureSession::~S60AudioCaptureSession()
+{
+ stop();
+
+ if(m_recorderUtility)
+ delete m_recorderUtility;
+}
+
+QAudioFormat S60AudioCaptureSession::format() const
+{
+ return m_format;
+}
+
+bool S60AudioCaptureSession::isFormatSupported(const QAudioFormat &format) const
+{
+ return false;
+}
+
+bool S60AudioCaptureSession::setFormat(const QAudioFormat &format)
+{
+ if (m_recorderUtility) {
+ m_format = format;
+ return true;
+ }
+ return false;
+}
+
+QStringList S60AudioCaptureSession::supportedAudioCodecs() const
+{
+ return m_controllerIdMap.keys();
+}
+
+QString S60AudioCaptureSession::codecDescription(const QString &codecName)
+{
+ return m_controllerIdMap[codecName].destinationFormatDescription;
+}
+
+bool S60AudioCaptureSession::setAudioCodec(const QString &codecName)
+{
+ if(m_recorderUtility) {
+ QStringList codecs = supportedAudioCodecs();
+ if(codecs.contains(codecName)) {
+ m_format.setCodec(codecName);
+ return true;
+ }
+ }
+ return false;
+}
+
+QString S60AudioCaptureSession::audioCodec() const
+{
+ return m_format.codec();
+}
+
+QUrl S60AudioCaptureSession::outputLocation() const
+{
+ return m_sink;
+}
+
+bool S60AudioCaptureSession::setOutputLocation(const QUrl& sink)
+{
+ m_sink = sink;
+ return true;
+}
+
+qint64 S60AudioCaptureSession::position() const
+{
+ return m_recorderUtility->Duration().Int64() / 1000;;
+}
+
+int S60AudioCaptureSession::state() const
+{
+ return int(m_state);
+}
+
+void S60AudioCaptureSession::record()
+{
+ if (m_state == QMediaRecorder::StoppedState) {
+ QString filename = QDir::toNativeSeparators(m_sink.toString());
+ TPtrC16 sink(reinterpret_cast<const TUint16*>(filename.utf16()));
+
+ TUid controllerUid(TUid::Uid(m_controllerIdMap[m_format.codec()].controllerUid));
+ TUid formatUid(TUid::Uid(m_controllerIdMap[m_format.codec()].destinationFormatUid));
+
+ TRAPD(err, m_recorderUtility->OpenFileL(sink, controllerUid, KNullUid, formatUid));
+ qWarning() << err;
+ m_state = QMediaRecorder::RecordingState;
+ emit stateChanged(m_state);
+ }else if (m_state == QMediaRecorder::PausedState) {
+ m_recorderUtility->SetPosition(m_pausedPosition);
+ TRAPD(error, m_recorderUtility->RecordL());
+ qWarning() << error;
+ m_state = QMediaRecorder::RecordingState;
+ emit stateChanged(m_state);
+ }
+}
+
+void S60AudioCaptureSession::pause()
+{
+ //TODO:
+ /*
+ if(m_audioInput)
+ m_audioInput->stop();
+ */
+ m_pausedPosition = m_recorderUtility->Position();
+ m_recorderUtility->Stop();
+
+ m_state = QMediaRecorder::PausedState;
+ emit stateChanged(m_state);
+}
+
+void S60AudioCaptureSession::stop()
+{
+ if (m_recorderUtility) {
+ m_recorderUtility->Stop();
+ m_recorderUtility->Close();
+ }
+ m_state = QMediaRecorder::StoppedState;
+ emit stateChanged(m_state);
+}
+/*
+void S60AudioCaptureSession::stateChanged(QAudio::State state)
+{
+ switch(state) {
+ case QAudio::ActiveState:
+ emit stateChanged(QMediaRecorder::RecordingState);
+ break;
+ default:
+ if(!((m_state == QMediaRecorder::PausedState) || (m_state == QMediaRecorder::StoppedState)))
+ m_state = QMediaRecorder::StoppedState;
+
+ emit stateChanged(m_state);
+ break;
+ }
+}
+*/
+void S60AudioCaptureSession::notify()
+{
+ //TODO:
+ //m_position += m_audioInput->notifyInterval();
+// m_position = 0;
+// emit positionChanged(m_position);
+}
+
+void S60AudioCaptureSession::setCaptureDevice(const QString &deviceName)
+{
+ m_captureDevice = deviceName;
+}
+
+// Needed observer for CMdaAudioRecorderUtility
+void S60AudioCaptureSession::MoscoStateChangeEvent(CBase* aObject,
+ TInt aPreviousState, TInt aCurrentState, TInt /*aErrorCode*/)
+{
+ TRAPD(err, MoscoStateChangeEventL(aObject, aPreviousState, aCurrentState, NULL));
+ qWarning() << err;
+}
+
+// Needed observer for CMdaAudioRecorderUtility
+void S60AudioCaptureSession::MoscoStateChangeEventL(CBase* aObject,
+ TInt aPreviousState, TInt aCurrentState, TInt /*aErrorCode*/)
+{
+ if (aObject == m_recorderUtility)
+ {
+ switch(aCurrentState)
+ {
+ case CMdaAudioClipUtility::EOpen:
+ {
+ if(aPreviousState == CMdaAudioClipUtility::ENotReady)
+ {
+ RArray<TUint> supportedSampleRates;
+ CleanupClosePushL(supportedSampleRates);
+ m_recorderUtility->GetSupportedSampleRatesL(supportedSampleRates);
+
+ int frequency = m_format.frequency();
+ for (TInt i = 0; i < supportedSampleRates.Count(); i++ ) {
+ TUint supportedSampleRate = supportedSampleRates[i];
+ if (supportedSampleRate == frequency) {
+ m_recorderUtility->SetDestinationSampleRateL(m_format.frequency());
+ break;
+ }
+
+ }
+
+ CleanupStack::PopAndDestroy(&supportedSampleRates);
+
+ /*
+ RArray<TUint> supportedBitRates;
+ TRAPD(ignore, m_recorderUtility->GetSupportedBitRatesL(supportedBitRates));
+
+ for (TInt j = 0; j < supportedBitRates.Count(); j++ ) {
+ qWarning() << QString("Supported bit rate: ") + QString().number(supportedBitRates[j]);
+
+ }
+ */
+
+ TFourCC fourCC;
+
+ if (m_format.sampleSize() == 8) {
+ switch (m_format.sampleType()) {
+ case QAudioFormat::SignedInt: {
+ fourCC.Set(KMMFFourCCCodePCM8);
+ break;
+ }
+ case QAudioFormat::UnSignedInt: {
+ fourCC.Set(KMMFFourCCCodePCMU8);
+ break;
+ }
+ case QAudioFormat::Float:
+ case QAudioFormat::Unknown:
+ default: {
+ fourCC.Set(KMMFFourCCCodePCM8);
+ break;
+ }
+ }
+ } else if (m_format.sampleSize() == 16) {
+ // 16 bit here
+ switch (m_format.sampleType()) {
+ case QAudioFormat::SignedInt: {
+ fourCC.Set(m_format.byteOrder()==QAudioFormat::BigEndian?
+ KMMFFourCCCodePCM16B:KMMFFourCCCodePCM16);
+ break;
+ }
+ case QAudioFormat::UnSignedInt: {
+ fourCC.Set(m_format.byteOrder()==QAudioFormat::BigEndian?
+ KMMFFourCCCodePCMU16B:KMMFFourCCCodePCMU16);
+ break;
+ }
+ default: {
+ fourCC.Set(KMMFFourCCCodePCM16);
+ break;
+ }
+ }
+ }
+
+ RArray<TFourCC> supportedDataTypes;
+ CleanupClosePushL(supportedDataTypes);
+ m_recorderUtility->GetSupportedDestinationDataTypesL(supportedDataTypes);
+
+ for (TInt k = 0; k < supportedDataTypes.Count(); k++ ) {
+ if (supportedDataTypes[k].FourCC() == fourCC.FourCC()) {
+ m_recorderUtility->SetDestinationDataTypeL(supportedDataTypes[k]);
+ break;
+ }
+ }
+ CleanupStack::PopAndDestroy(&supportedDataTypes);
+
+ //set channels
+ RArray<TUint> supportedChannels;
+ CleanupClosePushL(supportedChannels);
+ m_recorderUtility->GetSupportedNumberOfChannelsL(supportedChannels);
+ for (TInt l = 0; l < supportedChannels.Count(); l++ ) {
+ if (supportedChannels[l] == m_format.channels()) {
+ m_recorderUtility->SetDestinationNumberOfChannelsL(m_format.channels());
+ break;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(&supportedChannels);
+
+ m_recorderUtility->SetGain(m_recorderUtility->MaxGain());
+ m_recorderUtility->RecordL();
+ }
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+}
+
+void S60AudioCaptureSession::fetchAudioCodecsL()
+{
+ CMMFControllerPluginSelectionParameters* pluginParameters =
+ CMMFControllerPluginSelectionParameters::NewLC();
+ CMMFFormatSelectionParameters* formatParameters =
+ CMMFFormatSelectionParameters::NewLC();
+
+ pluginParameters->SetRequiredRecordFormatSupportL(*formatParameters);
+
+ RArray<TUid> ids;
+ CleanupClosePushL(ids);
+ User::LeaveIfError(ids.Append(KUidMediaTypeAudio));
+
+ pluginParameters->SetMediaIdsL(ids,
+ CMMFPluginSelectionParameters::EAllowOnlySuppliedMediaIds);
+
+ RMMFControllerImplInfoArray controllers;
+ CleanupResetAndDestroyPushL(controllers);
+
+ //Get all audio/video play and record controllers/formats that are supported
+ pluginParameters->ListImplementationsL(controllers);
+
+ for (TInt index=0; index<controllers.Count(); index++) {
+ const RMMFFormatImplInfoArray& recordFormats =
+ controllers[index]->RecordFormats();
+ for (TInt j=0; j<recordFormats.Count(); j++) {
+ const CDesC8Array& mimeTypes = recordFormats[j]->SupportedMimeTypes();
+ TInt count = mimeTypes.Count();
+ if (count > 0) {
+ TPtrC8 mimeType = mimeTypes[0];
+ QString type = QString::fromUtf8((char *)mimeType.Ptr(), mimeType.Length());
+ // Currently only support for audio/wav due to quality issues.
+ if (type == "audio/wav") {
+ ItemData data;
+ data.controllerUid = controllers[index]->Uid().iUid;
+ data.destinationFormatUid = recordFormats[j]->Uid().iUid;
+ data.destinationFormatDescription = qt_TDesC2QString(recordFormats[j]->DisplayName());
+ m_controllerIdMap[type] = data;
+ }
+ }
+ }
+ }
+ CleanupStack::PopAndDestroy(4);//controllers, ids, formatParameters, pluginParameters
+}
+