summaryrefslogtreecommitdiffstats
path: root/meta-agl-profile-core/recipes-multimedia/pulseaudio/pulseaudio/0011-volume-ramp-adding-volume-ramping-to-sink-input.patch
blob: 08fb792483b6c2dd68a99352dbf9a0d5fd7dec12 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
--- a/src/pulsecore/sink-input.c	2016-04-12 16:50:41.311964935 +0200
+++ b/src/pulsecore/sink-input.c	2016-04-12 17:22:40.420961732 +0200
@@ -525,6 +525,11 @@
     reset_callbacks(i);
     i->userdata = NULL;
 
+    if (data->flags & PA_SINK_INPUT_START_RAMP_MUTED)
+        pa_cvolume_ramp_int_init(&i->ramp, PA_VOLUME_MUTED, data->sample_spec.channels);
+    else
+        pa_cvolume_ramp_int_init(&i->ramp, PA_VOLUME_NORM, data->sample_spec.channels);
+
     i->thread_info.state = i->state;
     i->thread_info.attached = false;
     pa_atomic_store(&i->thread_info.drained, 1);
@@ -541,6 +546,8 @@
     i->thread_info.playing_for = 0;
     i->thread_info.direct_outputs = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
 
+    i->thread_info.ramp = i->ramp;
+
     pa_assert_se(pa_idxset_put(core->sink_inputs, i, &i->index) == 0);
     pa_assert_se(pa_idxset_put(i->sink->inputs, pa_sink_input_ref(i), NULL) == 0);
 
@@ -922,6 +929,8 @@
         while (tchunk.length > 0) {
             pa_memchunk wchunk;
             bool nvfs = need_volume_factor_sink;
+            pa_cvolume target;
+            bool tmp;
 
             wchunk = tchunk;
             pa_memblock_ref(wchunk.memblock);
@@ -958,6 +967,16 @@
                     pa_volume_memchunk(&wchunk, &i->sink->sample_spec, &i->volume_factor_sink);
                 }
 
+                /* check for possible volume ramp */
+                if (pa_cvolume_ramp_active(&i->thread_info.ramp)) {
+                    pa_memchunk_make_writable(&wchunk, 0);
+                    pa_volume_ramp_memchunk(&wchunk, &i->sink->sample_spec, &(i->thread_info.ramp));
+                } else if ((tmp = pa_cvolume_ramp_target_active(&(i->thread_info.ramp)))) {
+                    pa_memchunk_make_writable(&wchunk, 0);
+                    pa_cvolume_ramp_get_targets(&i->thread_info.ramp, &target);
+                    pa_volume_memchunk(&wchunk, &i->sink->sample_spec, &target);
+                }
+
                 pa_memblockq_push_align(i->thread_info.render_memblockq, &wchunk);
             } else {
                 pa_memchunk rchunk;
@@ -974,6 +993,16 @@
                         pa_volume_memchunk(&rchunk, &i->sink->sample_spec, &i->volume_factor_sink);
                     }
 
+                    /* check for possible volume ramp */
+                    if (pa_cvolume_ramp_active(&i->thread_info.ramp)) {
+                        pa_memchunk_make_writable(&wchunk, 0);
+                        pa_volume_ramp_memchunk(&wchunk, &i->sink->sample_spec, &(i->thread_info.ramp));
+                    } else if ((tmp = pa_cvolume_ramp_target_active(&(i->thread_info.ramp)))) {
+                        pa_memchunk_make_writable(&wchunk, 0);
+                        pa_cvolume_ramp_get_targets(&i->thread_info.ramp, &target);
+                        pa_volume_memchunk(&wchunk, &i->sink->sample_spec, &target);
+                    }
+
                     pa_memblockq_push_align(i->thread_info.render_memblockq, &rchunk);
                     pa_memblock_unref(rchunk.memblock);
                 }
@@ -1338,6 +1367,31 @@
     return 0;
 }
 
+/* Called from main thread */
+void pa_sink_input_set_volume_ramp(
+        pa_sink_input *i,
+        const pa_cvolume_ramp *ramp,
+        bool send_msg,
+        bool save) {
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_ctl_context();
+    pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
+    pa_assert(ramp);
+
+    pa_cvolume_ramp_convert(ramp, &i->ramp, i->sample_spec.rate);
+
+    pa_log_debug("setting volume ramp with target vol:%d and length:%ld",
+                i->ramp.ramps[0].target,
+                i->ramp.ramps[0].length);
+
+
+    /* This tells the sink that volume ramp changed */
+    if (send_msg)
+        pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_VOLUME_RAMP,
+                                       NULL, 0, NULL) == 0);
+}
+
 /* Called from main context */
 static void set_real_ratio(pa_sink_input *i, const pa_cvolume *v) {
     pa_sink_input_assert_ref(i);
@@ -1929,6 +1983,12 @@
             }
             return 0;
 
+        case PA_SINK_INPUT_MESSAGE_SET_VOLUME_RAMP:
+            /* we have ongoing ramp where we take current start values */
+            pa_cvolume_ramp_start_from(&i->thread_info.ramp, &i->ramp);
+            i->thread_info.ramp = i->ramp;
+            return 0;
+
         case PA_SINK_INPUT_MESSAGE_SET_SOFT_MUTE:
             if (i->thread_info.muted != i->muted) {
                 i->thread_info.muted = i->muted;
--- a/src/pulsecore/sink-input.h	2016-04-12 16:50:46.712964926 +0200
+++ b/src/pulsecore/sink-input.h	2016-04-12 17:30:24.289960958 +0200
@@ -59,7 +59,8 @@
     PA_SINK_INPUT_DONT_INHIBIT_AUTO_SUSPEND = 256,
     PA_SINK_INPUT_NO_CREATE_ON_SUSPEND = 512,
     PA_SINK_INPUT_KILL_ON_SUSPEND = 1024,
-    PA_SINK_INPUT_PASSTHROUGH = 2048
+    PA_SINK_INPUT_PASSTHROUGH = 2048,
+    PA_SINK_INPUT_START_RAMP_MUTED = 4096,
 } pa_sink_input_flags_t;
 
 struct pa_sink_input {
@@ -122,6 +123,9 @@
      * this.*/
     bool save_sink:1, save_volume:1, save_muted:1;
 
+    /* for volume ramps */
+    pa_cvolume_ramp_int ramp;
+
     pa_resample_method_t requested_resample_method, actual_resample_method;
 
     /* Returns the chunk of audio data and drops it from the
@@ -250,6 +254,8 @@
         pa_usec_t requested_sink_latency;
 
         pa_hashmap *direct_outputs;
+
+        pa_cvolume_ramp_int ramp;
     } thread_info;
 
     void *userdata;
@@ -266,6 +272,7 @@
     PA_SINK_INPUT_MESSAGE_SET_STATE,
     PA_SINK_INPUT_MESSAGE_SET_REQUESTED_LATENCY,
     PA_SINK_INPUT_MESSAGE_GET_REQUESTED_LATENCY,
+    PA_SINK_INPUT_MESSAGE_SET_VOLUME_RAMP,
     PA_SINK_INPUT_MESSAGE_MAX
 };
 
@@ -374,6 +381,8 @@
 
 void pa_sink_input_set_mute(pa_sink_input *i, bool mute, bool save);
 
+void pa_sink_input_set_volume_ramp(pa_sink_input *i, const pa_cvolume_ramp *ramp, bool send_msg, bool save);
+
 void pa_sink_input_update_proplist(pa_sink_input *i, pa_update_mode_t mode, pa_proplist *p);
 
 pa_resample_method_t pa_sink_input_get_resample_method(pa_sink_input *i);