diff -r 2b40d63a9c3d -r 90517678cc4f qtmobility/plugins/multimedia/symbian/mmf/audiosource/s60audiocapturesession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtmobility/plugins/multimedia/symbian/mmf/audiosource/s60audiocapturesession.cpp Mon May 03 13:18:40 2010 +0300 @@ -0,0 +1,494 @@ +/**************************************************************************** +** +** 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 "s60audiocapturesession.h" +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +_LIT(KAudioDummyFile, "c:\\data\\temp\\temp.wav"); + +S60AudioCaptureSession::S60AudioCaptureSession(QObject *parent): + QObject(parent) + , m_recorderUtility(NULL) + , m_captureState(ENotInitialized) + , m_controllerIdMap(QHash()) + , m_audioCodeclist(QHash()) +{ + TRAPD(err, initializeSessionL()); + qWarning()<(filename.utf16())); + TRAPD(err, BaflUtils::EnsurePathExistsL(CCoeEnv::Static()->FsSession(),path)); + if (err==KErrNone) { + m_sink = sink; + return true; + }else + return false; +} + +qint64 S60AudioCaptureSession::position() const +{ + if ((m_captureState != ERecording) || !m_recorderUtility) + return 0; + + return m_recorderUtility->Duration().Int64() / 1000; +} + +void S60AudioCaptureSession::record() +{ + if (!m_recorderUtility) + return; + + if (m_captureState == EInitialized || m_captureState == ERecordComplete) { + QString filename = QDir::toNativeSeparators(m_sink.toString()); + TPtrC16 sink(reinterpret_cast(filename.utf16())); + TUid controllerUid(TUid::Uid(m_controllerIdMap[m_container].controllerUid)); + TUid formatUid(TUid::Uid(m_controllerIdMap[m_container].destinationFormatUid)); + + TRAPD(err, + if (m_container != "audio/amr") + m_recorderUtility->OpenFileL(sink, controllerUid, KNullUid, formatUid); + else + m_recorderUtility->OpenFileL(sink); + ); + qWarning() << err; + }else if (m_captureState == EPaused) { + m_recorderUtility->SetPosition(m_pausedPosition); + TRAPD(error, m_recorderUtility->RecordL()); + qWarning() << error; + m_captureState = ERecording; + emit stateChanged(m_captureState); + } +} + +void S60AudioCaptureSession::setDefaultSettings() +{ + // Setting AMR to default format if supported + if (m_controllerIdMap.count() > 0) { + if ( m_controllerIdMap.contains("audio/amr")) + m_container = QString("audio/amr"); + else + m_container = m_controllerIdMap.keys()[0]; + } + if (m_audioCodeclist.keys().count() > 0) { + if (m_audioCodeclist.keys().contains("AMR")) + m_format.setCodec("AMR"); + else + m_format.setCodec(m_audioCodeclist.keys()[0]); + } +} + +void S60AudioCaptureSession::pause() +{ + if (!m_recorderUtility) + return; + + m_pausedPosition = m_recorderUtility->Position(); + m_recorderUtility->Stop(); + m_captureState = EPaused; + emit stateChanged(m_captureState); +} + +void S60AudioCaptureSession::stop() +{ + if (!m_recorderUtility) + return; + + m_recorderUtility->Stop(); + m_recorderUtility->Close(); + m_captureState = ERecordComplete; + emit stateChanged(m_captureState); +} + +void S60AudioCaptureSession::setCaptureDevice(const QString &deviceName) +{ + m_captureDevice = deviceName; +} + +void S60AudioCaptureSession::MoscoStateChangeEvent(CBase* aObject, + TInt aPreviousState, TInt aCurrentState, TInt aErrorCode) +{ + TRAPD(err, MoscoStateChangeEventL(aObject, aPreviousState, aCurrentState, NULL)); + qWarning() << err; +} + +void S60AudioCaptureSession::MoscoStateChangeEventL(CBase* aObject, + TInt aPreviousState, TInt aCurrentState, TInt aErrorCode) +{ + if (aObject != m_recorderUtility) + return; + + switch(aCurrentState) { + case CMdaAudioClipUtility::EOpen: { + if(aPreviousState == CMdaAudioClipUtility::ENotReady) { + if (m_captureState == EInitializing) { + retrieveSupportedAudioSampleRatesL(); + m_recorderUtility->Close(); + m_captureState = EInitialized; + emit stateChanged(m_captureState); + }else { + applyAudioSettingsL(); + m_recorderUtility->SetAudioDeviceMode(CMdaAudioRecorderUtility::ELocal); + m_recorderUtility->SetGain(m_recorderUtility->MaxGain()); + m_recorderUtility->SetPosition(TTimeIntervalMicroSeconds(0)); + m_recorderUtility->CropL(); + m_recorderUtility->RecordL(); + m_captureState = EOpenCompelete; + emit stateChanged(m_captureState); + } + break; + } + } + case CMdaAudioClipUtility::ENotReady: { + m_captureState = EInitialized; + emit stateChanged(m_captureState); + break; + } + case CMdaAudioClipUtility::ERecording: { + m_captureState = ERecording; + emit stateChanged(m_captureState); + break; + } + default: { + break; + } + } +} + +void S60AudioCaptureSession::updateAudioContainersL() +{ + CMMFControllerPluginSelectionParameters* pluginParameters = + CMMFControllerPluginSelectionParameters::NewLC(); + CMMFFormatSelectionParameters* formatParameters = + CMMFFormatSelectionParameters::NewLC(); + + pluginParameters->SetRequiredRecordFormatSupportL(*formatParameters); + + RArray ids; + CleanupClosePushL(ids); + User::LeaveIfError(ids.Append(KUidMediaTypeAudio)); + + pluginParameters->SetMediaIdsL(ids, + CMMFPluginSelectionParameters::EAllowOnlySuppliedMediaIds); + + RMMFControllerImplInfoArray controllers; + CleanupResetAndDestroyPushL(controllers); + + //Get all audio record controllers/formats that are supported + pluginParameters->ListImplementationsL(controllers); + + for (TInt index=0; indexRecordFormats(); + for (TInt j=0; jSupportedMimeTypes(); + TInt count = mimeTypes.Count(); + if (count > 0) { + TPtrC8 mimeType = mimeTypes[0]; + QString type = QString::fromUtf8((char *)mimeType.Ptr(), mimeType.Length()); + if (type != "audio/mp4") { + ControllerData data; + data.controllerUid = controllers[index]->Uid().iUid; + data.destinationFormatUid = recordFormats[j]->Uid().iUid; + data.destinationFormatDescription = QString::fromUtf16( + recordFormats[j]->DisplayName().Ptr(), + recordFormats[j]->DisplayName().Length()); + m_controllerIdMap[type] = data; + } + } + } + } + CleanupStack::PopAndDestroy(4);//controllers, ids, formatParameters, pluginParameters +} + +void S60AudioCaptureSession::retrieveSupportedAudioSampleRatesL() +{ + if (!m_recorderUtility || m_captureState != EInitializing) + return; + + RArray supportedSampleRates; + CleanupClosePushL(supportedSampleRates); + m_recorderUtility->GetSupportedSampleRatesL(supportedSampleRates); + for (TInt j = 0; j < supportedSampleRates.Count(); j++ ) { + m_supportedSampleRates.append(supportedSampleRates[j]); + //qDebug()<<"S60AudioCaptureSession::doPopulateAudioCodecsDataL, samplerate: "< S60AudioCaptureSession::supportedAudioSampleRates() const +{ + return m_supportedSampleRates; +} + +void S60AudioCaptureSession::populateAudioCodecsDataL() +{ + //qDebug() << "S60AudioCaptureSession::doInitializeAudioRecorderL START"; + if (!m_recorderUtility) + return; + + if (m_controllerIdMap.contains("audio/amr")) { + CodecData data; + data.codecDescription = QString("GSM AMR Codec"); + m_audioCodeclist[QString("AMR")]=data; + } + if (m_controllerIdMap.contains("audio/basic")) { + CodecData data; + data.fourCC = KMMFFourCCCodeALAW; + data.codecDescription = QString("Sun/Next ""Au"" audio codec"); + m_audioCodeclist[QString("AULAW")]=data; + } + if (m_controllerIdMap.contains("audio/wav")) { + CodecData data; + data.fourCC = KMMFFourCCCodePCM16; + data.codecDescription = QString("Pulse code modulation"); + m_audioCodeclist[QString("PCM")]=data; + } + if (m_controllerIdMap.contains("audio/mp4")) { + CodecData data; + data.fourCC = KMMFFourCCCodeAAC; + data.codecDescription = QString("Advanced Audio Codec"); + m_audioCodeclist[QString("AAC")]=data; + } + + if (m_controllerIdMap.contains("audio/wav")) { + TMdaFileClipLocation location; + location.iName = KAudioDummyFile(); + TMdaWavClipFormat format; + m_captureState = EInitializing; + m_recorderUtility->OpenL(&location, &format); + } +} + +void S60AudioCaptureSession::applyAudioSettingsL() +{ + //qDebug() << "S60AudioCaptureSession::applyAudioSettings START"; + if (!m_recorderUtility) + return; + + TFourCC fourCC = m_audioCodeclist[m_format.codec()].fourCC; + + //set destination datatype + RArray supportedDataTypes; + CleanupClosePushL(supportedDataTypes); + m_recorderUtility->GetSupportedDestinationDataTypesL(supportedDataTypes); + //qDebug() << "S60AudioCaptureSession::applyAudioSettingsL, datatype count"<SetDestinationDataTypeL(supportedDataTypes[k]); + break; + } + } + CleanupStack::PopAndDestroy(&supportedDataTypes); + + RArray supportedSampleRates; + CleanupClosePushL(supportedSampleRates); + m_recorderUtility->GetSupportedSampleRatesL(supportedSampleRates); + for (TInt i = 0; i < supportedSampleRates.Count(); i++ ) { + TUint supportedSampleRate = supportedSampleRates[i]; + if (supportedSampleRate == m_format.frequency()) { + m_recorderUtility->SetDestinationSampleRateL(m_format.frequency()); + break; + } + } + CleanupStack::PopAndDestroy(&supportedSampleRates); + + RArray 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); + //qDebug() << "S60AudioCaptureSession::applyAudioSettings END"; +} + +TFourCC S60AudioCaptureSession::determinePCMFormat() +{ + //qDebug() << "S60AudioCaptureSession::determinePCMSampleSize START"; + TFourCC fourCC; + + if (m_format.sampleSize() == 8) { + // 8 bit + 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 + 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; + } + } + } + //qDebug() << "S60AudioCaptureSession::determinePCMSampleSize END"; + return fourCC; +}