diff options
Diffstat (limited to 'libmatemixer/matemixer-backend.c')
-rw-r--r-- | libmatemixer/matemixer-backend.c | 163 |
1 files changed, 159 insertions, 4 deletions
diff --git a/libmatemixer/matemixer-backend.c b/libmatemixer/matemixer-backend.c index 890c34b..474edd4 100644 --- a/libmatemixer/matemixer-backend.c +++ b/libmatemixer/matemixer-backend.c @@ -19,15 +19,121 @@ #include <glib-object.h> #include "matemixer-backend.h" +#include "matemixer-enums.h" +#include "matemixer-enum-types.h" #include "matemixer-stream.h" +enum { + DEVICE_ADDED, + DEVICE_CHANGED, + DEVICE_REMOVED, + STREAM_ADDED, + STREAM_CHANGED, + STREAM_REMOVED, + N_SIGNALS +}; + +static guint signals[N_SIGNALS] = { 0, }; + G_DEFINE_INTERFACE (MateMixerBackend, mate_mixer_backend, G_TYPE_OBJECT) static void mate_mixer_backend_default_init (MateMixerBackendInterface *iface) { + g_object_interface_install_property (iface, + g_param_spec_enum ("state", + "State", + "Backend connection state", + MATE_MIXER_TYPE_STATE, + MATE_MIXER_STATE_IDLE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + signals[DEVICE_ADDED] = g_signal_new ("device-added", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (MateMixerBackendInterface, device_added), + NULL, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, + 1, + G_TYPE_STRING); + + signals[DEVICE_CHANGED] = g_signal_new ("device-changed", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (MateMixerBackendInterface, device_changed), + NULL, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, + 1, + G_TYPE_STRING); + + signals[DEVICE_REMOVED] = g_signal_new ("device-removed", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (MateMixerBackendInterface, device_removed), + NULL, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, + 1, + G_TYPE_STRING); + + signals[STREAM_ADDED] = g_signal_new ("stream-added", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (MateMixerBackendInterface, stream_added), + NULL, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, + 1, + G_TYPE_STRING); + + signals[STREAM_CHANGED] = g_signal_new ("stream-changed", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (MateMixerBackendInterface, stream_changed), + NULL, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, + 1, + G_TYPE_STRING); + + signals[STREAM_REMOVED] = g_signal_new ("stream-removed", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (MateMixerBackendInterface, stream_removed), + NULL, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, + 1, + G_TYPE_STRING); +} + +void +mate_mixer_backend_set_data (MateMixerBackend *backend, const MateMixerBackendData *data) +{ + MateMixerBackendInterface *iface; + + g_return_if_fail (MATE_MIXER_IS_BACKEND (backend)); + + iface = MATE_MIXER_BACKEND_GET_INTERFACE (backend); + + if (iface->set_data) + iface->set_data (backend, data); } +/* + * Required behaviour: + * if the function returns TRUE, the state must be either MATE_MIXER_STATE_READY or + * MATE_MIXER_STATE_CONNECTING. + */ gboolean mate_mixer_backend_open (MateMixerBackend *backend) { @@ -37,10 +143,11 @@ mate_mixer_backend_open (MateMixerBackend *backend) iface = MATE_MIXER_BACKEND_GET_INTERFACE (backend); - if (iface->open) - return iface->open (backend); - - return FALSE; + if (!iface->open) { + g_critical ("Backend module does not implement the open() method"); + return FALSE; + } + return iface->open (backend); } void @@ -56,6 +163,22 @@ mate_mixer_backend_close (MateMixerBackend *backend) iface->close (backend); } +MateMixerState +mate_mixer_backend_get_state (MateMixerBackend *backend) +{ + MateMixerBackendInterface *iface; + + g_return_val_if_fail (MATE_MIXER_IS_BACKEND (backend), MATE_MIXER_STATE_UNKNOWN); + + iface = MATE_MIXER_BACKEND_GET_INTERFACE (backend); + + if (!iface->get_state) { + g_critical ("Backend module does not implement the get_state() method"); + return MATE_MIXER_STATE_UNKNOWN; + } + return iface->get_state (backend); +} + GList * mate_mixer_backend_list_devices (MateMixerBackend *backend) { @@ -101,6 +224,22 @@ mate_mixer_backend_get_default_input_stream (MateMixerBackend *backend) return NULL; } +gboolean +mate_mixer_backend_set_default_input_stream (MateMixerBackend *backend, + MateMixerStream *stream) +{ + MateMixerBackendInterface *iface; + + g_return_val_if_fail (MATE_MIXER_IS_BACKEND (backend), FALSE); + + iface = MATE_MIXER_BACKEND_GET_INTERFACE (backend); + + if (iface->set_default_input_stream) + return iface->set_default_input_stream (backend, stream); + + return FALSE; +} + MateMixerStream * mate_mixer_backend_get_default_output_stream (MateMixerBackend *backend) { @@ -115,3 +254,19 @@ mate_mixer_backend_get_default_output_stream (MateMixerBackend *backend) return NULL; } + +gboolean +mate_mixer_backend_set_default_output_stream (MateMixerBackend *backend, + MateMixerStream *stream) +{ + MateMixerBackendInterface *iface; + + g_return_val_if_fail (MATE_MIXER_IS_BACKEND (backend), FALSE); + + iface = MATE_MIXER_BACKEND_GET_INTERFACE (backend); + + if (iface->set_default_output_stream) + return iface->set_default_output_stream (backend, stream); + + return FALSE; +} |