Commit 90e8ac5c authored by Takashi Sakamoto's avatar Takashi Sakamoto Committed by Takashi Iwai

ALSA: firewire-tascam: add new hwdep ioctl command to get state image

In a previous commit, ALSA firewire-tascam driver stores state image
from tx isochronous packets. This image includes states of knob, fader,
button of control surface, level of gain/volume of each physical
inputs/outputs, and so on. It's useful for userspace applications to
read whole of the image.

This commit adds a unique ioctl command for ALSA hwdep interface for the
purpose. For actual meaning of each bits in this image, please refer to
discussion in alsa-devel[1].

[1] http://mailman.alsa-project.org/pipermail/alsa-devel/2018-October/140785.htmlSigned-off-by: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 33b2e144
...@@ -66,6 +66,7 @@ union snd_firewire_event { ...@@ -66,6 +66,7 @@ union snd_firewire_event {
#define SNDRV_FIREWIRE_IOCTL_GET_INFO _IOR('H', 0xf8, struct snd_firewire_get_info) #define SNDRV_FIREWIRE_IOCTL_GET_INFO _IOR('H', 0xf8, struct snd_firewire_get_info)
#define SNDRV_FIREWIRE_IOCTL_LOCK _IO('H', 0xf9) #define SNDRV_FIREWIRE_IOCTL_LOCK _IO('H', 0xf9)
#define SNDRV_FIREWIRE_IOCTL_UNLOCK _IO('H', 0xfa) #define SNDRV_FIREWIRE_IOCTL_UNLOCK _IO('H', 0xfa)
#define SNDRV_FIREWIRE_IOCTL_TASCAM_STATE _IOR('H', 0xfb, struct snd_firewire_tascam_state)
#define SNDRV_FIREWIRE_TYPE_DICE 1 #define SNDRV_FIREWIRE_TYPE_DICE 1
#define SNDRV_FIREWIRE_TYPE_FIREWORKS 2 #define SNDRV_FIREWIRE_TYPE_FIREWORKS 2
...@@ -90,4 +91,8 @@ struct snd_firewire_get_info { ...@@ -90,4 +91,8 @@ struct snd_firewire_get_info {
#define SNDRV_FIREWIRE_TASCAM_STATE_COUNT 64 #define SNDRV_FIREWIRE_TASCAM_STATE_COUNT 64
struct snd_firewire_tascam_state {
__be32 data[SNDRV_FIREWIRE_TASCAM_STATE_COUNT];
};
#endif /* _UAPI_SOUND_FIREWIRE_H_INCLUDED */ #endif /* _UAPI_SOUND_FIREWIRE_H_INCLUDED */
...@@ -123,6 +123,14 @@ static int hwdep_unlock(struct snd_tscm *tscm) ...@@ -123,6 +123,14 @@ static int hwdep_unlock(struct snd_tscm *tscm)
return err; return err;
} }
static int tscm_hwdep_state(struct snd_tscm *tscm, void __user *arg)
{
if (copy_to_user(arg, tscm->state, sizeof(tscm->state)))
return -EFAULT;
return 0;
}
static int hwdep_release(struct snd_hwdep *hwdep, struct file *file) static int hwdep_release(struct snd_hwdep *hwdep, struct file *file)
{ {
struct snd_tscm *tscm = hwdep->private_data; struct snd_tscm *tscm = hwdep->private_data;
...@@ -147,6 +155,8 @@ static int hwdep_ioctl(struct snd_hwdep *hwdep, struct file *file, ...@@ -147,6 +155,8 @@ static int hwdep_ioctl(struct snd_hwdep *hwdep, struct file *file,
return hwdep_lock(tscm); return hwdep_lock(tscm);
case SNDRV_FIREWIRE_IOCTL_UNLOCK: case SNDRV_FIREWIRE_IOCTL_UNLOCK:
return hwdep_unlock(tscm); return hwdep_unlock(tscm);
case SNDRV_FIREWIRE_IOCTL_TASCAM_STATE:
return tscm_hwdep_state(tscm, (void __user *)arg);
default: default:
return -ENOIOCTLCMD; return -ENOIOCTLCMD;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment