Merge lp:~larsu/indicator-sound/lp1244386 into lp:indicator-sound/14.04

Proposed by Lars Karlitski
Status: Merged
Approved by: Charles Kerr
Approved revision: no longer in the source branch.
Merged at revision: 396
Proposed branch: lp:~larsu/indicator-sound/lp1244386
Merge into: lp:indicator-sound/14.04
Diff against target: 81 lines (+29/-15)
1 file modified
src/volume-control.vala (+29/-15)
To merge this branch: bzr merge lp:~larsu/indicator-sound/lp1244386
Reviewer Review Type Date Requested Status
Charles Kerr (community) Approve
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+192800@code.launchpad.net

Description of the change

VolumeControl: don't pass vala closures into libpulse

Libpulse's vala bindings don't specify that callbacks passed into some of its functions (e.g., get_server_info) can be called after the function returns. Vala thus frees closure data after these functions return.

This can't easily be fixed in the bindings, because libpulse doesn't provide variants of these functions with destroy_notifies.

This patch works around this problem by only passing non-closure functions into libpulse.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Charles Kerr (charlesk) :
review: Approve
lp:~larsu/indicator-sound/lp1244386 updated
396. By Lars Karlitski

VolumeControl: don't pass vala closures into libpulse

Libpulse's vala bindings don't specify that callbacks passed into some of its functions (e.g., get_server_info) can be called after the function returns. Vala thus frees closure data after these functions return.

This can't easily be fixed in the bindings, because libpulse doesn't provide variants of these functions with destroy_notifies.

This patch works around this problem by only passing non-closure functions into libpulse. Fixes: https://bugs.launchpad.net/bugs/1244386.

Approved by Charles Kerr, PS Jenkins bot.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/volume-control.vala'
2--- src/volume-control.vala 2013-10-24 02:55:56 +0000
3+++ src/volume-control.vala 2013-10-27 00:49:59 +0000
4@@ -128,12 +128,14 @@
5 context.get_server_info (server_info_cb_for_props);
6 }
7
8+ private void update_source_get_server_info_cb (PulseAudio.Context c, PulseAudio.ServerInfo? i) {
9+ if (i != null)
10+ context.get_source_info_by_name (i.default_source_name, source_info_cb);
11+ }
12+
13 private void update_source ()
14 {
15- context.get_server_info ( (c, i) => {
16- if (i != null)
17- context.get_source_info_by_name (i.default_source_name, source_info_cb);
18- });
19+ context.get_server_info (update_source_get_server_info_cb);
20 }
21
22 private void source_output_info_cb (Context c, SourceOutputInfo? i, int eol)
23@@ -199,15 +201,25 @@
24 warning( "pa_context_connect() failed: %s\n", PulseAudio.strerror(context.errno()));
25 }
26
27+ void sink_info_list_callback_set_mute (PulseAudio.Context context, PulseAudio.SinkInfo? sink, int eol) {
28+ if (sink != null)
29+ context.set_sink_mute_by_index (sink.index, true, null);
30+ }
31+
32+ void sink_info_list_callback_unset_mute (PulseAudio.Context context, PulseAudio.SinkInfo? sink, int eol) {
33+ if (sink != null)
34+ context.set_sink_mute_by_index (sink.index, false, null);
35+ }
36+
37 /* Mute operations */
38 public void set_mute (bool mute)
39 {
40 return_if_fail (context.get_state () == Context.State.READY);
41
42- context.get_sink_info_list ((context, sink, eol) => {
43- if (sink != null)
44- context.set_sink_mute_by_index (sink.index, mute, null);
45- });
46+ if (mute)
47+ context.get_sink_info_list (sink_info_list_callback_set_mute);
48+ else
49+ context.get_sink_info_list (sink_info_list_callback_unset_mute);
50 }
51
52 public void toggle_mute ()
53@@ -277,19 +289,21 @@
54 mic_volume_changed (_mic_volume);
55 }
56
57+ void set_mic_volume_get_server_info_cb (PulseAudio.Context c, PulseAudio.ServerInfo? i) {
58+ if (i != null) {
59+ unowned CVolume cvol = CVolume ();
60+ cvol = vol_set (cvol, 1, double_to_volume (_mic_volume));
61+ c.set_source_volume_by_name (i.default_source_name, cvol, set_mic_volume_success_cb);
62+ }
63+ }
64+
65 public void set_mic_volume (double volume)
66 {
67 return_if_fail (context.get_state () == Context.State.READY);
68
69 _mic_volume = volume;
70
71- context.get_server_info ( (c, i) => {
72- if (i != null) {
73- unowned CVolume cvol = CVolume ();
74- cvol = vol_set (cvol, 1, double_to_volume (_mic_volume));
75- c.set_source_volume_by_name (i.default_source_name, cvol, set_mic_volume_success_cb);
76- }
77- });
78+ context.get_server_info (set_mic_volume_get_server_info_cb);
79 }
80
81 public double get_volume ()

Subscribers

People subscribed via source and target branches