tizenaudio-policy: Apply volume type to output stream of module-loopback 20/197420/1
authorSangchul Lee <sc11.lee@samsung.com>
Fri, 11 Jan 2019 05:38:21 +0000 (14:38 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Fri, 11 Jan 2019 05:39:47 +0000 (14:39 +0900)
Output stream of module-loopback has not been applied volume type.
It is fixed and now it is possible to control the volume of the
output stream in case of loopback feature if a volume type is defined
to the loopback role in stream-map.json.

Here's an example to use media volume type.(in stream-map.json)
  {
    "role":"loopback",
    "priority" : 2,
    "route-type" : "manual",
    "volume-types":{"in":"none","out":"media"},
    "avail-in-devices":["builtin-mic","usb-audio"],
    "avail-out-devices":["builtin-speaker","usb-audio","bt-a2dp"],
    "avail-frameworks":["sound-manager"]
  },

Change-Id: I8335f84817ff6a3d7282c283c150c96baccf6f99
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
packaging/pulseaudio-modules-tizen.spec
src/module-tizenaudio-policy.c
src/stream-manager.c
src/stream-manager.h

index 6414212..89e2287 100644 (file)
@@ -1,6 +1,6 @@
 Name:             pulseaudio-modules-tizen
 Summary:          Pulseaudio modules for Tizen
-Version:          11.1.30
+Version:          11.1.31
 Release:          0
 Group:            Multimedia/Audio
 License:          LGPL-2.1+
index ba9bb16..3f938cf 100644 (file)
@@ -463,6 +463,7 @@ static void update_bt_sco_option(struct userdata *u, const char* role) {
 /* Load/Unload module-loopback */
 static void update_loopback_module(struct userdata *u, bool load) {
     char *args = NULL;
+    const char *volume_type;
 
     pa_assert(u);
 
@@ -472,9 +473,11 @@ static void update_loopback_module(struct userdata *u, bool load) {
         if (!u->loopback_args.adjust_sec)
             u->loopback_args.adjust_sec = LOOPBACK_DEFAULT_ADJUST_SEC;
 
-        args = pa_sprintf_malloc("sink=%s source=%s latency_msec=%d adjust_time=%d",
+        volume_type = pa_stream_manager_get_volume_type(u->stream_manager, STREAM_SINK_INPUT, STREAM_ROLE_LOOPBACK);
+        args = pa_sprintf_malloc("sink=%s source=%s latency_msec=%d adjust_time=%d sink_input_properties=%s=%s",
                                  u->loopback_args.sink->name, u->loopback_args.source->name,
-                                 u->loopback_args.latency_msec, u->loopback_args.adjust_sec);
+                                 u->loopback_args.latency_msec, u->loopback_args.adjust_sec,
+                                 PA_PROP_MEDIA_TIZEN_VOLUME_TYPE, volume_type);
         if (u->module_loopback)
             pa_module_unload(u->module_loopback, true);
 
index d7a7f0f..33ca9b3 100644 (file)
@@ -3116,6 +3116,20 @@ bool pa_stream_manager_is_valid_stream_role(pa_core *c, const char *role) {
     return true;
 }
 
+const char* pa_stream_manager_get_volume_type(pa_stream_manager *m, stream_type_t stream_type, const char *role) {
+    stream_info *s = NULL;
+
+    pa_assert(m);
+    pa_assert(role);
+
+    if (!(s = pa_hashmap_get(m->stream_infos, role))) {
+        pa_log_warn("%s is not valid role, return NULL", role);
+        return NULL;
+    }
+
+    return s->volume_types[stream_type == STREAM_SINK_INPUT ? STREAM_DIRECTION_OUT : STREAM_DIRECTION_IN];
+}
+
 pa_stream_manager* pa_stream_manager_get(pa_core *c) {
     pa_stream_manager *m;
 
index 85385ff..98c0804 100644 (file)
@@ -147,6 +147,7 @@ int32_t pa_stream_manager_get_route_type(void *stream, stream_type_t stream_type
 bool pa_stream_manager_check_name_is_vstream(void *stream, stream_type_t type, bool is_new_data);
 bool pa_stream_manager_check_filter_apply_stream(void *stream, stream_type_t stream_type);
 bool pa_stream_manager_is_valid_stream_role(pa_core *c, const char *role);
+const char* pa_stream_manager_get_volume_type(pa_stream_manager *m, stream_type_t stream_type, const char *role);
 
 pa_stream_manager* pa_stream_manager_get(pa_core *c);
 pa_stream_manager* pa_stream_manager_ref(pa_stream_manager *m);