The callbacks will be called repeatedly, once with data, and later
on with eol == 0. Make sure to only free it when we get the eol call
instead of once we've applied the settings.
Example valgrind output:
==31715== Invalid read of size 8
==31715== at 0x24529E09: port_status_data_free (gvc-mixer-control.c:2079)
==31715== by 0x1DB81344: ??? (in /usr/lib64/libpulse.so.0.18.2)
==31715== by 0x1DDF3FE0: ??? (in /usr/lib64/pulseaudio/libpulsecommon-7.1.so)
==31715== by 0x1DDF436A: pa_pdispatch_run (in /usr/lib64/pulseaudio/libpulsecommon-7.1.so)
==31715== by 0x1DB7507D: ??? (in /usr/lib64/libpulse.so.0.18.2)
==31715== by 0x1DDF6B5E: ??? (in /usr/lib64/pulseaudio/libpulsecommon-7.1.so)
==31715== by 0x1DDF91BA: ??? (in /usr/lib64/pulseaudio/libpulsecommon-7.1.so)
==31715== by 0x1DDF9568: ??? (in /usr/lib64/pulseaudio/libpulsecommon-7.1.so)
==31715== by 0x1DDF9DF9: ??? (in /usr/lib64/pulseaudio/libpulsecommon-7.1.so)
==31715== by 0x1D96202A: ??? (in /usr/lib64/libpulse-mainloop-glib.so.0.0.5)
==31715== by 0x7AA7CF9: g_main_dispatch (gmain.c:3154)
==31715== by 0x7AA7CF9: g_main_context_dispatch (gmain.c:3769)
==31715== by 0x7AA8057: g_main_context_iterate.isra.29 (gmain.c:3840)
==31715== Address 0x2bd83480 is 0 bytes inside a block of size 16 free'd
==31715== at 0x4C2ED6A: free (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==31715== by 0x7AAD2AD: g_free (gmem.c:189)
==31715== by 0x1DB81562: ??? (in /usr/lib64/libpulse.so.0.18.2)
==31715== by 0x1DDF3FE0: ??? (in /usr/lib64/pulseaudio/libpulsecommon-7.1.so)
==31715== by 0x1DDF436A: pa_pdispatch_run (in /usr/lib64/pulseaudio/libpulsecommon-7.1.so)
==31715== by 0x1DB7507D: ??? (in /usr/lib64/libpulse.so.0.18.2)
==31715== by 0x1DDF6B5E: ??? (in /usr/lib64/pulseaudio/libpulsecommon-7.1.so)
==31715== by 0x1DDF91BA: ??? (in /usr/lib64/pulseaudio/libpulsecommon-7.1.so)
==31715== by 0x1DDF9568: ??? (in /usr/lib64/pulseaudio/libpulsecommon-7.1.so)
==31715== by 0x1DDF9DF9: ??? (in /usr/lib64/pulseaudio/libpulsecommon-7.1.so)
==31715== by 0x1D96202A: ??? (in /usr/lib64/libpulse-mainloop-glib.so.0.0.5)
==31715== by 0x7AA7CF9: g_main_dispatch (gmain.c:3154)
==31715== by 0x7AA7CF9: g_main_context_dispatch (gmain.c:3769)
==31715== Block was alloc'd at
==31715== at 0x4C2F9C7: calloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==31715== by 0x7AAD1F0: g_malloc0 (gmem.c:124)
==31715== by 0x2452A39D: gvc_mixer_control_set_port_status_for_headset (gvc-mixer-control.c:2173)
==31715== by 0x2451BE81: audio_selection_done (gsd-media-keys-manager.c:2489)
==31715== by 0x7550ED3: emit_signal_instance_in_idle_cb (gdbusconnection.c:3701)
==31715== by 0x7AA7CF9: g_main_dispatch (gmain.c:3154)
==31715== by 0x7AA7CF9: g_main_context_dispatch (gmain.c:3769)
==31715== by 0x7AA8057: g_main_context_iterate.isra.29 (gmain.c:3840)
==31715== by 0x7AA8371: g_main_loop_run (gmain.c:4034)
==31715== by 0x5CEA204: gtk_main (gtkmain.c:1246)
==31715== by 0x403804: main (main.c:434)
Add "audio-device-selection-needed" which will be emitted when a
headphones, headset or microphone is plugged into a jack socket that
cannot detect which type it was.
Once the user of libgnome-volume-control has asked the user which type
of device this was, they can call gvc_mixer_control_set_headset_port()
to switch the ports for that configuration.
Note that gvc_mixer_control_set_headset_port() supports passing the
card ID, but the detection code only supports a single such device. When
we find hardware that can support > 1 such device, we can test and
implement support without breaking the API.
Based on the original code by David Henningsson <david.henningsson@canonical.com>
for the unity-settings-daemon
https://bugzilla.gnome.org/show_bug.cgi?id=755062
- Fix warning about comparison between signed and unsigned integer
expressions
- Change variable name 'output' to 'device' to fix warning:
declaration of 'output' shadows a parameter
- Fix warning about missing default case in switch
Entries are only hidden when available == PA_PORT_AVAILABLE_NO, so if an
entry toggles between PA_PORT_AVAILABLE_YES and
PA_PORT_AVAILABLE_UNKNOWN (Bluetooth headset switching between HSP/HFP
and A2DP for example), this should not result in new entries being created.
https://bugzilla.gnome.org/show_bug.cgi?id=697545
The "uint" type is not defined for standard C, and building with
-std=c99 enable stricter conformance and results in compilation failing.
Use "guint" instead.
This will allow to have different icons for internal audio cards
(which are flagged generically as "audio-card"), depending on which
port is in use (ie. headphones or speakers).
This requires the new icon information, which is only exported by
PulseAudio 3.0. If it's not available, we fallback to card icons
like before.
https://bugzilla.gnome.org/show_bug.cgi?id=689931