static void roar_cancel(void *data) { roar_t * self = data; g_mutex_lock(self->lock); if (self->vss != NULL) { roar_vs_t *vss = self->vss; self->vss = NULL; roar_vs_close(vss, ROAR_VS_TRUE, &(self->err)); self->alive = false; vss = roar_vs_new_from_con(&(self->con), &(self->err)); if (vss) { roar_vs_stream(vss, &(self->info), ROAR_DIR_PLAY, &(self->err)); roar_vs_role(vss, self->role, &(self->err)); self->vss = vss; self->alive = true; } } g_mutex_unlock(self->lock); }
static int op_roar_open(sample_format_t sf, const channel_position_t *channel_map) { struct roar_audio_info info; int ret; memset(&info, 0, sizeof(info)); ROAR_DBG("op_roar_open(*) = ?"); format = sf; info.rate = sf_get_rate(sf); info.channels = sf_get_channels(sf); info.bits = sf_get_bits(sf); if (sf_get_bigendian(sf)) { if (sf_get_signed(sf)) { info.codec = ROAR_CODEC_PCM_S_BE; } else { info.codec = ROAR_CODEC_PCM_U_BE; } } else { if (sf_get_signed(sf)) { info.codec = ROAR_CODEC_PCM_S_LE; } else { info.codec = ROAR_CODEC_PCM_U_LE; } } ROAR_DBG("op_roar_open(*) = ?"); if (roar_libroar_set_server(host) == -1) { ROAR_DBG("op_roar_open(*) = ?"); roar_err_to_errno(); return -OP_ERROR_ERRNO; } if ( roar_simple_connect2(&con, NULL, "C* Music Player (cmus)", ROAR_ENUM_FLAG_NONBLOCK, 0) == -1 ) { ROAR_DBG("op_roar_open(*) = ?"); roar_err_to_errno(); return -OP_ERROR_ERRNO; } vss = roar_vs_new_from_con(&con, &err); if (vss == NULL) { ROAR_DBG("op_roar_open(*) = ?"); roar_disconnect(&con); _err_to_errno(); return -OP_ERROR_ERRNO; } if (roar_vs_stream(vss, &info, ROAR_DIR_PLAY, &err) == -1) { ROAR_DBG("op_roar_open(*) = ?"); roar_disconnect(&con); _err_to_errno(); return -OP_ERROR_ERRNO; } ROAR_DBG("op_roar_open(*) = ?"); if (roar_vs_buffer(vss, 2048*8, &err) == -1) { roar_vs_close(vss, ROAR_VS_TRUE, NULL); roar_disconnect(&con); _err_to_errno(); return -OP_ERROR_ERRNO; } ROAR_DBG("op_roar_open(*) = ?"); ret = _set_role(); if (ret != 0) { roar_vs_close(vss, ROAR_VS_TRUE, NULL); roar_disconnect(&con); _err_to_errno(); return ret; } ROAR_DBG("op_roar_open(*) = ?"); if (roar_vs_blocking(vss, ROAR_VS_FALSE, &err) == -1) { /* FIXME: handle this error */ } ROAR_DBG("op_roar_open(*) = 0"); return 0; }
static bool roar_open(void *data, struct audio_format *audio_format, GError **error) { roar_t * self = data; g_mutex_lock(self->lock); if (roar_simple_connect(&(self->con), self->host, self->name) < 0) { g_set_error(error, roar_output_quark(), 0, "Failed to connect to Roar server"); g_mutex_unlock(self->lock); return false; } self->vss = roar_vs_new_from_con(&(self->con), &(self->err)); if (self->vss == NULL || self->err != ROAR_ERROR_NONE) { g_set_error(error, roar_output_quark(), 0, "Failed to connect to server"); g_mutex_unlock(self->lock); return false; } self->info.rate = audio_format->sample_rate; self->info.channels = audio_format->channels; self->info.codec = ROAR_CODEC_PCM_S; switch (audio_format->format) { case SAMPLE_FORMAT_S8: self->info.bits = 8; break; case SAMPLE_FORMAT_S16: self->info.bits = 16; break; case SAMPLE_FORMAT_S24: self->info.bits = 24; break; case SAMPLE_FORMAT_S24_P32: self->info.bits = 32; audio_format->format = SAMPLE_FORMAT_S32; break; case SAMPLE_FORMAT_S32: self->info.bits = 32; break; default: self->info.bits = 16; audio_format->format = SAMPLE_FORMAT_S16; } audio_format->reverse_endian = 0; if (roar_vs_stream(self->vss, &(self->info), ROAR_DIR_PLAY, &(self->err)) < 0) { g_set_error(error, roar_output_quark(), 0, "Failed to start stream"); g_mutex_unlock(self->lock); return false; } roar_vs_role(self->vss, self->role, &(self->err)); self->alive = true; g_mutex_unlock(self->lock); return true; }