2020-05-02 19:33:40

by Vasily Khoruzhick

[permalink] [raw]
Subject: [PATCH 0/2] ALSA: line6: hwdep: add support for poll and non-blocking read

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

sound/usb/line6/driver.c | 20 ++++++++++++++++++++
sound/usb/line6/driver.h | 1 +
2 files changed, 21 insertions(+)

--
2.26.2


2020-05-02 19:33:53

by Vasily Khoruzhick

[permalink] [raw]
Subject: [PATCH 1/2] ALSA: line6: hwdep: add support for O_NONBLOCK opening mode

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 <[email protected]>
---
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

2020-05-02 19:36:22

by Vasily Khoruzhick

[permalink] [raw]
Subject: [PATCH 2/2] ALSA: line6: Add poll callback for hwdep

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 <[email protected]>
---
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

2020-05-02 20:35:24

by Takashi Iwai

[permalink] [raw]
Subject: Re: [PATCH 0/2] ALSA: line6: hwdep: add support for poll and non-blocking read

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

2020-05-02 21:50:28

by Vasily Khoruzhick

[permalink] [raw]
Subject: Re: [PATCH 0/2] ALSA: line6: hwdep: add support for poll and non-blocking read

On Sat, May 2, 2020 at 1:32 PM Takashi Iwai <[email protected]> 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