Alsa-Devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Clemens Ladisch <clemens@ladisch.de>
To: Mario Kicherer <dev@kicherer.org>, alsa-devel@alsa-project.org
Subject: Re: [PATCH v2] MIDI driver for Behringer BCD2000 USB device
Date: Thu, 06 Feb 2014 10:21:52 +0100	[thread overview]
Message-ID: <52F35430.8040502@ladisch.de> (raw)
In-Reply-To: <1391631059-6840-1-git-send-email-dev@kicherer.org>

Mario Kicherer wrote:
> This patch adds initial support for the Behringer BCD2000 USB DJ controller.
> At the moment, only the MIDI part of the device is working, i.e. knobs,
> buttons and LEDs.
>
> +config SND_USB_BCD2000
> +	tristate "Behringer BCD2000 MIDI driver"
> +	select SND_HWDEP

Why HWDEP?

> +	  To compile this driver as a module, choose M here: the module
> +	  will be called snd-usb-bcd2000.

There is no need to have "usb" in the module name if that is the only
bus this device works with.

> -obj-$(CONFIG_SND) += misc/ usx2y/ caiaq/ 6fire/ hiface/
> +obj-$(CONFIG_SND) += misc/ usx2y/ caiaq/ 6fire/ hiface/ bcd2000/

If there is only a single source file, just put it into misc/.
If you plan to have multiple source files, then this file should have
"_midi" in its name.

> +#include "../usbaudio.h"
> +#include "../midi.h"

Are these headers needed?

> +static void bcd2000_midi_input_trigger(struct snd_rawmidi_substream *substream,
> +						int up)
> +{
> +	struct bcd2000 *bcd2k = substream->rmidi->private_data;
> +
> +	if (!bcd2k)
> +		return;

This cannot happen.  And if it happens anyway, silently returning is not
necessarily a better option than crashing.

> +static void bcd2000_midi_handle_input(struct bcd2000 *bcd2k,
> +					const unsigned char *buf, int len)
> +	/*
> +	 * The MIDI packets the BCD2000 sends can be arbitrarily truncated or
> +	 * concatenated. Therefore, this loop accumulates the bytes from the
> +	 * input buffer until a full valid MIDI packet is in the MIDI command
> +	 * buffer "midi_cmd_buf".
> +	 */

ALSA does not require full MIDI commands, and handles running status.

> +static int bcd2000_midi_output_close(struct snd_rawmidi_substream *substream)
> +{
> +	struct bcd2000 *bcd2k = substream->rmidi->private_data;
> +	if (bcd2k->midi_out_active) {
> +		usb_free_urb(bcd2k->midi_out_urb);

Why is this the right place to free the URB?

> +static void bcd2000_midi_output_done(struct urb *urb)
> +{
> ...
> +	if (!bcd2k->midi_out_substream)
> +		return;
> +
> +	bcd2000_midi_send(bcd2k, bcd2k->midi_out_substream);

The midi_out_substream field gets modified asynchronously by the trigger
callback; this might happen between these two statements.

Assuming that setting a pointer is atomic, use ACCESS_ONCE.

> +static void bcd2000_init_midi(struct bcd2000 *bcd2k)
> +{
> +	bcd2k->midi_in_urb = usb_alloc_urb(0, GFP_KERNEL);
> +	bcd2k->midi_out_urb = usb_alloc_urb(0, GFP_KERNEL);

Error checking.

> +static int bcd2000_probe(struct usb_interface *interface,
> +				const struct usb_device_id *usb_id)
> +{
> +	snprintf(bcd2k->card->longname, sizeof(bcd2k->card->longname),
> +			DEVICE_NAME ", at %s, %s speed",
> +			usb_path,
> +			bcd2k->dev->speed == USB_SPEED_HIGH ? "high" : "full");

The BCD2000 does not support high speed.

> +static void bcd2000_disconnect(struct usb_interface *interface)
> +{
> +	list_for_each(midi, &bcd2k->midi_list)
> +		snd_usbmidi_disconnect(midi);

midi_list is not actually used.


Regards,
Clemens

  parent reply	other threads:[~2014-02-06  9:21 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-05 20:10 [PATCH v2] MIDI driver for Behringer BCD2000 USB device Mario Kicherer
2014-02-05 22:32 ` Daniel Mack
2014-02-06  8:41   ` Takashi Iwai
2014-02-06 16:07   ` Mario Kicherer
2014-02-06 16:16     ` Daniel Mack
2014-02-06  9:21 ` Clemens Ladisch [this message]
2014-02-06 16:07   ` Mario Kicherer
2014-02-06 20:51     ` Clemens Ladisch

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=52F35430.8040502@ladisch.de \
    --to=clemens@ladisch.de \
    --cc=alsa-devel@alsa-project.org \
    --cc=dev@kicherer.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox