diff -r f9bb0fca356a -r 0fd27995241b javauis/amms_qt/mmacontrol/src/cammsaudiooutputcontrol.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/amms_qt/mmacontrol/src/cammsaudiooutputcontrol.cpp Tue May 11 16:07:20 2010 +0300 @@ -0,0 +1,435 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Manipulates the audio output mode. +* +*/ + +// INCLUDE FILES +#include +#include +#include "cammsaudiooutputcontrol.h" +#include +#include +#include +#include +#include +#include +#include +// CONSTANTS +_LIT(KErrAudioOutputControlError, "AMMS AudioOutputControl error: %d"); +const TInt KEventMessageSize = 64; +const TInt KNoPriference = 0; +const TInt KAllSpeakers = 1; +const TInt KNoAudioOutput = 2; +const TInt KAudioEarpiece = 3; +const TInt KAudioLoudspeaker = 4; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CAMMSAudioOutputControl::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CAMMSAudioOutputControl* CAMMSAudioOutputControl::NewLC(CMMAPlayer* aPlayer) +{ + CAMMSAudioOutputControl* self = new(ELeave) CAMMSAudioOutputControl(aPlayer); + + CleanupStack::PushL(self); + + self->ConstructL(); + + return self; +} + +// Destructor +CAMMSAudioOutputControl::~CAMMSAudioOutputControl() +{ + LOG( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::~"); + if (iAudioOutput) + { + iAudioOutput->UnregisterObserver(*this); + delete iAudioOutput; + } + if (iAccMonitor) + { + iAccMonitor ->StopObserving(); + delete iAccMonitor; + } +} + +//set java AudioOutput object +void CAMMSAudioOutputControl::SetJavaAudioOutputObject(jobject object) +{ + LOG( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::SetJavaAudioOutputObject "); + iJavaAudioOutputObj = object; + // JNI interface pointer can't be passed to different thread, so + // it is needed to get valid JNI interface pointer for Event Server thread + // iJni = JniEnvWrapper::GetValidJniRef(); +} + +void CAMMSAudioOutputControl::ResetJavaAudioOutputObject() +{ + LOG( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::ResetJavaAudioOutputObject "); + jmethodID setOutputModeID = iJni->GetMethodID( + iJni->GetObjectClass(iJavaAudioOutputObj), + "setOutputMode", + "(I)V"); + + jint jpref = (jint)GetCurrentPrefInt(); + iJni->CallVoidMethod(iJavaAudioOutputObj,setOutputModeID,jpref); +} + +// ----------------------------------------------------------------------------- +// CAMMSAudioOutputControl::SetAudioOutput +// Sets the preference using a linear point scale between 0 and 4. +// ----------------------------------------------------------------------------- +// +TInt CAMMSAudioOutputControl::SetAudioOutput(TInt aPreference) +{ + LOG1( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::SetAudioOutputL %d", aPreference); + + TInt temppreference = 0; + LOG( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::SetAudioOutputL After __ASSERT_DEBUG"); + // Set a new preference only if it differs from the previous one. + if (aPreference != iRoutingUserPreference) + { + switch (aPreference) + { + case KNoPriference: + { + temppreference = SetAudioOutputToMmf(CAudioOutput::ENoPreference); + } + break; + case KAllSpeakers: + { + temppreference = SetAudioOutputToMmf(CAudioOutput::EAll); + } + break; + case KNoAudioOutput: + { + temppreference = SetAudioOutputToMmf(CAudioOutput::ENoOutput); + } + break; + case KAudioEarpiece: + { + temppreference = SetAudioOutputToMmf(CAudioOutput::EPrivate); + } + break; + case KAudioLoudspeaker: + { + temppreference = SetAudioOutputToMmf(CAudioOutput::EPublic); + } + break; + default: + break; + } + } + + LOG1( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::SetAudioOutputL - = %d", temppreference); + return temppreference; + +} + +// ----------------------------------------------------------------------------- +// CAMMSAudioOutputControl::GetAudioOutput +// Gets the preference. +// ----------------------------------------------------------------------------- +TInt CAMMSAudioOutputControl::GetAudioOutput() +{ + LOG1( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::GetAudioOutput %d", (TInt)iRoutingUserPreference); + return (TInt)iRoutingUserPreference; +} + +// ---------------------------------------------------------------------------------------- +// CAMMSAudioOutputControl::GetCurrentPreference +// Gets the preference.if user preference is not set return the current device preference +// ---------------------------------------------------------------------------------------- +void CAMMSAudioOutputControl::GetCurrentPreference() +{ + // reset the java AudioOutput object with current mode + ResetJavaAudioOutputObject(); +} + +// ---------------------------------------------------------------------------------------- +// CAMMSAudioOutputControl::GetCurrentPrefInt +// Gets the preference.if user preference is not set return the current device preference in TInt form +// ---------------------------------------------------------------------------------------- + +TInt CAMMSAudioOutputControl::GetCurrentPrefInt() +{ + TInt pref ; + // get the value of current preference + if (iRoutingUserPreference == CAudioOutput::ENoPreference) + { + LOG1( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::GetCurrentPrefInt_if %d", (TInt)iDefaultDevicePreference); + pref = GetDeviceDefaultPreference(); + } + else + { + LOG1( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::GetCurrentPrefInt_else %d", (TInt)iRoutingUserPreference); + pref = (TInt)iRoutingUserPreference; + } + return pref; +} +// ---------------------------------------------------------------------------------------- +// CAMMSAudioOutputControl::GetDeviceDefaultPreference +// Gets the current device preference used as default +// ---------------------------------------------------------------------------------------- +TInt CAMMSAudioOutputControl::GetDeviceDefaultPreference() +{ + LOG1( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::GetDeviceDefaultPreference %d", (TInt)iDefaultDevicePreference); + array.Reset(); + TInt temp = 0; + TRAPD(err,iAccMonitor->GetConnectedAccessoriesL(array)); + if (err) + { + temp = -1; + } + TInt count = array.Count(); + if (count == 0) + { + temp = (TInt)CAudioOutput::EPublic; + } + LOG1( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::GetDeviceDefaultPreference :RConnectedAccessories count = %d",count); + for (TInt i = 0; i != count; i++) + { + TAccMonCapability deviceType = array[ i ]->AccDeviceType(); + if ((deviceType == KAccMonHeadset)||(deviceType == KAccMonBluetooth)) + { + LOG( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::CreateHeadsetStateObserverL info = Headset Connected "); + temp = (TInt)CAudioOutput::EPrivate; + break; + } + + } + return temp; +} +// ----------------------------------------------------------------------------- +// CAMMSAudioOutputControl::StateChanged +// Called when player state is changed. +// ----------------------------------------------------------------------------- +void CAMMSAudioOutputControl::StateChanged(TInt aState) +{ + LOG1( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::StateChanged +, state = %d", aState); + playerState = (CMMAPlayer::TPlayerState)aState; + if (aState == CMMAPlayer::EStarted) + { + NotifyJavaOnChange(); + } +} + +const TDesC& CAMMSAudioOutputControl::ClassName() const +{ + LOG( EJavaAMMS, EInfo, "CAMMSAudioOutputControl::ClassName"); + return KAMMSAudioOutputControl; +} + +// ----------------------------------------------------------------------------- +// CAMMSAudioOutputControl::SetPriorityToMmf +// Scales the given AMMS priority to MMF priority and sets it to MMF. +// ----------------------------------------------------------------------------- +TInt CAMMSAudioOutputControl::SetAudioOutputToMmf(CAudioOutput::TAudioOutputPreference aPref) +{ + LOG( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::SetAudioOutputToMmfL +"); + CAudioOutput::TAudioOutputPreference tempPreference = iRoutingUserPreference ; + iRoutingUserPreference = aPref; + TRAPD(err,CreateNativeAudioOutputControlL(); + iAudioOutput->SetAudioOutputL(aPref)); + if (KErrNone != err) + { + iRoutingUserPreference = tempPreference; + TBuf errorMessage; + errorMessage.Format(KErrAudioOutputControlError, err); + iPlayer->PostStringEvent(CMMAPlayerEvent::EError, errorMessage); + } + // if during play user set a preference event should be sent to java + if (playerState == CMMAPlayer::EStarted) + { + NotifyJavaOnChange(); + } + return (TInt)iRoutingUserPreference; +} +// ----------------------------------------------------------------------------- +// CAMMSAudioOutputControl::DefaultAudioOutputChanged +// MAudioOutputObserver's function is implemented to notify about the change in routing preference +// ----------------------------------------------------------------------------- + +void CAMMSAudioOutputControl::DefaultAudioOutputChanged(CAudioOutput& /*aAudioOutput*/, + CAudioOutput::TAudioOutputPreference /*aNewDefault*/) +{ + LOG( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::DefaultAudioOutputChanged "); + +} + +void CAMMSAudioOutputControl::NotifyJavaOnChange() +{ + TInt tempPref = GetCurrentPrefInt(); + if (iCurrentPreference == tempPref) + { + LOG( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::NotifyJavaOnChange - No Event "); + return; + } + //reset the java side object with the current iCurrentActualPreference + ResetJavaAudioOutputObject(); + iCurrentPreference = tempPref; + LOG( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::NotifyJavaOnChange - Sending Event "); + iPlayer->PostObjectEvent(CMMAPlayerEvent::EAudioOutputPreferenceChangeEvent, iJavaAudioOutputObj); +} + +void CAMMSAudioOutputControl::AccMonitorObserverError(TInt /*aError*/) +{ + LOG( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::AccMonitorObserverError"); +} +// ----------------------------------------------------------------------------- +// CAMMSAudioOutputControl::CAMMSAudioOutputControl +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +CAMMSAudioOutputControl::CAMMSAudioOutputControl(CMMAPlayer* aPlayer) + : CAMMSControl(aPlayer), + iRoutingUserPreference(CAudioOutput::ENoPreference) +{ +} +// HEADSET CONNECTED OR NOT +void CAMMSAudioOutputControl::ConnectedL(CAccMonitorInfo* aAccessoryInfo) +{ // Reserve memory for the accessory information instance if necessary + LOG( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::ConnectedL +"); + if (!iAccessoryInfo) + { + iAccessoryInfo = CAccMonitorInfo::NewL(); + LOG( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::ConnectedL iAccessoryInfo created"); + } + // Otherwise just reset accessory information instance + else + { + iAccessoryInfo->Reset(); + } + iAccessoryInfo->CopyL(aAccessoryInfo); + TAccMonCapability deviceType = iAccessoryInfo->AccDeviceType() ; + if ((deviceType == KAccMonHeadset) || (deviceType == KAccMonBluetooth)) + { + LOG( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::DisconnectedL: Headset connected"); + //send a callback + if (iRoutingUserPreference == (TInt)(CAudioOutput::ENoPreference)) + { + NotifyJavaOnChange(); + } + } + LOG( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::ConnectedL -"); +} + + +void CAMMSAudioOutputControl::DisconnectedL(CAccMonitorInfo* aAccessoryInfo) +{ // Reserve memory for the accessory information instance if necessary + + LOG( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::DisconnectedL +"); + if (!iAccessoryInfo) + { + iAccessoryInfo = CAccMonitorInfo::NewL(); + LOG( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::DisconnectedL: iAccessoryInfo created"); + } + else + { + iAccessoryInfo->Reset(); + } + iAccessoryInfo->CopyL(aAccessoryInfo); + TAccMonCapability deviceType = iAccessoryInfo->AccDeviceType(); + if ((deviceType == KAccMonHeadset)||(deviceType == KAccMonBluetooth)) + { + LOG( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::DisconnectedL: Headset Disconnected"); + //send a callback + if (iRoutingUserPreference == (TInt)(CAudioOutput::ENoPreference)) + { + NotifyJavaOnChange(); + } + } + LOG( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::DisconnectedL -"); +} + +// start observing headset connection disconnection + +void CAMMSAudioOutputControl::CreateHeadsetStateObserverL() +{ + // Headset connection and disconnection + iAccessoryInfo = NULL; + capabilityArray.Append(KAccMonHeadset); + capabilityArray.Append(KAccMonBluetooth); + + iAccMonitor = CAccMonitor::NewL(); + iDefaultDevicePreference = (CAudioOutput::TAudioOutputPreference)GetDeviceDefaultPreference(); + iCurrentPreference = (TInt)iDefaultDevicePreference; + TBool isObserving = iAccMonitor->IsObserving(); + if (!isObserving) + { + iAccMonitor->StartObservingL(this, capabilityArray); + } +} + +// end CreateHeadsetStateObserver + +// ----------------------------------------------------------------------------- +// CAMMSPlayerStateListener::ConstructL +// 2nd phase constructor. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +void CAMMSAudioOutputControl::ConstructL() +{ + LOG( EJavaAMMS, EInfo, "AMMS::CAMMSAudioOutputControl::ConstructL +"); + // create an observer to notify the state of headset + //and initialize iDefaultDevicePreference with CAudioOutput::EPrivate if headset is connected. + CreateHeadsetStateObserverL(); + iPlayer->AddStateListenerL(this); +} + +void CAMMSAudioOutputControl::CreateNativeAudioOutputControlL() +{ + if (iAudioOutput) + { + return; + } + + if (iPlayer->Type() == KMMAMIDIPlayer) + { + CMMAMIDIPlayer* mmaMIDIPlayer = + reinterpret_cast< CMMAMIDIPlayer* >(iPlayer); + iAudioOutput = CAudioOutput::NewL(*(mmaMIDIPlayer->MidiClient())); + } + else if (iPlayer->Type() == KMMAAudioPlayer) + { + MCustomCommand* customCommandUtility = (MCustomCommand *)CreateCustomCommandUtilityL(); + // Create the CAudioOutput Object to handle the audio routing + iAudioOutput = CAudioOutput::NewL(*customCommandUtility); + } + else if (iPlayer->Type() == KMMAVideoPlayer) + { + CMMAVideoPlayer* mmaVideoPlayer = + reinterpret_cast< CMMAVideoPlayer* >(iPlayer); + RMMFController& mmfController = mmaVideoPlayer->Controller(); + MCustomCommand* customCommandUtility = + CAMMSCustomCommandUtility::NewL(mmfController); + iAudioOutput = CAudioOutput::NewL(*customCommandUtility); + } + + if(iAudioOutput) + { + iAudioOutput->RegisterObserverL(*this); + } + else + { + User::Leave(KErrNotSupported); + } +} + + +// End of File