All of 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.