forked from luck/tmp_suning_uos_patched
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: Andrej Krutak <dev@andree.sk> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
174e1fc0bf
commit
7811a3ad18
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user