summaryrefslogtreecommitdiff
path: root/PluginRoutingInterfacePulse/include
diff options
context:
space:
mode:
Diffstat (limited to 'PluginRoutingInterfacePulse/include')
-rw-r--r--PluginRoutingInterfacePulse/include/RoutingSenderMainloopPULSE.h97
-rw-r--r--PluginRoutingInterfacePulse/include/RoutingSenderPULSE.h131
2 files changed, 228 insertions, 0 deletions
diff --git a/PluginRoutingInterfacePulse/include/RoutingSenderMainloopPULSE.h b/PluginRoutingInterfacePulse/include/RoutingSenderMainloopPULSE.h
new file mode 100644
index 0000000..ff0c1d8
--- /dev/null
+++ b/PluginRoutingInterfacePulse/include/RoutingSenderMainloopPULSE.h
@@ -0,0 +1,97 @@
+/**
+ * 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 Routing 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:
+ *
+ * 21.08.2014, Adrian Scarlat, First version of the code;
+ * Porting code from AM ver1.x to AM ver3.0;
+ * Added Copyright and License information;
+ */
+
+#ifndef ROUTINGSENDERMAINLOPPPULSE_H_
+#define ROUTINGSENDERMAINLOPPPULSE_H_
+
+/* Defines */
+/* In PulseAudio the volume value range from 0 (silence) to 0x10000U=65536 ("maximum" sensible volume). */
+#define MAX_PULSE_VOLUME (0x10000U)
+
+bool routing_sender_create_mainloop(void *thiz);
+
+void * routing_sender_start_mainloop(void *thiz);
+
+void routing_sender_get_sink_info_callback(
+ pa_context *c,
+ const pa_sink_info *i,
+ int is_last, void *thiz);
+
+void routing_sender_context_state_callback(pa_context *c, void *thiz);
+
+bool routing_sender_get_source_info(pa_context *c, void *thiz);
+
+void routing_sender_pa_event_callback(
+ pa_context *c,
+ pa_subscription_event_type_t t,
+ uint32_t idx, void *thiz);
+
+void routing_sender_get_sink_input_info_callback(
+ pa_context *c,
+ const pa_sink_input_info *i,
+ int eol,
+ void *thiz);
+
+void routing_sender_get_source_output_info_callback(
+ pa_context *c,
+ const pa_source_output_info *i,
+ int eol,
+ void *userdata);
+
+bool routing_sender_move_sink_input(
+ pa_context *c,
+ uint32_t sink_input_index,
+ uint32_t sink_index,
+ void *thiz);
+
+bool routing_sender_move_source_output(
+ pa_context *c,
+ uint32_t source_output_index,
+ uint32_t source_index,
+ void *thiz);
+
+bool routing_sender_sink_input_volume_ramp(
+ pa_context *c,
+ uint32_t sink_input_index,
+ uint32_t crt_volume,
+ uint32_t volume,
+ uint16_t ramp_time,
+ void *thiz);
+
+bool routing_sender_sink_input_volume(
+ pa_context *c,
+ uint32_t sink_input_index,
+ uint32_t volume,
+ void *thiz);
+
+bool routing_sender_sink_input_mute(
+ pa_context *c,
+ uint32_t sink_input_index,
+ bool mute,
+ void *thiz);
+
+bool routing_sender_sink_volume(
+ pa_context *c,
+ uint32_t sink_index,
+ uint32_t volume,
+ void *thiz);
+
+#endif
diff --git a/PluginRoutingInterfacePulse/include/RoutingSenderPULSE.h b/PluginRoutingInterfacePulse/include/RoutingSenderPULSE.h
new file mode 100644
index 0000000..0fc2197
--- /dev/null
+++ b/PluginRoutingInterfacePulse/include/RoutingSenderPULSE.h
@@ -0,0 +1,131 @@
+/**
+ * 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 Routing 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:
+ *
+ * 21.08.2014, Adrian Scarlat, First version of the code;
+ * Porting code from AM ver1.x to AM ver3.0;
+ * Added Copyright and License information;
+ */
+
+#ifndef ROUTINGSENDERPULSE_H_
+#define ROUTINGSENDERPULSE_H_
+
+/* Includes */
+#include "routing/IAmRoutingSend.h"
+#include <signal.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <getopt.h>
+#include <locale.h>
+#include <map>
+#include <pulse/pulseaudio.h>
+
+using namespace am;
+
+struct RoutingSenderPULSEConnection
+{
+ am_connectionID_t connectionID;
+ am_sourceID_t sourceID;
+ am_sinkID_t sinkID;
+ am_Handle_s handle;
+ bool pending;
+};
+
+
+struct RoutingSenderPULSESourceSinkConfig
+{
+ am_Source_s source;
+ am_Sink_s sink;
+
+ std::string name;//e.g. {"gst-launch-0.10", "mono", "aplay"};
+ std::string clazz;//e.g. {"Entertainment", "Navigation", "TTS"};
+ std::string propertyName;//e.g. {"application.process.binary", "application.process.binary", "application.process.app"};
+ std::string propertyValue;//
+};
+
+
+/* Prototypes */
+class RoutingSenderPULSE : public IAmRoutingSend
+{
+public:
+ RoutingSenderPULSE(pa_context *p_paContext);
+ ~RoutingSenderPULSE();
+
+ am::am_Error_e startupInterface(am::IAmRoutingReceive* p_routingReceiver);
+ void setRoutingReady(uint16_t handle);
+ void setRoutingRundown(uint16_t handle);
+ am_Error_e asyncAbort(const am_Handle_s handle);
+ am_Error_e asyncConnect(const am_Handle_s handle, const am_connectionID_t connectionID, const am_sourceID_t sourceID, const am_sinkID_t sinkID, const am_CustomConnectionFormat_t connectionFormat);
+ am_Error_e asyncDisconnect(const am_Handle_s handle, const am_connectionID_t connectionID);
+ am_Error_e asyncSetSinkVolume(const am_Handle_s handle, const am_sinkID_t sinkID, const am_volume_t volume, const am_CustomRampType_t ramp, const am_time_t time);
+ am_Error_e asyncSetSourceVolume(const am_Handle_s handle, const am_sourceID_t sourceID, const am_volume_t volume, const am_CustomRampType_t ramp, const am_time_t time);
+ am_Error_e asyncSetSourceState(const am_Handle_s handle, const am_sourceID_t sourceID, const am_SourceState_e state);
+ am_Error_e asyncSetSinkSoundProperties(const am_Handle_s handle, const am_sinkID_t sinkID, const std::vector<am_SoundProperty_s>& listSoundProperties);
+ am_Error_e asyncSetSinkSoundProperty(const am_Handle_s handle, const am_sinkID_t sinkID, const am_SoundProperty_s& soundProperty);
+ am_Error_e asyncSetSourceSoundProperties(const am_Handle_s handle, const am_sourceID_t sourceID, const std::vector<am_SoundProperty_s>& listSoundProperties);
+ am_Error_e asyncSetSourceSoundProperty(const am_Handle_s handle, const am_sourceID_t sourceID, const am_SoundProperty_s& soundProperty);
+ am_Error_e asyncCrossFade(const am_Handle_s handle, const am_crossfaderID_t crossfaderID, const am_HotSink_e hotSink, const am_CustomRampType_t rampType, const am_time_t time);
+ am_Error_e setDomainState(const am_domainID_t domainID, const am_DomainState_e domainState);
+ am_Error_e returnBusName(std::string& BusName) const;
+ void getInterfaceVersion(std::string& out_ver) const;
+
+ void setPAContext(pa_context *p_paContext) {
+ this->m_paContext = p_paContext;
+ }
+ am_Error_e asyncSetVolumes(const am_Handle_s handle, const std::vector<am_Volumes_s>& listVolumes);
+ am_Error_e asyncSetSinkNotificationConfiguration(const am_Handle_s handle, const am_sinkID_t sinkID, const am_NotificationConfiguration_s& notificationConfiguration);
+ am_Error_e asyncSetSourceNotificationConfiguration(const am_Handle_s handle, const am_sourceID_t sourceID, const am_NotificationConfiguration_s& notificationConfiguration);
+//Pulse Audio callbacks
+ void getSinkInfoCallback(pa_context *c, const pa_sink_info *i, int is_last, void *userdata);
+ void getSourceInfoCallback(pa_context *c, const pa_source_info *i, int is_last, void *userdata);
+ void getSinkInputInfoCallback(pa_context *c, const pa_sink_input_info *i, void *userdata);
+ void getSourceOutputInfoCallback(pa_context *c, const pa_source_output_info *i, void *userdata);
+
+private:
+ void loadConfig();
+
+ am_Domain_s m_domain;
+
+ std::vector<RoutingSenderPULSESourceSinkConfig> m_sinks;
+ std::vector<RoutingSenderPULSESourceSinkConfig> m_sources;
+
+ std::map<uint16_t, uint32_t> m_sourceToPASinkInput;
+ std::map<uint16_t, uint32_t> m_sourceToPASource;
+ std::map<uint16_t, uint32_t> m_sinkToPASourceOutput;
+ std::map<uint16_t, uint32_t> m_sinkToPASink;
+
+ uint16_t m_paSinkNullIndex;
+ uint16_t m_paSourceNullIndex;
+
+ IAmRoutingReceive *m_routingReceiver;
+ pa_context *m_paContext;
+
+/**
+ * Maintain a list of pending actions: there is a high change that the HMI first call connect,
+ * then the audio client start to play, therefore, sink-input is not yet created by the time "connect" method was called.
+ * same for volume? not sure - probably the sink input is created when the user change the volume.
+ * same for disconnect? not sure - probably the sink input was already created by the time the user is calling disconnect
+ */
+ std::vector<RoutingSenderPULSEConnection> m_activeConnections;
+ std::map<uint16_t, uint16_t> m_sinkToVolume;
+ std::map<uint16_t, uint16_t> m_sourceToVolume;
+};
+
+#endif