*/
G_DEFINE_QUARK(alsactl-card-error-quark, alsactl_card_error)
+#define generate_syscall_error(exception, errno, fmt, arg) \
+ g_set_error(exception, ALSACTL_CARD_ERROR, ALSACTL_CARD_ERROR_FAILED, \
+ fmt" %d(%s)", arg, errno, strerror(errno))
+
typedef struct {
GSource src;
ALSACtlCard *self;
// Remember the version of protocol currently used.
if (ioctl(priv->fd, SNDRV_CTL_IOCTL_PVERSION, &proto_ver) < 0) {
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "PVERSION");
close(priv->fd);
priv->fd = -1;
g_free(devnode);
ctl_card_info_refer_private(*card_info, &info);
if (ioctl(priv->fd, SNDRV_CTL_IOCTL_CARD_INFO, info) < 0) {
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "CARD_INFO");
g_object_unref(*card_info);
}
}
// Get the number of elements in this control device.
if (ioctl(fd, SNDRV_CTL_IOCTL_ELEM_LIST, list) < 0) {
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "ELEM_LIST");
return;
}
// Get the IDs of elements in this control device.
if (ioctl(fd, SNDRV_CTL_IOCTL_ELEM_LIST, list) < 0) {
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "ELEM_LIST");
free(ids);
list->pids = NULL;
return;
gboolean lock, GError **error)
{
ALSACtlCardPrivate *priv;
+ unsigned long req;
+ const char *req_name;
int ret;
g_return_if_fail(ALSACTL_IS_CARD(self));
g_return_if_fail(elem_id != NULL);
g_return_if_fail(error == NULL || *error == NULL);
- if (lock)
- ret = ioctl(priv->fd, SNDRV_CTL_IOCTL_ELEM_LOCK, elem_id);
- else
- ret = ioctl(priv->fd, SNDRV_CTL_IOCTL_ELEM_UNLOCK, elem_id);
+ if (lock) {
+ req = SNDRV_CTL_IOCTL_ELEM_LOCK;
+ req_name = "ELEM_LOCK";
+ } else {
+ req = SNDRV_CTL_IOCTL_ELEM_UNLOCK;
+ req_name = "ELEM_UNLOCK";
+ }
+
+ ret = ioctl(priv->fd, req, elem_id);
if (ret < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", req_name);
}
static void parse_enum_names(ALSACtlCardPrivate *priv,
for (i = 0; i < count; ++i) {
info->value.enumerated.item = i;
if (ioctl(priv->fd, SNDRV_CTL_IOCTL_ELEM_INFO, info)) {
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "ELEM_INFO");
goto error;
}
info->id = *elem_id;
if (ioctl(priv->fd, SNDRV_CTL_IOCTL_ELEM_INFO, info)) {
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "ELEM_INFO");
return;
}
memcpy(packet->tlv, container, container_size);
if (ioctl(priv->fd, SNDRV_CTL_IOCTL_TLV_WRITE, packet) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "TLV_WRITE");
g_free(packet);
}
packet->length = container_size;
if (ioctl(priv->fd, SNDRV_CTL_IOCTL_TLV_READ, packet) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "TLV_READ");
memcpy(*container, packet->tlv, packet->length);
*container_count = packet->length / sizeof(**container);
memcpy(packet->tlv, *container, container_size);
if (ioctl(priv->fd, SNDRV_CTL_IOCTL_TLV_COMMAND, packet) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "TLV_COMMAND");
memcpy(*container, packet->tlv, packet->length);
*container_count = packet->length / sizeof(**container);
{
struct snd_ctl_elem_info *info;
long request;
+ const char *req_name;
int i;
ctl_elem_info_refer_private(elem_info, &info);
info->id = *elem_id;
- if (!replace)
+ if (!replace) {
request = SNDRV_CTL_IOCTL_ELEM_ADD;
- else
+ req_name = "ELEM_ADD";
+ } else {
request = SNDRV_CTL_IOCTL_ELEM_REPLACE;
+ req_name = "ELEM_REPLACE";
+ }
info->owner = (__kernel_pid_t)elem_count;
if (ioctl(fd, request, info) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", req_name);
g_free((void *)info->value.enumerated.names_ptr);
if (*error != NULL)
return;
g_return_if_fail(error == NULL || *error == NULL);
if (ioctl(priv->fd, SNDRV_CTL_IOCTL_ELEM_REMOVE, elem_id) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "ELEM_REMOVE");
}
/**
value->id = *elem_id;
if (ioctl(priv->fd, SNDRV_CTL_IOCTL_ELEM_WRITE, value) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "ELEM_WRITE");
}
/**
value->id = *elem_id;
if (ioctl(priv->fd, SNDRV_CTL_IOCTL_ELEM_READ, value) < 0)
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "ELEM_READ");
}
static void handle_elem_event(CtlCardSource *src, struct snd_ctl_event *ev)
g_atomic_int_inc(&priv->subscribers);
if (ioctl(priv->fd, SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS, &subscribe)) {
- generate_error(error, errno);
+ generate_syscall_error(error, errno, "ioctl(%s)", "SUBSCRIBE_EVENTS");
g_source_unref(*gsrc);
}
}