summaryrefslogtreecommitdiff
path: root/PluginControlInterfacePulse/include/ControlConfig.h
diff options
context:
space:
mode:
Diffstat (limited to 'PluginControlInterfacePulse/include/ControlConfig.h')
-rw-r--r--PluginControlInterfacePulse/include/ControlConfig.h221
1 files changed, 221 insertions, 0 deletions
diff --git a/PluginControlInterfacePulse/include/ControlConfig.h b/PluginControlInterfacePulse/include/ControlConfig.h
new file mode 100644
index 0000000..8648c77
--- /dev/null
+++ b/PluginControlInterfacePulse/include/ControlConfig.h
@@ -0,0 +1,221 @@
+/**
+ * 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 CONTROLCONFIG_H_
+#define CONTROLCONFIG_H_
+
+#include "audiomanagertypes.h"
+#include <string>
+
+
+/* Defines */
+
+#define SOURCE_TYPE_INTERRUPT (1)
+#define SOURCE_TYPE_MAIN (2)
+#define SINK_TYPE_MAIN (2)
+
+#define ACTION_TYPE_STR(x) (\
+(x == AT_MUTE) ? "AT_MUTE" : \
+(x == AT_UNMUTE) ? "AT_UNMUTE" : \
+(x == AT_PAUSE) ? "AT_PAUSE" : \
+(x == AT_RESUME) ? "AT_RESUME" : \
+(x == AT_VOLUME_DECREASE) ? "AT_VOLUME_DECREASE" : \
+(x == AT_VOLUME_INCREASE) ? "AT_VOLUME_INCREASE" : \
+(x == AT_DISCONNECT) ? "AT_DISCONNECT" : \
+(x == AT_CONNECT) ? "AT_CONNECT" : \
+#x":Unknown")
+
+
+/**
+ * Action types sorted by priority: lowest - the most important
+ */
+enum am_ActionType_e
+{
+ AT_DISCONNECT=0,
+ AT_PAUSE=1,
+ AT_MUTE=2,
+ AT_UNMUTE=3,
+ AT_VOLUME_DECREASE=4,
+ AT_CONNECT=5,
+ AT_RESUME=6,
+ AT_VOLUME_INCREASE=7,
+ AT_MAX
+};
+
+
+enum am_ActionTarget_e
+{
+ ATG_SINK=0,
+ ATG_SOURCE=1,
+ ATG_GW_SINK=2,
+ ATG_GW_SOURCE=3,
+ ATG_MAX
+};
+
+
+/*
+ * e.g. Entertainment : Entertainment>HifiAudio Sink:Disconnect:Pulse:Source
+ */
+struct am_ConnectAction_s {
+ bool interrupting; /* The action is triggered by an interrupting source class: e.g. TTS, Phone */
+ bool pending; /* The action was not applied yet. */
+ /* e.g. there is an action with higher priority which is already applied to this connection */
+ am::am_sourceClass_t activeSourceClassID; /* The name of the source class of existing connections - the one to be controlled */
+ am::am_sinkID_t activeSinkID; /* The name of the sink of existing connections - the one to be controlled */
+ am_ActionType_e actionType; /* What kind of action the controller decided: mute, pause, volume adjustment */
+ am::am_domainID_t targetDomain; /* The domain of target element */
+ am_ActionTarget_e targetElement; /* What element is controlled: sink, source or gateway */
+ /**
+ * Define a list of inverse actions: if the controller applied an action during connection procedure,
+ * the inverse action (of any) shall be applied on disconnect.
+ */
+ static am_ActionType_e inverseAction(am_ActionType_e type)
+ {
+ switch(type)
+ {
+ case AT_MUTE: return (AT_UNMUTE);
+ case AT_UNMUTE: return (AT_MUTE);
+
+ case AT_PAUSE: return (AT_RESUME);
+ case AT_RESUME: return (AT_PAUSE);
+
+ case AT_VOLUME_DECREASE: return (AT_VOLUME_INCREASE);
+ case AT_VOLUME_INCREASE: return (AT_VOLUME_DECREASE);
+
+ case AT_DISCONNECT: return (AT_CONNECT);//disconnection is not an invertible action; maybe it is
+ case AT_CONNECT: return (AT_MAX);//connection is not an invertible action
+
+ default: return (AT_MAX); // default return value
+ }
+ }
+
+
+ /**
+ * Compare everything except action type.
+ */
+ bool weekCompare(struct am_ConnectAction_s &o) const
+ {
+ return ((this->activeSourceClassID == o.activeSourceClassID) &&
+ (this->activeSinkID == o.activeSinkID) &&
+ (this->targetDomain == o.targetDomain) &&
+ (this->targetElement == o.targetElement));
+ }
+
+ /**
+ * Compare action type
+ */
+ bool operator < (struct am_ConnectAction_s &o) const
+ {
+ return this->actionType < o.actionType;
+ }
+
+};
+
+
+struct am_MixingRule_s {
+ am::am_sourceClass_t mixingSourceClassID; /* the name of the source class to be connected/disconnected */
+ std::vector<am_ConnectAction_s> actions; /* actions: e.g decrease volume for source of class Entertainment */
+};
+
+#endif
+
+
+/*
+USE-CASE 1
+==========
+
+Start Entertainment(connectionID = 1)
+
+Start Phone (connectionID = 2)
+ (A1)- actions caused by connectionID[2]: action on connectionID = 1 - mute source
+
+Start Navigation (connectionID = 3)
+ (A2) - actions cause by connectionID[3]: action on connectionID = 1 - decrease volume (pending): A1 - higher priority than A2
+ (A3) - action caused by connectionID[2]: action on connectionID = 3 - decrease volume (applied)
+
+
+End Phone
+ - inverse action (A1) - unmute connectionID = 1
+ - Check if there is any pending action that could be applied, but was blocked by A1
+ (A2) - actions cause by connectionID[3]: action on connectionID = 1 - decrease volume
+ - inverse action (A3) - increase volume connectionID = 3
+ - Check if there is any pending action that could be applied, but was blocked by A3 - none
+
+
+
+USE-CASE 2
+==========
+
+
+Start Entertainment(connectionID = 1)
+
+Start Navigation (connectionID = 2)
+ (A1) - actions cause by connectionID[2]: action on connectionID = 1 - decrease volume (applied)
+
+
+Start Phone (connectionID = 3)
+ (A2) - action caused by connectionID[3]: action on connectionID = 2 - decrease volume (applied)
+ (A3) - actions caused by connectionID[1]: action on connectionID = 1 - mute source; A1 - pending
+
+
+End Phone
+ - inverse action (A2) - increase volume connectionID = 2
+ - Check if there is any pending action that could be applied, but was blocked by A3 - none
+ - inverse action (A3) - unmute connectionID = 1
+ - Check if there is any pending action that could be applied, but was blocked by A3
+ (A1) - actions cause by connectionID[2]: action on connectionID = 1 - decrease volume (applied)
+
+
+
+
+USE-CASE 3
+==========
+
+
+Start Entertainment(connectionID = 1)
+
+Start Navigation (connectionID = 2)
+ (A1) - actions cause by connectionID[2]: action on connectionID = 1 - decrease volume (applied)
+
+
+Start Phone (connectionID = 3)
+ (A2) - action caused by connectionID[3]: action on connectionID = 2 - decrease volume (applied)
+ (A3) - actions caused by connectionID[3]: action on connectionID = 1 - mute source; A1 - pending
+
+End Navigation
+ - inverse action (A1) - A1 is pending ... no action to apply
+
+End Phone
+ - inverse action (A2) - increase volume connectionID = 2
+ - connection does not exits
+ - inverse action (A3) - unmute connectionID = 1
+*/
+
+
+
+/*
+
+MainAction -> list of subconnection, each subconnection, a list of actions
+ each action has a triggering main connection (other)
+
+//what actions this main connection was causing
+MainAction -> a map of subconnections and corresponding action
+
+*/