Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7811a3ad authored by Andrej Krutak's avatar Andrej Krutak Committed by Takashi Iwai
Browse files

ALSA: line6: Allow processing of raw incoming messages



Not all PODs use MIDI via USB data interface, thus allow avoiding
that code and instead using direct processing.

Signed-off-by: default avatarAndrej Krutak <dev@andree.sk>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 174e1fc0
Loading
Loading
Loading
Loading
+34 −25
Original line number Diff line number Diff line
@@ -290,6 +290,7 @@ static void line6_data_received(struct urb *urb)
	if (urb->status == -ESHUTDOWN)
		return;

	if (line6->properties->capabilities & LINE6_CAP_CONTROL_MIDI) {
		done =
			line6_midibuf_write(mb, urb->transfer_buffer, urb->actual_length);

@@ -313,6 +314,10 @@ static void line6_data_received(struct urb *urb)
			if (line6->process_message)
				line6->process_message(line6);
		}
	} else {
		if (line6->process_message)
			line6->process_message(line6);
	}

	line6_start_listen(line6);
}
@@ -469,7 +474,9 @@ static void line6_destruct(struct snd_card *card)
	struct usb_device *usbdev = line6->usbdev;

	/* free buffer memory first: */
	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);
+6 −3
Original line number Diff line number Diff line
@@ -147,15 +147,18 @@ 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);
};
+1 −1
Original line number Diff line number Diff line
@@ -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;
	}