From b81d9ed11fae7bee59b67b1aee9927e417666875 Mon Sep 17 00:00:00 2001 From: Michal Ratajsky Date: Thu, 3 Jul 2014 20:48:08 +0200 Subject: PulseAudio and API fixes --- libmatemixer/matemixer-client-stream.c | 2 +- libmatemixer/matemixer-control.c | 42 +++++++++++++++++++- libmatemixer/matemixer-enum-types.c | 2 +- libmatemixer/matemixer-enums.h | 4 +- libmatemixer/matemixer-private.h | 3 +- libmatemixer/matemixer-stream.c | 71 ++++++++++++++++------------------ libmatemixer/matemixer-stream.h | 56 +++++++++++++-------------- libmatemixer/matemixer.c | 20 ++++++---- libmatemixer/matemixer.h | 5 ++- 9 files changed, 123 insertions(+), 82 deletions(-) (limited to 'libmatemixer') diff --git a/libmatemixer/matemixer-client-stream.c b/libmatemixer/matemixer-client-stream.c index d05b1bf..74b3e15 100644 --- a/libmatemixer/matemixer-client-stream.c +++ b/libmatemixer/matemixer-client-stream.c @@ -108,7 +108,7 @@ mate_mixer_client_stream_get_parent (MateMixerClientStream *client) * @parent: a #MateMixerStream * * Changes the parent stream of the client stream. The parent stream must be a - * non-client output stream. + * non-client input or output stream. * * Returns: %TRUE on success or %FALSE on failure. */ diff --git a/libmatemixer/matemixer-control.c b/libmatemixer/matemixer-control.c index 2bc61ae..06b938a 100644 --- a/libmatemixer/matemixer-control.c +++ b/libmatemixer/matemixer-control.c @@ -19,8 +19,10 @@ #include #include +#include "matemixer.h" #include "matemixer-backend.h" #include "matemixer-backend-module.h" +#include "matemixer-client-stream.h" #include "matemixer-control.h" #include "matemixer-enums.h" #include "matemixer-enum-types.h" @@ -954,7 +956,8 @@ mate_mixer_control_get_default_input_stream (MateMixerControl *control) * @control: a #MateMixerControl * @stream: a #MateMixerStream to set as the default input stream * - * Changes the default input stream in the system. + * Changes the default input stream in the system. The @stream must be an + * input non-client stream. * * Returns: %TRUE on success or %FALSE on failure. */ @@ -963,10 +966,20 @@ mate_mixer_control_set_default_input_stream (MateMixerControl *control, MateMixerStream *stream) { g_return_val_if_fail (MATE_MIXER_IS_CONTROL (control), FALSE); + g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE); if (control->priv->state != MATE_MIXER_STATE_READY) return FALSE; + if (MATE_MIXER_IS_CLIENT_STREAM (stream)) { + g_warning ("Unable to set client stream as the default input stream"); + return FALSE; + } + if (!(mate_mixer_stream_get_flags (stream) & MATE_MIXER_STREAM_INPUT)) { + g_warning ("Unable to set non-input stream as the default input stream"); + return FALSE; + } + return mate_mixer_backend_set_default_input_stream (control->priv->backend, stream); } @@ -996,7 +1009,8 @@ mate_mixer_control_get_default_output_stream (MateMixerControl *control) * @control: a #MateMixerControl * @stream: a #MateMixerStream to set as the default output stream * - * Changes the default output stream in the system. + * Changes the default output stream in the system. The @stream must be an + * output non-client stream. * * Returns: %TRUE on success or %FALSE on failure. */ @@ -1005,10 +1019,20 @@ mate_mixer_control_set_default_output_stream (MateMixerControl *control, MateMixerStream *stream) { g_return_val_if_fail (MATE_MIXER_IS_CONTROL (control), FALSE); + g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE); if (control->priv->state != MATE_MIXER_STATE_READY) return FALSE; + if (MATE_MIXER_IS_CLIENT_STREAM (stream)) { + g_warning ("Unable to set client stream as the default output stream"); + return FALSE; + } + if (!(mate_mixer_stream_get_flags (stream) & MATE_MIXER_STREAM_OUTPUT)) { + g_warning ("Unable to set non-output stream as the default output stream"); + return FALSE; + } + return mate_mixer_backend_set_default_input_stream (control->priv->backend, stream); } @@ -1177,6 +1201,7 @@ control_try_next_backend (MateMixerControl *control) { const GList *modules; MateMixerBackendModule *module = NULL; + MateMixerState state; modules = mate_mixer_get_modules (); while (modules) { @@ -1208,10 +1233,23 @@ control_try_next_backend (MateMixerControl *control) if (!mate_mixer_backend_open (control->priv->backend)) return control_try_next_backend (control); + state = mate_mixer_backend_get_state (control->priv->backend); + + if (G_UNLIKELY (state != MATE_MIXER_STATE_READY && + state != MATE_MIXER_STATE_CONNECTING)) { + /* This would be a backend bug */ + g_warn_if_reached (); + + control_close (control); + return control_try_next_backend (control); + } + g_signal_connect (control->priv->backend, "notify::state", G_CALLBACK (control_state_changed_cb), control); + + control_change_state (control, state); return TRUE; } diff --git a/libmatemixer/matemixer-enum-types.c b/libmatemixer/matemixer-enum-types.c index e353e0c..0f60a6a 100644 --- a/libmatemixer/matemixer-enum-types.c +++ b/libmatemixer/matemixer-enum-types.c @@ -52,7 +52,7 @@ mate_mixer_backend_type_get_type (void) if (etype == 0) { static const GEnumValue values[] = { { MATE_MIXER_BACKEND_UNKNOWN, "MATE_MIXER_BACKEND_UNKNOWN", "unknown" }, - { MATE_MIXER_BACKEND_PULSE, "MATE_MIXER_BACKEND_PULSE", "pulse" }, + { MATE_MIXER_BACKEND_PULSEAUDIO, "MATE_MIXER_BACKEND_PULSEAUDIO", "pulseaudio" }, { MATE_MIXER_BACKEND_NULL, "MATE_MIXER_BACKEND_NULL", "null" }, { 0, NULL, NULL } }; diff --git a/libmatemixer/matemixer-enums.h b/libmatemixer/matemixer-enums.h index 4552141..4753aaf 100644 --- a/libmatemixer/matemixer-enums.h +++ b/libmatemixer/matemixer-enums.h @@ -35,7 +35,7 @@ typedef enum { * MateMixerBackendType: * @MATE_MIXER_BACKEND_UNKNOWN: * Unknown or undefined backend type. - * @MATE_MIXER_BACKEND_PULSE: + * @MATE_MIXER_BACKEND_PULSEAUDIO: * PulseAudio sound system backend. It has the highest priority and * will be the first one to try unless you select a specific backend * to connect to. @@ -47,7 +47,7 @@ typedef enum { */ typedef enum { MATE_MIXER_BACKEND_UNKNOWN = 0, - MATE_MIXER_BACKEND_PULSE, + MATE_MIXER_BACKEND_PULSEAUDIO, MATE_MIXER_BACKEND_NULL } MateMixerBackendType; diff --git a/libmatemixer/matemixer-private.h b/libmatemixer/matemixer-private.h index 0eb012a..4dde496 100644 --- a/libmatemixer/matemixer-private.h +++ b/libmatemixer/matemixer-private.h @@ -22,8 +22,7 @@ G_BEGIN_DECLS -const GList *mate_mixer_get_modules (void); -gboolean mate_mixer_is_initialized (void); +const GList *mate_mixer_get_modules (void); G_END_DECLS diff --git a/libmatemixer/matemixer-stream.c b/libmatemixer/matemixer-stream.c index b845d48..5400357 100644 --- a/libmatemixer/matemixer-stream.c +++ b/libmatemixer/matemixer-stream.c @@ -15,9 +15,6 @@ * License along with this library; if not, see . */ -// XXX -// consider using guint for volumes, but see the other backends first - #include #include @@ -115,24 +112,24 @@ mate_mixer_stream_default_init (MateMixerStreamInterface *iface) G_PARAM_STATIC_STRINGS)); g_object_interface_install_property (iface, - g_param_spec_double ("balance", - "Balance", - "Balance value of the stream", - -1.0, - 1.0, - 0.0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); + g_param_spec_float ("balance", + "Balance", + "Balance value of the stream", + -1.0f, + 1.0f, + 0.0f, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); g_object_interface_install_property (iface, - g_param_spec_double ("fade", - "Fade", - "Fade value of the stream", - -1.0, - 1.0, - 0.0, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); + g_param_spec_float ("fade", + "Fade", + "Fade value of the stream", + -1.0f, + 1.0f, + 0.0f, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); g_object_interface_install_property (iface, g_param_spec_pointer ("ports", @@ -258,7 +255,7 @@ mate_mixer_stream_set_mute (MateMixerStream *stream, gboolean mute) return FALSE; } -gint64 +guint mate_mixer_stream_get_volume (MateMixerStream *stream) { MateMixerStreamInterface *iface; @@ -274,7 +271,7 @@ mate_mixer_stream_get_volume (MateMixerStream *stream) } gboolean -mate_mixer_stream_set_volume (MateMixerStream *stream, gint64 volume) +mate_mixer_stream_set_volume (MateMixerStream *stream, guint volume) { MateMixerStreamInterface *iface; @@ -348,7 +345,7 @@ mate_mixer_stream_get_channel_position (MateMixerStream *stream, guint channel) return MATE_MIXER_CHANNEL_UNKNOWN_POSITION; } -gint64 +guint mate_mixer_stream_get_channel_volume (MateMixerStream *stream, guint channel) { MateMixerStreamInterface *iface; @@ -366,7 +363,7 @@ mate_mixer_stream_get_channel_volume (MateMixerStream *stream, guint channel) gboolean mate_mixer_stream_set_channel_volume (MateMixerStream *stream, guint channel, - gint64 volume) + guint volume) { MateMixerStreamInterface *iface; @@ -428,7 +425,7 @@ mate_mixer_stream_has_position (MateMixerStream *stream, return FALSE; } -gint64 +guint mate_mixer_stream_get_position_volume (MateMixerStream *stream, MateMixerChannelPosition position) { @@ -447,7 +444,7 @@ mate_mixer_stream_get_position_volume (MateMixerStream *stream, gboolean mate_mixer_stream_set_position_volume (MateMixerStream *stream, MateMixerChannelPosition position, - gint64 volume) + guint volume) { MateMixerStreamInterface *iface; @@ -494,23 +491,23 @@ mate_mixer_stream_set_position_decibel (MateMixerStream *stream, return FALSE; } -gdouble +gfloat mate_mixer_stream_get_balance (MateMixerStream *stream) { MateMixerStreamInterface *iface; - g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), 0); + g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), 0.0f); iface = MATE_MIXER_STREAM_GET_INTERFACE (stream); if (iface->get_balance) return iface->get_balance (stream); - return 0; + return 0.0f; } gboolean -mate_mixer_stream_set_balance (MateMixerStream *stream, gdouble balance) +mate_mixer_stream_set_balance (MateMixerStream *stream, gfloat balance) { MateMixerStreamInterface *iface; @@ -524,23 +521,23 @@ mate_mixer_stream_set_balance (MateMixerStream *stream, gdouble balance) return FALSE; } -gdouble +gfloat mate_mixer_stream_get_fade (MateMixerStream *stream) { MateMixerStreamInterface *iface; - g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), 0); + g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), 0.0f); iface = MATE_MIXER_STREAM_GET_INTERFACE (stream); if (iface->get_fade) return iface->get_fade (stream); - return 0; + return 0.0f; } gboolean -mate_mixer_stream_set_fade (MateMixerStream *stream, gdouble fade) +mate_mixer_stream_set_fade (MateMixerStream *stream, gfloat fade) { MateMixerStreamInterface *iface; @@ -673,7 +670,7 @@ mate_mixer_stream_set_active_port (MateMixerStream *stream, const gchar *port) return FALSE; } -gint64 +guint mate_mixer_stream_get_min_volume (MateMixerStream *stream) { MateMixerStreamInterface *iface; @@ -688,7 +685,7 @@ mate_mixer_stream_get_min_volume (MateMixerStream *stream) return 0; } -gint64 +guint mate_mixer_stream_get_max_volume (MateMixerStream *stream) { MateMixerStreamInterface *iface; @@ -703,7 +700,7 @@ mate_mixer_stream_get_max_volume (MateMixerStream *stream) return 0; } -gint64 +guint mate_mixer_stream_get_normal_volume (MateMixerStream *stream) { MateMixerStreamInterface *iface; @@ -718,7 +715,7 @@ mate_mixer_stream_get_normal_volume (MateMixerStream *stream) return 0; } -gint64 +guint mate_mixer_stream_get_base_volume (MateMixerStream *stream) { MateMixerStreamInterface *iface; diff --git a/libmatemixer/matemixer-stream.h b/libmatemixer/matemixer-stream.h index a9933e1..527c470 100644 --- a/libmatemixer/matemixer-stream.h +++ b/libmatemixer/matemixer-stream.h @@ -60,19 +60,19 @@ struct _MateMixerStreamInterface gboolean (*set_mute) (MateMixerStream *stream, gboolean mute); guint (*get_num_channels) (MateMixerStream *stream); - gint64 (*get_volume) (MateMixerStream *stream); + guint (*get_volume) (MateMixerStream *stream); gboolean (*set_volume) (MateMixerStream *stream, - gint64 volume); + guint volume); gdouble (*get_decibel) (MateMixerStream *stream); gboolean (*set_decibel) (MateMixerStream *stream, gdouble decibel); MateMixerChannelPosition (*get_channel_position) (MateMixerStream *stream, guint channel); - gint64 (*get_channel_volume) (MateMixerStream *stream, + guint (*get_channel_volume) (MateMixerStream *stream, guint channel); gboolean (*set_channel_volume) (MateMixerStream *stream, guint channel, - gint64 volume); + guint volume); gdouble (*get_channel_decibel) (MateMixerStream *stream, guint channel); gboolean (*set_channel_decibel) (MateMixerStream *stream, @@ -80,22 +80,22 @@ struct _MateMixerStreamInterface gdouble decibel); gboolean (*has_position) (MateMixerStream *stream, MateMixerChannelPosition position); - gint64 (*get_position_volume) (MateMixerStream *stream, + guint (*get_position_volume) (MateMixerStream *stream, MateMixerChannelPosition position); gboolean (*set_position_volume) (MateMixerStream *stream, MateMixerChannelPosition position, - gint64 volume); + guint volume); gdouble (*get_position_decibel) (MateMixerStream *stream, MateMixerChannelPosition position); gboolean (*set_position_decibel) (MateMixerStream *stream, MateMixerChannelPosition position, gdouble decibel); - gdouble (*get_balance) (MateMixerStream *stream); + gfloat (*get_balance) (MateMixerStream *stream); gboolean (*set_balance) (MateMixerStream *stream, - gdouble balance); - gdouble (*get_fade) (MateMixerStream *stream); + gfloat balance); + gfloat (*get_fade) (MateMixerStream *stream); gboolean (*set_fade) (MateMixerStream *stream, - gdouble fade); + gfloat fade); gboolean (*suspend) (MateMixerStream *stream); gboolean (*resume) (MateMixerStream *stream); gboolean (*monitor_start) (MateMixerStream *stream); @@ -105,10 +105,10 @@ struct _MateMixerStreamInterface MateMixerPort * (*get_active_port) (MateMixerStream *stream); gboolean (*set_active_port) (MateMixerStream *stream, const gchar *port); - gint64 (*get_min_volume) (MateMixerStream *stream); - gint64 (*get_max_volume) (MateMixerStream *stream); - gint64 (*get_normal_volume) (MateMixerStream *stream); - gint64 (*get_base_volume) (MateMixerStream *stream); + guint (*get_min_volume) (MateMixerStream *stream); + guint (*get_max_volume) (MateMixerStream *stream); + guint (*get_normal_volume) (MateMixerStream *stream); + guint (*get_base_volume) (MateMixerStream *stream); /* Signals */ void (*monitor_value) (MateMixerStream *stream, @@ -129,9 +129,9 @@ gboolean mate_mixer_stream_set_mute (MateMixerStre guint mate_mixer_stream_get_num_channels (MateMixerStream *stream); -gint64 mate_mixer_stream_get_volume (MateMixerStream *stream); +guint mate_mixer_stream_get_volume (MateMixerStream *stream); gboolean mate_mixer_stream_set_volume (MateMixerStream *stream, - gint64 volume); + guint volume); gdouble mate_mixer_stream_get_decibel (MateMixerStream *stream); gboolean mate_mixer_stream_set_decibel (MateMixerStream *stream, @@ -140,11 +140,11 @@ gboolean mate_mixer_stream_set_decibel (MateMixerStre MateMixerChannelPosition mate_mixer_stream_get_channel_position (MateMixerStream *stream, guint channel); -gint64 mate_mixer_stream_get_channel_volume (MateMixerStream *stream, +guint mate_mixer_stream_get_channel_volume (MateMixerStream *stream, guint channel); gboolean mate_mixer_stream_set_channel_volume (MateMixerStream *stream, guint channel, - gint64 volume); + guint volume); gdouble mate_mixer_stream_get_channel_decibel (MateMixerStream *stream, guint channel); @@ -155,11 +155,11 @@ gboolean mate_mixer_stream_set_channel_decibel (MateMixerStre gboolean mate_mixer_stream_has_position (MateMixerStream *stream, MateMixerChannelPosition position); -gint64 mate_mixer_stream_get_position_volume (MateMixerStream *stream, +guint mate_mixer_stream_get_position_volume (MateMixerStream *stream, MateMixerChannelPosition position); gboolean mate_mixer_stream_set_position_volume (MateMixerStream *stream, MateMixerChannelPosition position, - gint64 volume); + guint volume); gdouble mate_mixer_stream_get_position_decibel (MateMixerStream *stream, MateMixerChannelPosition position); @@ -167,13 +167,13 @@ gboolean mate_mixer_stream_set_position_decibel (MateMixerStre MateMixerChannelPosition position, gdouble decibel); -gdouble mate_mixer_stream_get_balance (MateMixerStream *stream); +gfloat mate_mixer_stream_get_balance (MateMixerStream *stream); gboolean mate_mixer_stream_set_balance (MateMixerStream *stream, - gdouble balance); + gfloat balance); -gdouble mate_mixer_stream_get_fade (MateMixerStream *stream); +gfloat mate_mixer_stream_get_fade (MateMixerStream *stream); gboolean mate_mixer_stream_set_fade (MateMixerStream *stream, - gdouble fade); + gfloat fade); gboolean mate_mixer_stream_suspend (MateMixerStream *stream); gboolean mate_mixer_stream_resume (MateMixerStream *stream); @@ -189,10 +189,10 @@ MateMixerPort * mate_mixer_stream_get_active_port (MateMixerStre gboolean mate_mixer_stream_set_active_port (MateMixerStream *stream, const gchar *port); -gint64 mate_mixer_stream_get_min_volume (MateMixerStream *stream); -gint64 mate_mixer_stream_get_max_volume (MateMixerStream *stream); -gint64 mate_mixer_stream_get_normal_volume (MateMixerStream *stream); -gint64 mate_mixer_stream_get_base_volume (MateMixerStream *stream); +guint mate_mixer_stream_get_min_volume (MateMixerStream *stream); +guint mate_mixer_stream_get_max_volume (MateMixerStream *stream); +guint mate_mixer_stream_get_normal_volume (MateMixerStream *stream); +guint mate_mixer_stream_get_base_volume (MateMixerStream *stream); G_END_DECLS diff --git a/libmatemixer/matemixer.c b/libmatemixer/matemixer.c index 602d5d2..8965599 100644 --- a/libmatemixer/matemixer.c +++ b/libmatemixer/matemixer.c @@ -75,6 +75,19 @@ mate_mixer_init (void) return mixer_initialized; } +/** + * mate_mixer_is_initialized: + * + * Returns TRUE if the library has been initialized. + * + * Returns: %TRUE or %FALSE + */ +gboolean +mate_mixer_is_initialized (void) +{ + return mixer_initialized; +} + /** * mate_mixer_deinit: * @@ -104,13 +117,6 @@ mate_mixer_get_modules (void) return (const GList *) mixer_modules; } -/* Internal function: return TRUE if the library has been initialized */ -gboolean -mate_mixer_is_initialized (void) -{ - return mixer_initialized; -} - static void mixer_load_modules (void) { diff --git a/libmatemixer/matemixer.h b/libmatemixer/matemixer.h index a36c89c..f5c1a78 100644 --- a/libmatemixer/matemixer.h +++ b/libmatemixer/matemixer.h @@ -32,8 +32,9 @@ G_BEGIN_DECLS -gboolean mate_mixer_init (void); -void mate_mixer_deinit (void); +gboolean mate_mixer_init (void); +gboolean mate_mixer_is_initialized (void); +void mate_mixer_deinit (void); G_END_DECLS -- cgit v1.2.1