diff -r 71c436fe3ce0 -r 4376525cdefb javauis/amms_akn/mmacontrol/src/cammsaudiooutputcontrol.cpp --- a/javauis/amms_akn/mmacontrol/src/cammsaudiooutputcontrol.cpp Wed Jun 09 09:34:07 2010 +0300 +++ b/javauis/amms_akn/mmacontrol/src/cammsaudiooutputcontrol.cpp Mon Jun 21 15:32:50 2010 +0300 @@ -19,6 +19,7 @@ #include #include #include "cammsaudiooutputcontrol.h" +#include "cmmavolumecontrol.h" #include #include #include @@ -58,7 +59,6 @@ DEBUG("AMMS::CAMMSAudioOutputControl::~"); if (iAudioOutput) { - iAudioOutput->UnregisterObserver(*this); delete iAudioOutput; } if (iAccMonitor) @@ -189,14 +189,14 @@ TInt CAMMSAudioOutputControl::GetDeviceDefaultPreference() { DEBUG_INT("AMMS::CAMMSAudioOutputControl::GetDeviceDefaultPreference %d", (TInt)iDefaultDevicePreference); - array.Reset(); + iArray.Reset(); TInt temp = 0; - TRAPD(err,iAccMonitor->GetConnectedAccessoriesL(array)); + TRAPD(err,iAccMonitor->GetConnectedAccessoriesL(iArray)); if (err) { temp = -1; } - TInt count = array.Count(); + TInt count = iArray.Count(); if (count == 0) { temp = (TInt)CAudioOutput::EPublic; @@ -204,8 +204,8 @@ DEBUG_INT("AMMS::CAMMSAudioOutputControl::GetDeviceDefaultPreference :RConnectedAccessories count = %d",count); for (TInt i = 0; i != count; i++) { - TAccMonCapability deviceType = array[ i ]->AccDeviceType(); - if ((deviceType == KAccMonHeadset)||(deviceType == KAccMonBluetooth)) + TAccMonCapability deviceType = iArray[ i ]->AccDeviceType(); + if (deviceType == KAccMonHeadset) { DEBUG("AMMS::CAMMSAudioOutputControl::CreateHeadsetStateObserverL info = Headset Connected "); temp = (TInt)CAudioOutput::EPrivate; @@ -222,7 +222,7 @@ void CAMMSAudioOutputControl::StateChanged(TInt aState) { DEBUG_INT("AMMS::CAMMSAudioOutputControl::StateChanged +, state = %d", aState); - playerState = (CMMAPlayer::TPlayerState)aState; + iPlayerState = (CMMAPlayer::TPlayerState)aState; if (aState == CMMAPlayer::EStarted) { NotifyJavaOnChange(); @@ -242,35 +242,51 @@ TInt CAMMSAudioOutputControl::SetAudioOutputToMmf(CAudioOutput::TAudioOutputPreference aPref) { DEBUG("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); + return (TInt)iRoutingUserPreference; + } + iRoutingUserPreference = aPref; + if (iVolumeControl) + { + TRAPD(err, + { + // If current audio o/p preference is default and Headset or + // Bluetooth device is connected or if preference is private then + // set the audio preference as private to volume control else set it + // as public + if ( (iRoutingUserPreference == (TInt)(CAudioOutput::ENoPreference) && + GetDeviceDefaultPreference() == (TInt)(CAudioOutput::EPrivate))|| + iRoutingUserPreference == (TInt)(CAudioOutput::EPrivate)) + { + iVolumeControl->SetAudioOutputPreferenceL( + (TInt)(CAudioOutput::EPrivate)); + } + else + { + iVolumeControl->SetAudioOutputPreferenceL( + (TInt)(CAudioOutput::EPublic)); + } + }); + if (KErrNone > err) + { + 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) + if (iPlayerState == 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*/) -{ - DEBUG("AMMS::CAMMSAudioOutputControl::DefaultAudioOutputChanged "); - -} void CAMMSAudioOutputControl::NotifyJavaOnChange() { @@ -287,9 +303,12 @@ iPlayer->PostObjectEvent(CMMAPlayerEvent::EAudioOutputPreferenceChangeEvent, iJavaAudioOutputObj); } -void CAMMSAudioOutputControl::AccMonitorObserverError(TInt /*aError*/) +void CAMMSAudioOutputControl::AccMonitorObserverError(TInt aError) { DEBUG("AMMS::CAMMSAudioOutputControl::AccMonitorObserverError"); + TBuf errorMessage; + errorMessage.Format(KErrAudioOutputControlError, aError); + iPlayer->PostStringEvent(CMMAPlayerEvent::EError, errorMessage); } // ----------------------------------------------------------------------------- // CAMMSAudioOutputControl::CAMMSAudioOutputControl @@ -303,23 +322,22 @@ } // HEADSET CONNECTED OR NOT void CAMMSAudioOutputControl::ConnectedL(CAccMonitorInfo* aAccessoryInfo) -{ // Reserve memory for the accessory information instance if necessary +{ DEBUG("AMMS::CAMMSAudioOutputControl::ConnectedL +"); - if (!iAccessoryInfo) - { - iAccessoryInfo = CAccMonitorInfo::NewL(); - DEBUG("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)) + TAccMonCapability deviceType = aAccessoryInfo->AccDeviceType() ; + if (deviceType == KAccMonHeadset) { DEBUG("AMMS::CAMMSAudioOutputControl::DisconnectedL: Headset connected"); + // If audio o/p preference is default set the preference as private + // to volume control + if ( iRoutingUserPreference == (TInt)(CAudioOutput::ENoPreference)) + { + if (iVolumeControl) + { + iVolumeControl->SetAudioOutputPreferenceL( + (TInt)(CAudioOutput::EPrivate)); + } + } //send a callback if (iRoutingUserPreference == (TInt)(CAudioOutput::ENoPreference)) { @@ -331,23 +349,25 @@ void CAMMSAudioOutputControl::DisconnectedL(CAccMonitorInfo* aAccessoryInfo) -{ // Reserve memory for the accessory information instance if necessary - +{ DEBUG("AMMS::CAMMSAudioOutputControl::DisconnectedL +"); - if (!iAccessoryInfo) - { - iAccessoryInfo = CAccMonitorInfo::NewL(); - DEBUG("AMMS::CAMMSAudioOutputControl::DisconnectedL: iAccessoryInfo created"); - } - else - { - iAccessoryInfo->Reset(); - } - iAccessoryInfo->CopyL(aAccessoryInfo); - TAccMonCapability deviceType = iAccessoryInfo->AccDeviceType(); - if ((deviceType == KAccMonHeadset)||(deviceType == KAccMonBluetooth)) + TAccMonCapability deviceType = aAccessoryInfo->AccDeviceType(); + if (deviceType == KAccMonHeadset) { DEBUG("AMMS::CAMMSAudioOutputControl::DisconnectedL: Headset Disconnected"); + // If audio o/p preference is default and no accessories is connected or + // o/p preference is not private then set the preference as public to + // volume control + if ( (iRoutingUserPreference == (TInt)(CAudioOutput::ENoPreference) && + GetDeviceDefaultPreference() == (TInt)(CAudioOutput::EPublic)) || + iRoutingUserPreference != (TInt)(CAudioOutput::EPrivate)) + { + if (iVolumeControl) + { + iVolumeControl->SetAudioOutputPreferenceL( + (TInt)(CAudioOutput::EPublic)); + } + } //send a callback if (iRoutingUserPreference == (TInt)(CAudioOutput::ENoPreference)) { @@ -362,12 +382,12 @@ void CAMMSAudioOutputControl::CreateHeadsetStateObserverL() { // Headset connection and disconnection - iAccessoryInfo = NULL; + RAccMonCapabilityArray capabilityArray; capabilityArray.Append(KAccMonHeadset); - capabilityArray.Append(KAccMonBluetooth); iAccMonitor = CAccMonitor::NewL(); - iDefaultDevicePreference = (CAudioOutput::TAudioOutputPreference)GetDeviceDefaultPreference(); + iDefaultDevicePreference = (CAudioOutput::TAudioOutputPreference) + GetDeviceDefaultPreference(); iCurrentPreference = (TInt)iDefaultDevicePreference; TBool isObserving = iAccMonitor->IsObserving(); if (!isObserving) @@ -387,9 +407,34 @@ { DEBUG("AMMS::CAMMSAudioOutputControl::ConstructL +"); // create an observer to notify the state of headset - //and initialize iDefaultDevicePreference with CAudioOutput::EPrivate if headset is connected. + // and initialize iDefaultDevicePreference with CAudioOutput::EPrivate + // if headset is connected. CreateHeadsetStateObserverL(); iPlayer->AddStateListenerL(this); + // set the current preference to volume control + iVolumeControl = GetVolumeControl(); + if (iVolumeControl) + { + iVolumeControl->SetAudioOutputPreferenceL(iCurrentPreference); + } + +} + +CMMAVolumeControl* CAMMSAudioOutputControl::GetVolumeControl() +{ + // loop through all the available controls of player and return + // volume control if found else return null. + TInt count(iPlayer->ControlCount()); + for (TInt i(0); i < count; i++) + { + CMMAControl* control = iPlayer->Control(i); + // Check that if this control supports volume control + if (control->ClassName() == KMMAVolumeControlName) + { + return static_cast< CMMAVolumeControl* >(control); + } + } + return 0; } void CAMMSAudioOutputControl::CreateNativeAudioOutputControlL() @@ -420,15 +465,6 @@ CAMMSCustomCommandUtility::NewL(mmfController); iAudioOutput = CAudioOutput::NewL(*customCommandUtility); } - - if (iAudioOutput) - { - iAudioOutput->RegisterObserverL(*this); - } - else - { - User::Leave(KErrNotSupported); - } }