Example #1
0
File: roar.c Project: Brijen/cmus
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;
}
Example #2
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;
}
Example #3
0
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);
}
Example #4
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;
}