static ca_context* connect_canberra_context(char* device, char* driver) { ca_context* ca = NULL; if (ca_context_create(&ca) != 0) { g_warning("Create canberra context failed"); return NULL; } // set backend driver if (strlen(driver) > 0) { if (ca_context_set_driver(ca, driver) != 0 ) { g_warning("Set '%s' as backend driver failed", driver); ca_context_destroy(ca); return NULL; } } if (strlen(device) > 0) { if (ca_context_change_device(ca, device) != 0) { g_warning("Set '%s' as backend device failed", device); ca_context_destroy(ca); return NULL; } } if (ca_context_open(ca) != 0) { g_warning("Connect the context to sound system failed"); ca_context_destroy(ca); return NULL; } return ca; }
/** * gsound_context_set_driver: * @context: A #GSoundContext * @driver: libcanberra driver to use * @error: Return location for error, or %NULL * * Returns: %TRUE if the libcanberra driver was set successfully */ gboolean gsound_context_set_driver(GSoundContext *self, const char *driver, GError **error) { g_return_val_if_fail (GSOUND_IS_CONTEXT(self), FALSE); return test_return (ca_context_set_driver(self->priv->ca, driver), error); }
int ca_context_create(ca_context **_c) { ca_context *c; int ret; const char *d; ca_return_val_if_fail(!ca_detect_fork(), CA_ERROR_FORKED); ca_return_val_if_fail(_c, CA_ERROR_INVALID); if (!(c = ca_new0(ca_context, 1))) return CA_ERROR_OOM; if (!(c->mutex = ca_mutex_new())) { ca_context_destroy(c); return CA_ERROR_OOM; } if ((ret = ca_proplist_create(&c->props)) < 0) { ca_context_destroy(c); return ret; } if ((d = getenv("CANBERRA_DRIVER"))) { if ((ret = ca_context_set_driver(c, d)) < 0) { ca_context_destroy(c); return ret; } } if ((d = getenv("CANBERRA_DEVICE"))) { if ((ret = ca_context_change_device(c, d)) < 0) { ca_context_destroy(c); return ret; } } *_c = c; return CA_SUCCESS; }