summaryrefslogtreecommitdiff
path: root/PluginControlInterfacePulse/include/ControlSender.h
diff options
context:
space:
mode:
Diffstat (limited to 'PluginControlInterfacePulse/include/ControlSender.h')
-rw-r--r--PluginControlInterfacePulse/include/ControlSender.h334
1 files changed, 334 insertions, 0 deletions
diff --git a/PluginControlInterfacePulse/include/ControlSender.h b/PluginControlInterfacePulse/include/ControlSender.h
new file mode 100644
index 0000000..94b84af
--- /dev/null
+++ b/PluginControlInterfacePulse/include/ControlSender.h
@@ -0,0 +1,334 @@
+/**
+ * SPDX license identifier: MPL-2.0
+ *
+ * Copyright (C) 2011-2014, Wind River Systems
+ * Copyright (C) 2014, GENIVI Alliance
+ *
+ * This file is part of Pulse Audio Interface Control Plugin.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License (MPL), v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * For further information see http://www.genivi.org/.
+ *
+ * List of changes:
+ *
+ * 08.09.2014, Adrian Scarlat, First version of the code;
+ * porting from AM ver 1.x;
+ */
+
+#ifndef CONTROLSENDER_H_
+#define CONTROLSENDER_H_
+
+#include "ControlConfig.h"
+#include "control/IAmControlSend.h"
+#include <map>
+
+using namespace am;
+
+class ControlSenderPlugin: public IAmControlSend
+{
+public:
+ ControlSenderPlugin();
+
+ virtual ~ControlSenderPlugin();
+
+ am_Error_e startupController(IAmControlReceive* controlreceiveinterface);
+
+ void setControllerReady();
+
+ void setControllerRundown(const int16_t signal);
+
+ am_Error_e hookUserConnectionRequest(
+ const am_sourceID_t sourceID,
+ const am_sinkID_t sinkID,
+ am_mainConnectionID_t& mainConnectionID);
+
+ am_Error_e hookUserDisconnectionRequest(const am_mainConnectionID_t connectionID);
+
+ am_Error_e hookUserSetMainSinkSoundProperty(
+ const am_sinkID_t sinkID,
+ const am_MainSoundProperty_s& soundProperty);
+
+ am_Error_e hookUserSetMainSourceSoundProperty(
+ const am_sourceID_t sourceID,
+ const am_MainSoundProperty_s& soundProperty);
+
+ am_Error_e hookUserSetSystemProperty(const am_SystemProperty_s& property);
+
+ am_Error_e hookUserVolumeChange(
+ const am_sinkID_t SinkID,
+ const am_mainVolume_t newVolume);
+
+ am_Error_e hookUserVolumeStep(
+ const am_sinkID_t SinkID,
+ const int16_t increment);
+
+ am_Error_e hookUserSetSinkMuteState(
+ const am_sinkID_t sinkID,
+ const am_MuteState_e muteState);
+
+ am_Error_e hookSystemRegisterDomain(
+ const am_Domain_s& domainData,
+ am_domainID_t& domainID);
+
+ am_Error_e hookSystemDeregisterDomain(const am_domainID_t domainID);
+
+ void hookSystemDomainRegistrationComplete(const am_domainID_t domainID);
+
+ am_Error_e hookSystemRegisterSink(
+ const am_Sink_s& sinkData,
+ am_sinkID_t& sinkID);
+
+ am_Error_e hookSystemDeregisterSink(const am_sinkID_t sinkID);
+
+ am_Error_e hookSystemRegisterSource(
+ const am_Source_s& sourceData,
+ am_sourceID_t& sourceID);
+
+ am_Error_e hookSystemDeregisterSource(const am_sourceID_t sourceID);
+
+ am_Error_e hookSystemRegisterGateway(
+ const am_Gateway_s& gatewayData,
+ am_gatewayID_t& gatewayID);
+
+ am_Error_e hookSystemDeregisterGateway(const am_gatewayID_t gatewayID);
+
+ am_Error_e hookSystemRegisterCrossfader(
+ const am_Crossfader_s& crossfaderData,
+ am_crossfaderID_t& crossfaderID);
+
+ am_Error_e hookSystemDeregisterCrossfader(
+ const am_crossfaderID_t crossfaderID);
+
+ void hookSystemSinkVolumeTick(
+ const am_Handle_s handle,
+ const am_sinkID_t sinkID,
+ const am_volume_t volume);
+
+ void hookSystemSourceVolumeTick(
+ const am_Handle_s handle,
+ const am_sourceID_t sourceID,
+ const am_volume_t volume);
+
+ void hookSystemInterruptStateChange(
+ const am_sourceID_t sourceID,
+ const am_InterruptState_e interruptState);
+
+ void hookSystemSinkAvailablityStateChange(
+ const am_sinkID_t sinkID,
+ const am_Availability_s& availability);
+
+ void hookSystemSourceAvailablityStateChange(
+ const am_sourceID_t sourceID,
+ const am_Availability_s& availability);
+
+ void hookSystemDomainStateChange(
+ const am_domainID_t domainID,
+ const am_DomainState_e state);
+
+ void hookSystemReceiveEarlyData(const std::vector<am_EarlyData_s>& data);
+
+ void hookSystemSpeedChange(const am_speed_t speed);
+
+ void hookSystemTimingInformationChanged(
+ const am_mainConnectionID_t mainConnectionID,
+ const am_timeSync_t time);
+
+ void cbAckConnect(
+ const am_Handle_s handle,
+ const am_Error_e errorID);
+
+ void cbAckDisconnect(
+ const am_Handle_s handle,
+ const am_Error_e errorID);
+
+ void cbAckCrossFade(
+ const am_Handle_s handle,
+ const am_HotSink_e hostsink,
+ const am_Error_e error);
+
+ void cbAckSetSinkVolumeChange(
+ const am_Handle_s handle,
+ const am_volume_t volume,
+ const am_Error_e error);
+
+ void cbAckSetSourceVolumeChange(
+ const am_Handle_s handle,
+ const am_volume_t voulme,
+ const am_Error_e error);
+
+ void cbAckSetSourceState(
+ const am_Handle_s handle,
+ const am_Error_e error);
+
+ void cbAckSetSourceSoundProperty(
+ const am_Handle_s handle,
+ const am_Error_e error);
+
+ void cbAckSetSourceSoundProperties(
+ const am_Handle_s handle,
+ const am_Error_e error);
+
+ void cbAckSetSinkSoundProperty(
+ const am_Handle_s handle,
+ const am_Error_e error);
+
+ void cbAckSetSinkSoundProperties(
+ const am_Handle_s handle,
+ const am_Error_e error);
+
+ am_Error_e getConnectionFormatChoice(
+ const am_sourceID_t sourceID,
+ const am_sinkID_t sinkID,
+ const am_Route_s listRoute,
+ const std::vector<am_CustomConnectionFormat_t> listPossibleConnectionFormats,
+ std::vector<am_CustomConnectionFormat_t>& listPrioConnectionFormats);
+
+ void getInterfaceVersion(std::string& version) const;
+ void confirmCommandReady(const am_Error_e error);
+ void confirmRoutingReady(const am_Error_e error);
+ void confirmCommandRundown(const am_Error_e error);
+ void confirmRoutingRundown(const am_Error_e error);
+
+ am_Error_e hookSystemUpdateSink(
+ const am_sinkID_t sinkID,
+ const am_sinkClass_t sinkClassID,
+ const std::vector<am_SoundProperty_s>& listSoundProperties,
+ const std::vector<am_CustomConnectionFormat_t>& listConnectionFormats,
+ const std::vector<am_MainSoundProperty_s>& listMainSoundProperties);
+
+ am_Error_e hookSystemUpdateSource(
+ const am_sourceID_t sourceID,
+ const am_sourceClass_t sourceClassID,
+ const std::vector<am_SoundProperty_s>& listSoundProperties,
+ const std::vector<am_CustomConnectionFormat_t>& listConnectionFormats,
+ const std::vector<am_MainSoundProperty_s>& listMainSoundProperties);
+
+ am_Error_e hookSystemUpdateGateway(
+ const am_gatewayID_t gatewayID,
+ const std::vector<am_CustomConnectionFormat_t>& listSourceConnectionFormats,
+ const std::vector<am_CustomConnectionFormat_t>& listSinkConnectionFormats,
+ const std::vector<bool>& convertionMatrix);
+
+ void cbAckSetVolumes(
+ const am_Handle_s handle,
+ const std::vector<am_Volumes_s>& listVolumes,
+ const am_Error_e error);
+
+ void cbAckSetSinkNotificationConfiguration(
+ const am_Handle_s handle,
+ const am_Error_e error);
+
+ void cbAckSetSourceNotificationConfiguration(
+ const am_Handle_s handle,
+ const am_Error_e error);
+
+ void hookSinkNotificationDataChanged(
+ const am_sinkID_t sinkID,
+ const am_NotificationPayload_s& payload);
+
+ void hookSourceNotificationDataChanged(
+ const am_sourceID_t sourceID,
+ const am_NotificationPayload_s& payload);
+
+ am_Error_e hookUserSetMainSinkNotificationConfiguration(
+ const am_sinkID_t sinkID,
+ const am_NotificationConfiguration_s& notificationConfiguration);
+
+ am_Error_e hookUserSetMainSourceNotificationConfiguration(
+ const am_sourceID_t sourceID,
+ const am_NotificationConfiguration_s& notificationConfiguration);
+
+ void hookSystemNodeStateChanged(const NsmNodeState_e NodeStateId);
+
+ void hookSystemNodeApplicationModeChanged(
+ const NsmApplicationMode_e ApplicationModeId);
+
+ void hookSystemSessionStateChanged(
+ const std::string& sessionName,
+ const NsmSeat_e seatID,
+ const NsmSessionState_e sessionStateID);
+
+ NsmErrorStatus_e hookSystemLifecycleRequest(
+ const uint32_t Request,
+ const uint32_t RequestId);
+
+private:
+ bool isStaticRoutingEnabled() {return true;}
+
+ /**
+ * Load controller configuration file. The name and path of the configuration file
+ * should be identical to library (except the extensions which is .conf instead of .so)
+ */
+ am_Error_e loadConfig();
+
+ /**
+ * Apply some actions on top of main connection specified by (connectionID)
+ * If interrupt=true, the action like "disconnect" is reversible (e.g. when the main connection
+ * triggering this action, is destroyed, connectionID will be re-established, otherwise actions like "disconnect" are permanent)
+ * If inverse = true, action is inversely applied: (e.g. action = MUTE and inverse = true, we apply UNMUTE)
+ */
+ am_Error_e applyActionOnConnection(
+ am_mainConnectionID_t connectionID,
+ am_ConnectAction_s &action,
+ bool interrupt,
+ bool inverse,
+ bool force = false);
+
+ am_Error_e applyActionOnSubConnection(
+ am_mainConnectionID_t connectionID,
+ am_Connection_s subConnection,
+ am_ConnectAction_s &action,
+ bool interrupt,
+ bool inverse);
+
+ am_Error_e getStaticRoute(
+ const bool onlyfree,
+ const am_sourceID_t sourceID,
+ const am_sinkID_t sinkID,
+ std::vector<am_Route_s>& returnList);
+
+ am_Error_e getSourceInfo(
+ const am_sourceID_t sourceID,
+ am_Source_s &sourceData);
+
+/*
+ * TODO: REVIEW DESCRIPTION
+ * A mapping between connection and controller actions taken during connection.
+ * To be used to apply inverse actions during disconnection:
+ * am_mainConnectionID_t - the main connection request triggering the action
+ * am_connectionID_t - the sub-connection target of the action
+ * list of am_ConnectAction_s - actions to be applied on this connection
+ * in this list, only one action is not pending
+ * and the non pending action has the higher priority
+ * (e.g. disconnect > mute > decrease volume)
+ */
+ std::map<am_mainConnectionID_t,
+ std::map<am_mainConnectionID_t,
+ std::vector<am_ConnectAction_s> > > mConnectionID2Actions;
+/*
+ * A mapping between main connection and and the list of associated sub-connections.
+ * First element in the list has the same connectionID as the map key.
+ */
+ std::map<am_mainConnectionID_t,
+ std::vector<am_Connection_s> > mConnectionID2Subconnections;
+
+ IAmControlReceive *mControlReceiveInterface;
+ std::vector<am_Route_s> mStaticRoutes;
+ std::vector<am_MixingRule_s> mMixingRules;
+
+/*
+ * map of structures registered during initialization/configuration phase;
+ * DO NOT USE DIRECTLY
+ */
+ std::map<std::string, am_Source_s> mNames2Sources;
+ std::map<std::string, am_Sink_s> mNames2Sinks;
+ std::map<std::string, am_SinkClass_s> mNames2SinksClasses;
+ std::map<std::string, am_SourceClass_s> mNames2SourceClasses;
+ std::map<std::string, am_Domain_s> mNames2Domains;
+ std::map<std::string, am_Gateway_s> mNames2Gateways;
+};
+
+#endif /* CONTROLSENDER_H_ */