diff options
author | Puneet <puneetarora@ovi.com> | 2011-02-02 17:00:21 +0530 |
---|---|---|
committer | hawcroft <derick.hawcroft@nokia.com> | 2011-02-11 10:10:36 +1000 |
commit | 0ad212b432ebd34e480d2e210f374477d2669a1a (patch) | |
tree | 3b6b70e45b526900e41b2037251007c5308fa531 /plugins/multimedia/symbian/mmf/audiosource/s60audiocapturesession.cpp | |
parent | 686b7a24690959fc29c2f8dbbb87b5c804305176 (diff) |
Signed-off-by: hawcroft <derick.hawcroft@nokia.com>
Diffstat (limited to 'plugins/multimedia/symbian/mmf/audiosource/s60audiocapturesession.cpp')
-rw-r--r-- | plugins/multimedia/symbian/mmf/audiosource/s60audiocapturesession.cpp | 156 |
1 files changed, 150 insertions, 6 deletions
diff --git a/plugins/multimedia/symbian/mmf/audiosource/s60audiocapturesession.cpp b/plugins/multimedia/symbian/mmf/audiosource/s60audiocapturesession.cpp index 38c4764828..8321dd7833 100644 --- a/plugins/multimedia/symbian/mmf/audiosource/s60audiocapturesession.cpp +++ b/plugins/multimedia/symbian/mmf/audiosource/s60audiocapturesession.cpp @@ -44,6 +44,8 @@ #include <QtCore/qurl.h> #include <QDir> +#include <mda/common/audio.h> +#include <mda/common/resource.h> #include <mda/client/utility.h> #include <mdaaudiosampleeditor.h> #include <mmf/common/mmfcontrollerpluginresolver.h> @@ -52,6 +54,12 @@ #include <bautils.h> #include <f32file.h> + +const QString S60AudioCaptureSession::defaultMic("Default Mic"); +const QString S60AudioCaptureSession::voiceCall("Voice Call"); +const QString S60AudioCaptureSession::fmRadio("FM Radio"); + + S60AudioCaptureSession::S60AudioCaptureSession(QObject *parent): QObject(parent) , m_recorderUtility(NULL) @@ -60,7 +68,12 @@ S60AudioCaptureSession::S60AudioCaptureSession(QObject *parent): , m_audioCodeclist(QHash<QString, CodecData>()) , m_error(QMediaRecorder::NoError) , m_isMuted(false) + , m_audioEndpoint(S60AudioCaptureSession::defaultMic) { +#ifdef AUDIOINPUT_ROUTING + m_audioInput = NULL; + m_setActiveEndPoint = FALSE; +#endif //AUDIOINPUT_ROUTING TRAPD(err, initializeSessionL()); setError(err); } @@ -71,6 +84,9 @@ void S60AudioCaptureSession::initializeSessionL() updateAudioContainersL(); populateAudioCodecsDataL(); setDefaultSettings(); +#ifdef AUDIOINPUT_ROUTING + initAudioInputs(); +#endif User::LeaveIfError(m_fsSession.Connect()); m_captureState = EInitialized; emit stateChanged(m_captureState); @@ -89,6 +105,7 @@ void S60AudioCaptureSession::setError(TInt aError) QString symbianError; symbianError.append("Symbian:"); symbianError.append(QString::number(m_error)); + stop(); emit error(recorderError, symbianError); } @@ -121,7 +138,10 @@ QMediaRecorder::Error S60AudioCaptureSession::fromSymbianErrorToMultimediaError( S60AudioCaptureSession::~S60AudioCaptureSession() { - delete m_recorderUtility; + //stop the utility before deleting it + stop(); + if (m_recorderUtility) + delete m_recorderUtility; m_fsSession.Close(); } @@ -333,16 +353,120 @@ void S60AudioCaptureSession::stop() return; m_recorderUtility->Stop(); + +#ifdef AUDIOINPUT_ROUTING + //delete audio input instance before closing the utility. + if (m_audioInput) + { + delete m_audioInput; + m_audioInput = NULL; + } +#endif //AUDIOINPUT_ROUTING + m_recorderUtility->Close(); m_captureState = ERecordComplete; emit stateChanged(m_captureState); } -void S60AudioCaptureSession::setCaptureDevice(const QString &deviceName) +#ifdef AUDIOINPUT_ROUTING + +void S60AudioCaptureSession::initAudioInputs() +{ + m_audioInputs[S60AudioCaptureSession::defaultMic] = QString("Microphone associated with the currently active speaker."); + m_audioInputs[S60AudioCaptureSession::voiceCall] = QString("Audio stream associated with the current phone call."); + m_audioInputs[S60AudioCaptureSession::fmRadio] = QString("Audio of the currently tuned FM radio station."); +} + +#endif //AUDIOINPUT_ROUTING + +void S60AudioCaptureSession::setActiveEndpoint(const QString& audioEndpoint) +{ + if (!m_audioInputs.keys().contains(audioEndpoint)) + return; + + if (activeEndpoint().compare(audioEndpoint) != 0) { + m_audioEndpoint = audioEndpoint; + m_setActiveEndPoint = TRUE; + } +} + +QList<QString> S60AudioCaptureSession::availableEndpoints() const +{ + return m_audioInputs.keys(); +} + +QString S60AudioCaptureSession::endpointDescription(const QString& name) const +{ + if (m_audioInputs.keys().contains(name)) + return m_audioInputs.value(name); + return QString(); +} + +QString S60AudioCaptureSession::activeEndpoint() const { - m_captureDevice = deviceName; + QString inputSourceName = NULL; +#ifdef AUDIOINPUT_ROUTING + if (m_audioInput) { + CAudioInput::TAudioInputArray input = m_audioInput->AudioInput(); + inputSourceName = qStringFromTAudioInputPreference(input[0]); + } +#endif //AUDIOINPUT_ROUTING + return inputSourceName; +} + +QString S60AudioCaptureSession::defaultEndpoint() const +{ + return QString(S60AudioCaptureSession::defaultMic); } +#ifdef AUDIOINPUT_ROUTING + +void S60AudioCaptureSession::doSetAudioInputL(const QString& name) +{ + TInt err(KErrNone); + + if (!m_recorderUtility) + return; + + CAudioInput::TAudioInputPreference input = CAudioInput::EDefaultMic; + + if (name.compare(S60AudioCaptureSession::voiceCall) == 0) + input = CAudioInput::EVoiceCall; +// commented because they are not supported on 9.2 + else if (name.compare(S60AudioCaptureSession::fmRadio) == 0) + input = CAudioInput::EFMRadio; + else // S60AudioCaptureSession::defaultMic + input = CAudioInput::EDefaultMic; + + RArray<CAudioInput::TAudioInputPreference> inputArray; + inputArray.Append(input); + + if (m_audioInput){ + TRAP(err,m_audioInput->SetAudioInputL(inputArray.Array())); + + if (err == KErrNone) { + emit activeEndpointChanged(name); + } + else{ + setError(err); + } + } + inputArray.Close(); +} + + +QString S60AudioCaptureSession::qStringFromTAudioInputPreference(CAudioInput::TAudioInputPreference input) const +{ + if (input == CAudioInput::EVoiceCall) + return S60AudioCaptureSession::voiceCall; + else if (input == CAudioInput::EFMRadio) + return S60AudioCaptureSession::fmRadio; + else + return S60AudioCaptureSession::defaultMic; // CAudioInput::EDefaultMic +} +#endif //AUDIOINPUT_ROUTING + + void S60AudioCaptureSession::MoscoStateChangeEvent(CBase* aObject, TInt aPreviousState, TInt aCurrentState, TInt aErrorCode) { @@ -350,7 +474,9 @@ void S60AudioCaptureSession::MoscoStateChangeEvent(CBase* aObject, TRAPD(err, MoscoStateChangeEventL(aObject, aPreviousState, aCurrentState, NULL)); setError(err); } - setError(aErrorCode); + else { + setError(aErrorCode); + } } void S60AudioCaptureSession::MoscoStateChangeEventL(CBase* aObject, @@ -364,7 +490,8 @@ void S60AudioCaptureSession::MoscoStateChangeEventL(CBase* aObject, if(aPreviousState == CMdaAudioClipUtility::ENotReady) { applyAudioSettingsL(); m_recorderUtility->SetGain(m_recorderUtility->MaxGain()); - m_recorderUtility->RecordL(); + TRAPD(err, m_recorderUtility->RecordL()); + setError(err); m_captureState = EOpenCompelete; emit stateChanged(m_captureState); } @@ -504,7 +631,24 @@ void S60AudioCaptureSession::populateAudioCodecsDataL() void S60AudioCaptureSession::applyAudioSettingsL() { - if (!m_recorderUtility || m_format.codec() == "AMR") + + if (!m_recorderUtility) + return; + +#ifdef AUDIOINPUT_ROUTING + //CAudioInput needs to be re-initialized everytime recording starts + if (m_audioInput) { + delete m_audioInput; + m_audioInput = NULL; + } + + if (m_setActiveEndPoint) { + m_audioInput = CAudioInput::NewL(*m_recorderUtility); + doSetAudioInputL(m_audioEndpoint); + } +#endif //AUDIOINPUT_ROUTING + + if (m_format.codec() == "AMR") return; TFourCC fourCC = m_audioCodeclist.value(m_format.codec()).fourCC; |