static int _set_role(void) { int roleid = ROAR_ROLE_UNKNOWN; if (role == NULL) return 0; roleid = roar_str2role(role); if (roleid == ROAR_ROLE_UNKNOWN) { // TODO: warn if role is invalid. return 0; } if (roar_vs_role(vss, roleid, &err) == -1) { return -OP_ERROR_ERRNO; } return 0; }
static void *ra_init(const char *device, unsigned rate, unsigned latency) { (void)latency; int err; roar_t *roar = (roar_t*)calloc(1, sizeof(roar_t)); if (roar == NULL) return NULL; roar_vs_t *vss; if ((vss = roar_vs_new_simple(device, "RetroArch", rate, 2, ROAR_CODEC_PCM_S, 16, ROAR_DIR_PLAY, &err)) == NULL) { RARCH_ERR("RoarAudio: \"%s\"\n", roar_vs_strerr(err)); free(roar); return NULL; } roar_vs_role(vss, ROAR_ROLE_GAME, NULL); roar->vss = vss; return roar; }
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 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; }