/* Process a completely received message. */ void line6_variax_process_message(struct usb_line6_variax *variax) { const unsigned char *buf = variax->line6.buffer_message; switch (buf[0]) { case LINE6_PARAM_CHANGE | LINE6_CHANNEL_HOST: switch (buf[1]) { case VARIAXMIDI_volume: variax->volume = buf[2]; break; case VARIAXMIDI_tone: variax->tone = buf[2]; } break; case LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_DEVICE: case LINE6_PROGRAM_CHANGE | LINE6_CHANNEL_HOST: variax->model = buf[1]; line6_dump_request_async(&variax->dumpreq, &variax->line6, 0, VARIAX_DUMP_PASS1); break; case LINE6_RESET: dev_info(variax->line6.ifcdev, "VARIAX reset\n"); break; case LINE6_SYSEX_BEGIN: if (memcmp(buf + 1, variax_request_model1 + 1, VARIAX_MODEL_HEADER_LENGTH - 1) == 0) { if (variax->line6.message_length == VARIAX_MODEL_MESSAGE_LENGTH) { switch (variax->dumpreq.in_progress) { case VARIAX_DUMP_PASS1: variax_decode(buf + VARIAX_MODEL_HEADER_LENGTH, (unsigned char *) &variax->model_data, (sizeof (variax->model_data. name) + sizeof(variax-> model_data. control) / 2) * 2); line6_dump_request_async (&variax->dumpreq, &variax->line6, 1, VARIAX_DUMP_PASS2); break; case VARIAX_DUMP_PASS2: /* model name is transmitted twice, so skip it here: */ variax_decode(buf + VARIAX_MODEL_HEADER_LENGTH, (unsigned char *) &variax-> model_data.control + sizeof(variax->model_data. control) / 2, sizeof(variax->model_data. control) / 2 * 2); line6_dump_request_async (&variax->dumpreq, &variax->line6, 2, VARIAX_DUMP_PASS3); } } else { DEBUG_MESSAGES(dev_err (variax->line6.ifcdev, "illegal length %d of model data\n", variax->line6.message_length)); line6_dump_finished(&variax->dumpreq); } } else if (memcmp(buf + 1, variax_request_bank + 1, sizeof(variax_request_bank) - 2) == 0) { memcpy(variax->bank, buf + sizeof(variax_request_bank) - 1, sizeof(variax->bank)); line6_dump_finished(&variax->dumpreq); variax_startup6(variax); } else if (memcmp(buf + 1, variax_init_model + 1, sizeof(variax_init_model) - 1) == 0) { memcpy(variax->guitar, buf + sizeof(variax_init_model), sizeof(variax->guitar)); } else if (memcmp(buf + 1, variax_init_version + 1, sizeof(variax_init_version) - 1) == 0) { variax_startup3(variax); } else if (memcmp(buf + 1, variax_init_done + 1, sizeof(variax_init_done) - 1) == 0) { /* notify of complete initialization: */ variax_startup4((unsigned long)variax); } break; case LINE6_SYSEX_END: break; default: DEBUG_MESSAGES(dev_err (variax->line6.ifcdev, "Variax: unknown message %02X\n", buf[0])); } }
/* Notification of data received from the Line6 device. */ static void line6_data_received(struct urb *urb) { struct usb_line6 *line6 = (struct usb_line6 *)urb->context; struct MidiBuffer *mb = &line6->line6midi->midibuf_in; int done; if (urb->status == -ESHUTDOWN) return; #if DO_DUMP_URB_RECEIVE line6_dump_urb(urb); #endif done = midibuf_write(mb, urb->transfer_buffer, urb->actual_length); if (done < urb->actual_length) { midibuf_ignore(mb, done); DEBUG_MESSAGES(dev_err(line6->ifcdev, "%d %d buffer overflow - message skipped\n", done, urb->actual_length)); } for (;;) { done = midibuf_read(mb, line6->buffer_message, LINE6_MESSAGE_MAXLEN); if (done == 0) break; /* MIDI input filter */ if (midibuf_skip_message(mb, line6->line6midi->midi_mask_receive)) continue; line6->message_length = done; #if DO_DUMP_MIDI_RECEIVE line6_write_hexdump(line6, 'r', line6->buffer_message, done); #endif line6_midi_receive(line6, line6->buffer_message, done); switch (line6->usbdev->descriptor.idProduct) { case LINE6_DEVID_BASSPODXT: case LINE6_DEVID_BASSPODXTLIVE: case LINE6_DEVID_BASSPODXTPRO: case LINE6_DEVID_PODXT: case LINE6_DEVID_PODXTPRO: case LINE6_DEVID_POCKETPOD: pod_process_message((struct usb_line6_pod *)line6); break; case LINE6_DEVID_PODXTLIVE: switch (line6->interface_number) { case PODXTLIVE_INTERFACE_POD: pod_process_message((struct usb_line6_pod *)line6); break; case PODXTLIVE_INTERFACE_VARIAX: variax_process_message((struct usb_line6_variax *)line6); break; default: dev_err(line6->ifcdev, "PODxt Live interface %d not supported\n", line6->interface_number); } break; case LINE6_DEVID_VARIAX: variax_process_message((struct usb_line6_variax *)line6); break; default: MISSING_CASE; } } line6_start_listen(line6); }