From patchwork Sun Sep 18 18:59:27 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrej Krutak X-Patchwork-Id: 9338355 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id AB5AB6077F for ; Sun, 18 Sep 2016 21:13:06 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 970CD28D83 for ; Sun, 18 Sep 2016 21:13:06 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8A89D28D88; Sun, 18 Sep 2016 21:13:06 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.3 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM,T_DKIM_INVALID autolearn=no version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B6A6128D83 for ; Sun, 18 Sep 2016 21:13:05 +0000 (UTC) Received: by alsa0.perex.cz (Postfix, from userid 1000) id 687EC266A73; Sun, 18 Sep 2016 23:13:04 +0200 (CEST) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id D23DC26048C; Sun, 18 Sep 2016 23:10:45 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id 19C50266972; Sun, 18 Sep 2016 21:00:58 +0200 (CEST) Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com [74.125.82.67]) by alsa0.perex.cz (Postfix) with ESMTP id 2733126155B for ; Sun, 18 Sep 2016 21:00:53 +0200 (CEST) Received: by mail-wm0-f67.google.com with SMTP id 133so11708261wmq.2 for ; Sun, 18 Sep 2016 12:00:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=P7tuq7NDgMe7rLqPhfOaTOxqCzHn2KZwkUSPoJsp6O8=; b=P/cuFtWs4w8w4kViviCd0tH69diJOWb7yuYBQHIEa0VckiypemXYjuKEo/7D+thWl5 35gOXyj3yj0VYID6DCFQF9SnZrlrqnvy2BleDO+bF3BeI5v4coMfCZbMvucuZwEs2Hkh 6Apieqk1rQ9HQ1P+bxX0p6MErSLEP+GSt+BFiztVjw0HHAQHgTBIRETNNoSIodDI+rYp fKhhVkwfpcDDrPhOooB+j96whLQW9APJI2KYIbPVzAooF0fkIuigAxx7u2Bx7+A7dLVe HB/n7lebFBxFJVCvvPBezPTa9BX6z9Eow0s+Y3YOwKMfd9el0y52cGLEEN9FQlClul1J rt9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=P7tuq7NDgMe7rLqPhfOaTOxqCzHn2KZwkUSPoJsp6O8=; b=TxyHgwRmheGkmitv0I2I2J3kXknWv2VV1V0E6fZEZHLEeqPZMyLOKALhfAoBanPXAn JV944/3jYZaqmJ/aC14OyDvG/w87zSLFs3ZFBVNHtVGc2Vnebnhu9rWqy2sEXfsfNhhc 8N0zMTBT1T/7M4Gh5Du94UCYhRj2F4WOJHvQcd7RXQ++sYqLZda2yOFHUc87XysuQRnq qsAS6X32S0m1Qwg4C7jrI0jkz6LIiZaoNEly1BmeRvB4zG8nfx8vPYcNT33CAKH4pTyE Mjk7uu7hQu56rB5PaBimLtkbcMVwR7xvY4xuftUOCsJrhV5P575v1K8QTl5RICMAPF7/ 6TBQ== X-Gm-Message-State: AE9vXwOY5vEpX+FHUMd7ZUuaCC5NFFQXghuXsWaE+r4VgbytWpVh98aMWs/mOPniXCGn5g== X-Received: by 10.194.192.35 with SMTP id hd3mr20625546wjc.27.1474225252817; Sun, 18 Sep 2016 12:00:52 -0700 (PDT) Received: from andree.lan ([217.30.74.231]) by smtp.gmail.com with ESMTPSA id 142sm18158112wmh.12.2016.09.18.12.00.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 18 Sep 2016 12:00:51 -0700 (PDT) From: Andrej Krutak To: tiwai@suse.com, perex@perex.cz, stefanha@gmail.com, grabner@icg.tugraz.at, alsa-devel@alsa-project.org Date: Sun, 18 Sep 2016 20:59:27 +0200 Message-Id: <1474225172-32081-8-git-send-email-dev@andree.sk> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1474225172-32081-1-git-send-email-dev@andree.sk> References: <1470942147-19848-1-git-send-email-dev@andree.sk> <1474225172-32081-1-git-send-email-dev@andree.sk> Cc: Andrej Krutak Subject: [alsa-devel] [PATCH v4 07/12] ALSA: line6: Allow processing of raw incoming messages X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP Not all PODs use MIDI via USB data interface, thus allow avoiding that code and instead using direct processing. Signed-off-by: Andrej Krutak --- sound/usb/line6/driver.c | 59 ++++++++++++++++++++++++++++-------------------- sound/usb/line6/driver.h | 8 ++++--- sound/usb/line6/midi.c | 2 +- 3 files changed, 40 insertions(+), 29 deletions(-) diff --git a/sound/usb/line6/driver.c b/sound/usb/line6/driver.c index 9b16777..853a143 100644 --- a/sound/usb/line6/driver.c +++ b/sound/usb/line6/driver.c @@ -290,26 +290,31 @@ static void line6_data_received(struct urb *urb) if (urb->status == -ESHUTDOWN) return; - done = - line6_midibuf_write(mb, urb->transfer_buffer, urb->actual_length); + if (line6->properties->capabilities & LINE6_CAP_CONTROL_MIDI) { + done = + line6_midibuf_write(mb, urb->transfer_buffer, urb->actual_length); - if (done < urb->actual_length) { - line6_midibuf_ignore(mb, done); - dev_dbg(line6->ifcdev, "%d %d buffer overflow - message skipped\n", - done, urb->actual_length); - } + if (done < urb->actual_length) { + line6_midibuf_ignore(mb, done); + dev_dbg(line6->ifcdev, "%d %d buffer overflow - message skipped\n", + done, urb->actual_length); + } - for (;;) { - done = - line6_midibuf_read(mb, line6->buffer_message, - LINE6_MESSAGE_MAXLEN); + for (;;) { + done = + line6_midibuf_read(mb, line6->buffer_message, + LINE6_MESSAGE_MAXLEN); - if (done == 0) - break; + if (done == 0) + break; - line6->message_length = done; - line6_midi_receive(line6, line6->buffer_message, done); + line6->message_length = done; + line6_midi_receive(line6, line6->buffer_message, done); + if (line6->process_message) + line6->process_message(line6); + } + } else { if (line6->process_message) line6->process_message(line6); } @@ -469,7 +474,9 @@ static void line6_destruct(struct snd_card *card) struct usb_device *usbdev = line6->usbdev; /* free buffer memory first: */ - kfree(line6->buffer_message); + if (line6->properties->capabilities & LINE6_CAP_CONTROL_MIDI) + kfree(line6->buffer_message); + kfree(line6->buffer_listen); /* then free URBs: */ @@ -515,7 +522,7 @@ static void line6_get_interval(struct usb_line6 *line6) } } -static int line6_init_cap_control_midi(struct usb_line6 *line6) +static int line6_init_cap_control(struct usb_line6 *line6) { int ret; @@ -524,14 +531,16 @@ static int line6_init_cap_control_midi(struct usb_line6 *line6) if (!line6->buffer_listen) return -ENOMEM; - line6->buffer_message = kmalloc(LINE6_MESSAGE_MAXLEN, GFP_KERNEL); - if (!line6->buffer_message) - return -ENOMEM; - line6->urb_listen = usb_alloc_urb(0, GFP_KERNEL); if (!line6->urb_listen) return -ENOMEM; + if (line6->properties->capabilities & LINE6_CAP_CONTROL_MIDI) { + line6->buffer_message = kmalloc(LINE6_MESSAGE_MAXLEN, GFP_KERNEL); + if (!line6->buffer_message) + return -ENOMEM; + } + ret = line6_start_listen(line6); if (ret < 0) { dev_err(line6->ifcdev, "cannot start listening: %d\n", ret); @@ -605,8 +614,8 @@ int line6_probe(struct usb_interface *interface, line6_get_interval(line6); - if (properties->capabilities & LINE6_CAP_CONTROL_MIDI) { - ret = line6_init_cap_control_midi(line6); + if (properties->capabilities & LINE6_CAP_CONTROL) { + ret = line6_init_cap_control(line6); if (ret < 0) goto error; } @@ -676,7 +685,7 @@ int line6_suspend(struct usb_interface *interface, pm_message_t message) snd_power_change_state(line6->card, SNDRV_CTL_POWER_D3hot); - if (line6->properties->capabilities & LINE6_CAP_CONTROL_MIDI) + if (line6->properties->capabilities & LINE6_CAP_CONTROL) line6_stop_listen(line6); if (line6pcm != NULL) { @@ -695,7 +704,7 @@ int line6_resume(struct usb_interface *interface) { struct usb_line6 *line6 = usb_get_intfdata(interface); - if (line6->properties->capabilities & LINE6_CAP_CONTROL_MIDI) + if (line6->properties->capabilities & LINE6_CAP_CONTROL) line6_start_listen(line6); snd_power_change_state(line6->card, SNDRV_CTL_POWER_D0); diff --git a/sound/usb/line6/driver.h b/sound/usb/line6/driver.h index d48c7d2..d7eefe1 100644 --- a/sound/usb/line6/driver.h +++ b/sound/usb/line6/driver.h @@ -147,15 +147,17 @@ struct usb_line6 { /* URB for listening to POD data endpoint */ struct urb *urb_listen; - /* Buffer for listening to POD data endpoint */ + /* Buffer for incoming data from POD data endpoint */ unsigned char *buffer_listen; - /* Buffer for message to be processed */ + /* Buffer for message to be processed, generated from MIDI layer */ unsigned char *buffer_message; - /* Length of message to be processed */ + /* Length of message to be processed, generated from MIDI layer */ int message_length; + /* If MIDI is supported, buffer_message contains the pre-processed data; + * otherwise the data is only in urb_listen (buffer_incoming). */ void (*process_message)(struct usb_line6 *); void (*disconnect)(struct usb_line6 *line6); }; diff --git a/sound/usb/line6/midi.c b/sound/usb/line6/midi.c index cebea9b..d0fb2f2 100644 --- a/sound/usb/line6/midi.c +++ b/sound/usb/line6/midi.c @@ -258,7 +258,7 @@ int line6_init_midi(struct usb_line6 *line6) struct snd_rawmidi *rmidi; struct snd_line6_midi *line6midi; - if (!(line6->properties->capabilities & LINE6_CAP_CONTROL)) { + if (!(line6->properties->capabilities & LINE6_CAP_CONTROL_MIDI)) { /* skip MIDI initialization and report success */ return 0; }