* [PATCH 1/2] ALSA: line6: hwdep: add support for O_NONBLOCK opening mode
2020-05-02 19:31 [PATCH 0/2] ALSA: line6: hwdep: add support for poll and non-blocking read Vasily Khoruzhick
@ 2020-05-02 19:31 ` Vasily Khoruzhick
2020-05-02 19:31 ` [PATCH 2/2] ALSA: line6: Add poll callback for hwdep Vasily Khoruzhick
2020-05-02 20:32 ` [PATCH 0/2] ALSA: line6: hwdep: add support for poll and non-blocking read Takashi Iwai
2 siblings, 0 replies; 5+ messages in thread
From: Vasily Khoruzhick @ 2020-05-02 19:31 UTC (permalink / raw)
To: Jaroslav Kysela, Takashi Iwai, Thomas Gleixner, Pavel Machek,
Allison Randal, alsa-devel, linux-kernel
Cc: Vasily Khoruzhick
Currently line6 hwdep interface ignores O_NONBLOCK flag when
opening device and it renders it somewhat useless when using poll.
Check for O_NONBLOCK flag when opening device and don't block read()
if it is set.
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
---
sound/usb/line6/driver.c | 4 ++++
sound/usb/line6/driver.h | 1 +
2 files changed, 5 insertions(+)
diff --git a/sound/usb/line6/driver.c b/sound/usb/line6/driver.c
index 4f096685ed65..86adf87d57f0 100644
--- a/sound/usb/line6/driver.c
+++ b/sound/usb/line6/driver.c
@@ -550,6 +550,7 @@ static int line6_hwdep_open(struct snd_hwdep *hw, struct file *file)
/* NOTE: hwdep layer provides atomicity here */
line6->messages.active = 1;
+ line6->messages.nonblock = file->f_flags & O_NONBLOCK ? 1 : 0;
return 0;
}
@@ -579,6 +580,9 @@ line6_hwdep_read(struct snd_hwdep *hwdep, char __user *buf, long count,
while (kfifo_len(&line6->messages.fifo) == 0) {
mutex_unlock(&line6->messages.read_lock);
+ if (line6->messages.nonblock)
+ return -EAGAIN;
+
rv = wait_event_interruptible(
line6->messages.wait_queue,
kfifo_len(&line6->messages.fifo) != 0);
diff --git a/sound/usb/line6/driver.h b/sound/usb/line6/driver.h
index e5e572ed5f30..1a4e3700c80c 100644
--- a/sound/usb/line6/driver.h
+++ b/sound/usb/line6/driver.h
@@ -163,6 +163,7 @@ struct usb_line6 {
struct mutex read_lock;
wait_queue_head_t wait_queue;
unsigned int active:1;
+ unsigned int nonblock:1;
STRUCT_KFIFO_REC_2(LINE6_BUFSIZE_LISTEN * LINE6_RAW_MESSAGES_MAXCOUNT)
fifo;
} messages;
--
2.26.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2] ALSA: line6: Add poll callback for hwdep
2020-05-02 19:31 [PATCH 0/2] ALSA: line6: hwdep: add support for poll and non-blocking read Vasily Khoruzhick
2020-05-02 19:31 ` [PATCH 1/2] ALSA: line6: hwdep: add support for O_NONBLOCK opening mode Vasily Khoruzhick
@ 2020-05-02 19:31 ` Vasily Khoruzhick
2020-05-02 20:32 ` [PATCH 0/2] ALSA: line6: hwdep: add support for poll and non-blocking read Takashi Iwai
2 siblings, 0 replies; 5+ messages in thread
From: Vasily Khoruzhick @ 2020-05-02 19:31 UTC (permalink / raw)
To: Jaroslav Kysela, Takashi Iwai, Thomas Gleixner, Pavel Machek,
Allison Randal, alsa-devel, linux-kernel
Cc: Vasily Khoruzhick
At least POD HD500 uses message-based communication, both sides can
send messages. Add poll callback so application can wait for device
messages without using busy loop.
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
---
sound/usb/line6/driver.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/sound/usb/line6/driver.c b/sound/usb/line6/driver.c
index 86adf87d57f0..7629116f570e 100644
--- a/sound/usb/line6/driver.c
+++ b/sound/usb/line6/driver.c
@@ -630,11 +630,27 @@ line6_hwdep_write(struct snd_hwdep *hwdep, const char __user *data, long count,
return rv;
}
+static __poll_t
+line6_hwdep_poll(struct snd_hwdep *hwdep, struct file *file, poll_table *wait)
+{
+ __poll_t rv;
+ struct usb_line6 *line6 = hwdep->private_data;
+
+ poll_wait(file, &line6->messages.wait_queue, wait);
+
+ mutex_lock(&line6->messages.read_lock);
+ rv = kfifo_len(&line6->messages.fifo) == 0 ? 0 : EPOLLIN | EPOLLRDNORM;
+ mutex_unlock(&line6->messages.read_lock);
+
+ return rv;
+}
+
static const struct snd_hwdep_ops hwdep_ops = {
.open = line6_hwdep_open,
.release = line6_hwdep_release,
.read = line6_hwdep_read,
.write = line6_hwdep_write,
+ .poll = line6_hwdep_poll,
};
/* Insert into circular buffer */
--
2.26.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 0/2] ALSA: line6: hwdep: add support for poll and non-blocking read
2020-05-02 19:31 [PATCH 0/2] ALSA: line6: hwdep: add support for poll and non-blocking read Vasily Khoruzhick
2020-05-02 19:31 ` [PATCH 1/2] ALSA: line6: hwdep: add support for O_NONBLOCK opening mode Vasily Khoruzhick
2020-05-02 19:31 ` [PATCH 2/2] ALSA: line6: Add poll callback for hwdep Vasily Khoruzhick
@ 2020-05-02 20:32 ` Takashi Iwai
2020-05-02 21:45 ` Vasily Khoruzhick
2 siblings, 1 reply; 5+ messages in thread
From: Takashi Iwai @ 2020-05-02 20:32 UTC (permalink / raw)
To: Vasily Khoruzhick
Cc: Jaroslav Kysela, Takashi Iwai, Thomas Gleixner, Pavel Machek,
Allison Randal, alsa-devel, linux-kernel
On Sat, 02 May 2020 21:31:18 +0200,
Vasily Khoruzhick wrote:
>
> This series adds support for polling and non-blocking read for hwdep
> interface. This allows apps to listen to HW events without using busy
> loop.
>
> Example of app that uses hwdep interface for POD HD500 can be found
> here: https://github.com/anarsoul/line6_hwdep_test
>
> Vasily Khoruzhick (2):
> ALSA: line6: hwdep: add support for O_NONBLOCK opening mode
> ALSA: line6: Add poll callback for hwdep
Looks like a nice extension. Applied both patches now to for-next
branch.
thanks,
Takashi
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 0/2] ALSA: line6: hwdep: add support for poll and non-blocking read
2020-05-02 20:32 ` [PATCH 0/2] ALSA: line6: hwdep: add support for poll and non-blocking read Takashi Iwai
@ 2020-05-02 21:45 ` Vasily Khoruzhick
0 siblings, 0 replies; 5+ messages in thread
From: Vasily Khoruzhick @ 2020-05-02 21:45 UTC (permalink / raw)
To: Takashi Iwai
Cc: Jaroslav Kysela, Takashi Iwai, Thomas Gleixner, Pavel Machek,
Allison Randal, Linux-ALSA, linux-kernel
On Sat, May 2, 2020 at 1:32 PM Takashi Iwai <tiwai@suse.de> wrote:
>
> On Sat, 02 May 2020 21:31:18 +0200,
> Vasily Khoruzhick wrote:
> >
> > This series adds support for polling and non-blocking read for hwdep
> > interface. This allows apps to listen to HW events without using busy
> > loop.
> >
> > Example of app that uses hwdep interface for POD HD500 can be found
> > here: https://github.com/anarsoul/line6_hwdep_test
> >
> > Vasily Khoruzhick (2):
> > ALSA: line6: hwdep: add support for O_NONBLOCK opening mode
> > ALSA: line6: Add poll callback for hwdep
>
> Looks like a nice extension. Applied both patches now to for-next
> branch.
Thanks for such a prompt response!
>
> thanks,
>
> Takashi
^ permalink raw reply [flat|nested] 5+ messages in thread