*/
G_DEFINE_QUARK(alsaseq-user-client-error-quark, alsaseq_user_client_error)
+#define generate_syscall_error(exception, errno, fmt, arg) \
+ g_set_error(exception, ALSASEQ_USER_CLIENT_ERROR, ALSASEQ_USER_CLIENT_ERROR_FAILED, \
+ fmt" %d(%s)", arg, errno, strerror(errno))
+
typedef struct {
GSource src;
ALSASeqUserClient *self;
}
if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_CLIENT_ID, &priv->client_id) < 0) {
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "CLIENT_ID");
close(priv->fd);
priv->fd = -1;
}
// Remember the version of protocol currently used.
if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_PVERSION, &proto_ver) < 0) {
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "PVERSION");
close(priv->fd);
priv->fd = -1;
return;
info->client = priv->client_id;
info->type = USER_CLIENT;
if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_SET_CLIENT_INFO, info) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "SET_CLIENT_INFO");
}
/**
seq_client_info_refer_private(*client_info, &info);
info->client = priv->client_id;
if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_GET_CLIENT_INFO, info) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "GET_CLIENT_INFO");
}
/**
info->addr.client = priv->client_id;
if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_CREATE_PORT, info) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "CREATE_PORT");
}
/**
info->addr.port = port_id;
if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_SET_PORT_INFO, info) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "SET_PORT_INFO");
}
/**
info.addr.client = priv->client_id;
info.addr.port = port_id;
if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_DELETE_PORT, &info) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "DELETE_PORT");
}
/**
seq_client_pool_refer_private(client_pool, &pool);
pool->client = priv->client_id;
if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_SET_CLIENT_POOL, pool) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "SET_CLIENT_POOL");
}
/**
seq_client_pool_refer_private(*client_pool, &pool);
pool->client = priv->client_id;
if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_GET_CLIENT_POOL, pool) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "GET_CLIENT_POOL");
}
/**
ALSASeqUserClientPrivate *priv;
struct snd_seq_port_subscribe *data;
long request;
+ const char *label;
g_return_if_fail(ALSASEQ_IS_USER_CLIENT(self));
priv = alsaseq_user_client_get_instance_private(self);
seq_subscribe_data_refer_private(subs_data, &data);
- if (establish)
+ if (establish) {
request = SNDRV_SEQ_IOCTL_SUBSCRIBE_PORT;
- else
+ label = "SUBSCRIBE_PORT";
+ } else {
request = SNDRV_SEQ_IOCTL_UNSUBSCRIBE_PORT;
+ label = "UNSUBSCRIBE_PORT";
+ }
if (ioctl(priv->fd, request, data) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", label);
}
/**
seq_queue_info_refer_private(*queue_info, &info);
if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_CREATE_QUEUE, info) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "CREATE_QUEUE");
}
/**
info.queue = (int)queue_id;
info.owner = priv->client_id;
if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_DELETE_QUEUE, &info) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "DELETE_QUEUE");
}
/**
seq_queue_info_refer_private(queue_info, &info);
if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_SET_QUEUE_INFO, info) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "SET_QUEUE_INFO");
}
/**
data.queue = (int)queue_id;
if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_GET_QUEUE_CLIENT, &data) < 0) {
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "GET_QUEUE_CLIENT");
return;
}
data.used = use;
if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_SET_QUEUE_CLIENT, &data) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "SET_QUEUE_CLIENT");
}
/**
seq_queue_tempo_refer_private(queue_tempo, &tempo);
tempo->queue = queue_id;
if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_SET_QUEUE_TEMPO, tempo) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "SET_QUEUE_TEMPO");
}
/**
tempo->queue = queue_id;
if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_GET_QUEUE_TEMPO, tempo) < 0) {
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "GET_QUEUE_TEMPO");
g_object_unref(*queue_tempo);
}
}
timer->queue = queue_id;
if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER, timer) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "SET_QUEUE_TIMER");
}
/**
timer->queue = queue_id;
if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_GET_QUEUE_TIMER, timer) < 0) {
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "GET_QUEUE_TIMER");
return;
}
g_return_if_fail(filter != NULL);
g_return_if_fail(error == NULL || *error == NULL);
- if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_REMOVE_EVENTS, filter) < 0) {
- generate_error(error, errno);
- return;
- }
+ if (ioctl(priv->fd, SNDRV_SEQ_IOCTL_REMOVE_EVENTS, filter) < 0)
+ generate_syscall_error(error, errno, "ioctl(%s)", "REMOVE_EVENTS");
}