sink-input: do pa_volume_ramp_memchunk before resampling 89/84489/4
authorJungsup Lee <jungsup4.lee@samsung.com>
Fri, 19 Aug 2016 02:35:32 +0000 (11:35 +0900)
committerJungsup Lee <jungsup4.lee@samsung.com>
Tue, 20 Sep 2016 05:41:34 +0000 (14:41 +0900)
Calculation of pa_volume_ramp_t's length is based on sample rate of sink-input.
Therefore, volume ramping is not applied as long as we want if pa_volume_ramp_memchunk is called after resampling.

[Version] 5.0-93
[Profile] Common
[Issue Type] Bug Fix

Signed-off-by: Jungsup Lee <jungsup4.lee@samsung.com>
Change-Id: I1dc06c212ee7a8e067957b8419dc9e6056b85da4

packaging/pulseaudio.spec
src/pulsecore/sink-input.c

index 501816b..b3665ac 100644 (file)
@@ -11,7 +11,7 @@
 Name:             pulseaudio
 Summary:          Improved Linux sound server
 Version:          5.0
-Release:          92
+Release:          93
 Group:            Multimedia/Audio
 License:          LGPL-2.1+
 URL:              http://pulseaudio.org
index 12ee52e..7523587 100644 (file)
@@ -996,7 +996,6 @@ void pa_sink_input_peek(pa_sink_input *i, size_t slength /* in sink bytes */, pa
             pa_memchunk wchunk;
             bool nvfs = need_volume_factor_sink;
             pa_cvolume target;
-            bool tmp;
 
             wchunk = tchunk;
             pa_memblock_ref(wchunk.memblock);
@@ -1063,8 +1062,8 @@ void pa_sink_input_peek(pa_sink_input *i, size_t slength /* in sink bytes */, pa
                 /* 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_volume_ramp_memchunk(&wchunk, &i->sink->sample_spec, &i->thread_info.ramp);
+                } else if (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);
@@ -1073,6 +1072,17 @@ void pa_sink_input_peek(pa_sink_input *i, size_t slength /* in sink bytes */, pa
                 pa_memblockq_push_align(i->thread_info.render_memblockq, &wchunk);
             } else {
                 pa_memchunk rchunk;
+
+                /* 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->thread_info.sample_spec, &i->thread_info.ramp);
+                } else if (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->thread_info.sample_spec, &target);
+                }
+
                 pa_resampler_run(i->thread_info.resampler, &wchunk, &rchunk);
 
 #ifdef SINK_INPUT_DEBUG
@@ -1086,16 +1096,6 @@ void pa_sink_input_peek(pa_sink_input *i, size_t slength /* in sink bytes */, pa
                         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(&rchunk, 0);
-                        pa_volume_ramp_memchunk(&rchunk, &i->sink->sample_spec, &(i->thread_info.ramp));
-                    } else if (pa_cvolume_ramp_target_active(&(i->thread_info.ramp))) {
-                        pa_memchunk_make_writable(&rchunk, 0);
-                        pa_cvolume_ramp_get_targets(&i->thread_info.ramp, &target);
-                        pa_volume_memchunk(&rchunk, &i->sink->sample_spec, &target);
-                    }
-
                     pa_memblockq_push_align(i->thread_info.render_memblockq, &rchunk);
                     pa_memblock_unref(rchunk.memblock);
                 }