break; case SNDRV_CTL_ELEM_TYPE_ENUMERATED:
uinfo->value.enumerated.items =
le32_to_cpu(kinfo->value.enumerated.items);
i = uinfo->value.enumerated.item; if (i >= uinfo->value.enumerated.items) return -EINVAL;
switch (type) { case VIRTIO_SND_CTL_TYPE_BOOLEAN: case VIRTIO_SND_CTL_TYPE_INTEGER: for (i = 0; i < count; ++i)
uvalue->value.integer.value[i] =
le32_to_cpu(kvalue->value.integer[i]); break; case VIRTIO_SND_CTL_TYPE_INTEGER64: for (i = 0; i < count; ++i)
uvalue->value.integer64.value[i] =
le64_to_cpu(kvalue->value.integer64[i]); break; case VIRTIO_SND_CTL_TYPE_ENUMERATED: for (i = 0; i < count; ++i)
uvalue->value.enumerated.item[i] =
le32_to_cpu(kvalue->value.enumerated[i]); break; case VIRTIO_SND_CTL_TYPE_BYTES:
memcpy(uvalue->value.bytes.data, kvalue->value.bytes, count); break; case VIRTIO_SND_CTL_TYPE_IEC958:
memcpy(&uvalue->value.iec958, &kvalue->value.iec958, sizeof(uvalue->value.iec958)); break;
}
on_failure:
virtsnd_ctl_msg_unref(msg);
return rc;
}
/** * virtsnd_kctl_put() - Write the value to the control. * @kcontrol: ALSA control element. * @uvalue: Element value. * * Context: Process context. * Return: 0 on success, -errno on failure.
*/ staticint virtsnd_kctl_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *uvalue)
{ struct virtio_snd *snd = snd_kcontrol_chip(kcontrol); struct virtio_snd_ctl_info *kinfo =
&snd->kctl_infos[kcontrol->private_value]; unsignedint type = le32_to_cpu(kinfo->type); unsignedint count = le32_to_cpu(kinfo->count); struct virtio_snd_msg *msg; struct virtio_snd_ctl_hdr *hdr; struct virtio_snd_ctl_value *kvalue;
size_t request_size = sizeof(*hdr) + sizeof(*kvalue);
size_t response_size = sizeof(struct virtio_snd_hdr); unsignedint i;
msg = virtsnd_ctl_msg_alloc(request_size, response_size, GFP_KERNEL); if (!msg) return -ENOMEM;
switch (type) { case VIRTIO_SND_CTL_TYPE_BOOLEAN: case VIRTIO_SND_CTL_TYPE_INTEGER: for (i = 0; i < count; ++i)
kvalue->value.integer[i] =
cpu_to_le32(uvalue->value.integer.value[i]); break; case VIRTIO_SND_CTL_TYPE_INTEGER64: for (i = 0; i < count; ++i)
kvalue->value.integer64[i] =
cpu_to_le64(uvalue->value.integer64.value[i]); break; case VIRTIO_SND_CTL_TYPE_ENUMERATED: for (i = 0; i < count; ++i)
kvalue->value.enumerated[i] =
cpu_to_le32(uvalue->value.enumerated.item[i]); break; case VIRTIO_SND_CTL_TYPE_BYTES:
memcpy(kvalue->value.bytes, uvalue->value.bytes.data, count); break; case VIRTIO_SND_CTL_TYPE_IEC958:
memcpy(&kvalue->value.iec958, &uvalue->value.iec958, sizeof(kvalue->value.iec958)); break;
}
return virtsnd_ctl_msg_send_sync(snd, msg);
}
/** * virtsnd_kctl_tlv_op() - Perform an operation on the control's metadata. * @kcontrol: ALSA control element. * @op_flag: Operation code (SNDRV_CTL_TLV_OP_XXX). * @size: Size of the TLV data in bytes. * @utlv: TLV data. * * Context: Process context. * Return: 0 on success, -errno on failure.
*/ staticint virtsnd_kctl_tlv_op(struct snd_kcontrol *kcontrol, int op_flag, unsignedint size, unsignedint __user *utlv)
{ struct virtio_snd *snd = snd_kcontrol_chip(kcontrol); struct virtio_snd_msg *msg; struct virtio_snd_ctl_hdr *hdr; unsignedint *tlv; struct scatterlist sg; int rc;
msg = virtsnd_ctl_msg_alloc(sizeof(*hdr), sizeof(struct virtio_snd_hdr),
GFP_KERNEL); if (!msg) return -ENOMEM;
/** * virtsnd_kctl_parse_cfg() - Parse the control element configuration. * @snd: VirtIO sound device. * * This function is called during initial device initialization. * * Context: Any context that permits to sleep. * Return: 0 on success, -errno on failure.
*/ int virtsnd_kctl_parse_cfg(struct virtio_snd *snd)
{ struct virtio_device *vdev = snd->vdev;
u32 i; int rc;
virtio_cread_le(vdev, struct virtio_snd_config, controls,
&snd->nkctls); if (!snd->nkctls) return 0;
snd->kctl_infos = devm_kcalloc(&vdev->dev, snd->nkctls, sizeof(*snd->kctl_infos), GFP_KERNEL); if (!snd->kctl_infos) return -ENOMEM;
snd->kctls = devm_kcalloc(&vdev->dev, snd->nkctls, sizeof(*snd->kctls),
GFP_KERNEL); if (!snd->kctls) return -ENOMEM;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.