Commit 6eb3db91 authored by Takashi Iwai's avatar Takashi Iwai

Merge branch 'topic/line6' into for-next

parents d832f3dc 1263f611
......@@ -216,12 +216,11 @@ static int snd_line6_capture_open(struct snd_pcm_substream *substream)
err = snd_pcm_hw_constraint_ratdens(runtime, 0,
SNDRV_PCM_HW_PARAM_RATE,
(&line6pcm->
properties->snd_line6_rates));
&line6pcm->properties->rates);
if (err < 0)
return err;
runtime->hw = line6pcm->properties->snd_line6_capture_hw;
runtime->hw = line6pcm->properties->capture_hw;
return 0;
}
......
......@@ -22,8 +22,6 @@
#include "driver.h"
#include "midi.h"
#include "playback.h"
#include "revision.h"
#include "usbdefs.h"
#define DRIVER_AUTHOR "Markus Grabner <grabner@icg.tugraz.at>"
#define DRIVER_DESC "Line 6 USB Driver"
......@@ -44,7 +42,7 @@ static const char line6_request_version[] = {
0xf0, 0x7e, 0x7f, 0x06, 0x01, 0xf7
};
/**
/*
Class for asynchronous messages.
*/
struct message {
......
......@@ -20,6 +20,12 @@
#define DRIVER_NAME "line6usb"
#define USB_INTERVALS_PER_SECOND 1000
/* Fallback USB interval and max packet size values */
#define LINE6_FALLBACK_INTERVAL 10
#define LINE6_FALLBACK_MAXPACKETSIZE 16
#define LINE6_TIMEOUT 1
#define LINE6_BUFSIZE_LISTEN 32
#define LINE6_MESSAGE_MAXLEN 256
......@@ -60,26 +66,20 @@ extern const unsigned char line6_midi_id[3];
static const int SYSEX_DATA_OFS = sizeof(line6_midi_id) + 3;
static const int SYSEX_EXTRA_SIZE = sizeof(line6_midi_id) + 4;
/**
/*
Common properties of Line 6 devices.
*/
struct line6_properties {
/**
Card id string (maximum 16 characters).
This can be used to address the device in ALSA programs as
"default:CARD=<id>"
*/
/* Card id string (maximum 16 characters).
* This can be used to address the device in ALSA programs as
* "default:CARD=<id>"
*/
const char *id;
/**
Card short name (maximum 32 characters).
*/
/* Card short name (maximum 32 characters) */
const char *name;
/**
Bit vector defining this device's capabilities in the
line6usb driver.
*/
/* Bit vector defining this device's capabilities in line6usb driver */
int capabilities;
int altsetting;
......@@ -90,70 +90,57 @@ struct line6_properties {
unsigned ep_audio_w;
};
/**
/* Capability bits */
enum {
/* device supports settings parameter via USB */
LINE6_CAP_CONTROL = 1 << 0,
/* device supports PCM input/output via USB */
LINE6_CAP_PCM = 1 << 1,
/* device support hardware monitoring */
LINE6_CAP_HWMON = 1 << 2,
};
/*
Common data shared by all Line 6 devices.
Corresponds to a pair of USB endpoints.
*/
struct usb_line6 {
/**
USB device.
*/
/* USB device */
struct usb_device *usbdev;
/**
Properties.
*/
/* Properties */
const struct line6_properties *properties;
/**
Interval (ms).
*/
/* Interval (ms) */
int interval;
/**
Maximum size of USB packet.
*/
/* Maximum size of USB packet */
int max_packet_size;
/**
Device representing the USB interface.
*/
/* Device representing the USB interface */
struct device *ifcdev;
/**
Line 6 sound card data structure.
Each device has at least MIDI or PCM.
*/
/* Line 6 sound card data structure.
* Each device has at least MIDI or PCM.
*/
struct snd_card *card;
/**
Line 6 PCM device data structure.
*/
/* Line 6 PCM device data structure */
struct snd_line6_pcm *line6pcm;
/**
Line 6 MIDI device data structure.
*/
/* Line 6 MIDI device data structure */
struct snd_line6_midi *line6midi;
/**
URB for listening to PODxt Pro control endpoint.
*/
/* URB for listening to PODxt Pro control endpoint */
struct urb *urb_listen;
/**
Buffer for listening to PODxt Pro control endpoint.
*/
/* Buffer for listening to PODxt Pro control endpoint */
unsigned char *buffer_listen;
/**
Buffer for message to be processed.
*/
/* Buffer for message to be processed */
unsigned char *buffer_message;
/**
Length of message to be processed.
*/
/* Length of message to be processed */
int message_length;
void (*process_message)(struct usb_line6 *);
......
......@@ -17,7 +17,6 @@
#include "driver.h"
#include "midi.h"
#include "usbdefs.h"
#define line6_rawmidi_substream_midi(substream) \
((struct snd_line6_midi *)((substream)->rmidi->private_data))
......
......@@ -19,44 +19,28 @@
#define MIDI_BUFFER_SIZE 1024
struct snd_line6_midi {
/**
Pointer back to the Line 6 driver data structure.
*/
/* Pointer back to the Line 6 driver data structure */
struct usb_line6 *line6;
/**
MIDI substream for receiving (or NULL if not active).
*/
/* MIDI substream for receiving (or NULL if not active) */
struct snd_rawmidi_substream *substream_receive;
/**
MIDI substream for transmitting (or NULL if not active).
*/
/* MIDI substream for transmitting (or NULL if not active) */
struct snd_rawmidi_substream *substream_transmit;
/**
Number of currently active MIDI send URBs.
*/
/* Number of currently active MIDI send URBs */
int num_active_send_urbs;
/**
Spin lock to protect MIDI buffer handling.
*/
/* Spin lock to protect MIDI buffer handling */
spinlock_t lock;
/**
Wait queue for MIDI transmission.
*/
/* Wait queue for MIDI transmission */
wait_queue_head_t send_wait;
/**
Buffer for incoming MIDI stream.
*/
/* Buffer for incoming MIDI stream */
struct midi_buffer midibuf_in;
/**
Buffer for outgoing MIDI stream.
*/
/* Buffer for outgoing MIDI stream */
struct midi_buffer midibuf_out;
};
......
......@@ -19,7 +19,6 @@
#include <sound/pcm.h>
#include "driver.h"
#include "usbdefs.h"
/* number of URBs */
#define LINE6_ISO_BUFFERS 2
......@@ -66,8 +65,8 @@
the running flag indicates whether the stream is running.
For monitor or impulse operations, the driver needs to call
snd_line6_duplex_acquire() or snd_line6_duplex_release() with the
appropriate LINE6_STREAM_* flag.
line6_pcm_acquire() or line6_pcm_release() with the appropriate
LINE6_STREAM_* flag.
*/
/* stream types */
......@@ -84,8 +83,8 @@ enum {
};
struct line6_pcm_properties {
struct snd_pcm_hardware snd_line6_playback_hw, snd_line6_capture_hw;
struct snd_pcm_hw_constraint_ratdens snd_line6_rates;
struct snd_pcm_hardware playback_hw, capture_hw;
struct snd_pcm_hw_constraint_ratdens rates;
int bytes_per_frame;
};
......@@ -139,19 +138,13 @@ struct line6_pcm_stream {
};
struct snd_line6_pcm {
/**
Pointer back to the Line 6 driver data structure.
*/
/* Pointer back to the Line 6 driver data structure */
struct usb_line6 *line6;
/**
Properties.
*/
/* Properties. */
struct line6_pcm_properties *properties;
/**
ALSA pcm stream
*/
/* ALSA pcm stream */
struct snd_pcm *pcm;
/* protection to state changes of in/out streams */
......@@ -161,49 +154,31 @@ struct snd_line6_pcm {
struct line6_pcm_stream in;
struct line6_pcm_stream out;
/**
Previously captured frame (for software monitoring).
*/
/* Previously captured frame (for software monitoring) */
unsigned char *prev_fbuf;
/**
Size of previously captured frame (for software monitoring).
*/
/* Size of previously captured frame (for software monitoring) */
int prev_fsize;
/**
Maximum size of USB packet.
*/
/* Maximum size of USB packet */
int max_packet_size;
/**
PCM playback volume (left and right).
*/
/* PCM playback volume (left and right) */
int volume_playback[2];
/**
PCM monitor volume.
*/
/* PCM monitor volume */
int volume_monitor;
/**
Volume of impulse response test signal (if zero, test is disabled).
*/
/* Volume of impulse response test signal (if zero, test is disabled) */
int impulse_volume;
/**
Period of impulse response test signal.
*/
/* Period of impulse response test signal */
int impulse_period;
/**
Counter for impulse response test signal.
*/
/* Counter for impulse response test signal */
int impulse_count;
/**
Several status bits (see LINE6_FLAG_*).
*/
/* Several status bits (see LINE6_FLAG_*) */
unsigned long flags;
};
......
......@@ -31,14 +31,16 @@ static void change_volume(struct urb *urb_out, int volume[],
return; /* maximum volume - no change */
if (bytes_per_frame == 4) {
short *p, *buf_end;
__le16 *p, *buf_end;
p = (short *)urb_out->transfer_buffer;
p = (__le16 *)urb_out->transfer_buffer;
buf_end = p + urb_out->transfer_buffer_length / sizeof(*p);
for (; p < buf_end; ++p) {
int val = (*p * volume[chn & 1]) >> 8;
*p = clamp(val, 0x7fff, -0x8000);
short pv = le16_to_cpu(*p);
int val = (pv * volume[chn & 1]) >> 8;
pv = clamp(val, 0x7fff, -0x8000);
*p = cpu_to_le16(pv);
++chn;
}
} else if (bytes_per_frame == 6) {
......@@ -114,15 +116,18 @@ static void add_monitor_signal(struct urb *urb_out, unsigned char *signal,
return; /* zero volume - no change */
if (bytes_per_frame == 4) {
short *pi, *po, *buf_end;
__le16 *pi, *po, *buf_end;
pi = (short *)signal;
po = (short *)urb_out->transfer_buffer;
pi = (__le16 *)signal;
po = (__le16 *)urb_out->transfer_buffer;
buf_end = po + urb_out->transfer_buffer_length / sizeof(*po);
for (; po < buf_end; ++pi, ++po) {
int val = *po + ((*pi * volume) >> 8);
*po = clamp(val, 0x7fff, -0x8000);
short pov = le16_to_cpu(*po);
short piv = le16_to_cpu(*pi);
int val = pov + ((piv * volume) >> 8);
pov = clamp(val, 0x7fff, -0x8000);
*po = cpu_to_le16(pov);
}
}
......@@ -143,10 +148,10 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)
int ret;
const int bytes_per_frame = line6pcm->properties->bytes_per_frame;
const int frame_increment =
line6pcm->properties->snd_line6_rates.rats[0].num_min;
line6pcm->properties->rates.rats[0].num_min;
const int frame_factor =
line6pcm->properties->snd_line6_rates.rats[0].den *
(USB_INTERVALS_PER_SECOND / LINE6_ISO_INTERVAL);
line6pcm->properties->rates.rats[0].den *
(USB_INTERVALS_PER_SECOND / LINE6_ISO_INTERVAL);
struct urb *urb_out;
index =
......@@ -365,12 +370,11 @@ static int snd_line6_playback_open(struct snd_pcm_substream *substream)
struct snd_line6_pcm *line6pcm = snd_pcm_substream_chip(substream);
err = snd_pcm_hw_constraint_ratdens(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
(&line6pcm->
properties->snd_line6_rates));
&line6pcm->properties->rates);
if (err < 0)
return err;
runtime->hw = line6pcm->properties->snd_line6_playback_hw;
runtime->hw = line6pcm->properties->playback_hw;
return 0;
}
......
......@@ -21,7 +21,6 @@
#include "capture.h"
#include "driver.h"
#include "playback.h"
#include "usbdefs.h"
/*
Locate name in binary program dump
......@@ -58,44 +57,28 @@ enum {
};
struct usb_line6_pod {
/**
Generic Line 6 USB data.
*/
/* Generic Line 6 USB data */
struct usb_line6 line6;
/**
Instrument monitor level.
*/
/* Instrument monitor level */
int monitor_level;
/**
Timer for device initializaton.
*/
/* Timer for device initialization */
struct timer_list startup_timer;
/**
Work handler for device initializaton.
*/
/* Work handler for device initialization */
struct work_struct startup_work;
/**
Current progress in startup procedure.
*/
/* Current progress in startup procedure */
int startup_progress;
/**
Serial number of device.
*/
/* Serial number of device */
int serial_number;
/**
Firmware version (x 100).
*/
/* Firmware version (x 100) */
int firmware_version;
/**
Device ID.
*/
/* Device ID */
int device_id;
};
......@@ -146,7 +129,7 @@ static struct snd_ratden pod_ratden = {
};
static struct line6_pcm_properties pod_pcm_properties = {
.snd_line6_playback_hw = {
.playback_hw = {
.info = (SNDRV_PCM_INFO_MMAP |
SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_BLOCK_TRANSFER |
......@@ -164,7 +147,7 @@ static struct line6_pcm_properties pod_pcm_properties = {
.period_bytes_max = 8192,
.periods_min = 1,
.periods_max = 1024},
.snd_line6_capture_hw = {
.capture_hw = {
.info = (SNDRV_PCM_INFO_MMAP |
SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_BLOCK_TRANSFER |
......@@ -181,7 +164,7 @@ static struct line6_pcm_properties pod_pcm_properties = {
.period_bytes_max = 8192,
.periods_min = 1,
.periods_max = 1024},
.snd_line6_rates = {
.rates = {
.nrats = 1,
.rats = &pod_ratden},
.bytes_per_frame = POD_BYTES_PER_FRAME
......
......@@ -17,7 +17,6 @@
#include "driver.h"
#include "pcm.h"
#include "usbdefs.h"
enum {
LINE6_PODHD300,
......@@ -26,13 +25,6 @@ enum {
LINE6_PODHD500_1,
};
struct usb_line6_podhd {
/**
Generic Line 6 USB data.
*/
struct usb_line6 line6;
};
#define PODHD_BYTES_PER_FRAME 6 /* 24bit audio (stereo) */
static struct snd_ratden podhd_ratden = {
......@@ -43,7 +35,7 @@ static struct snd_ratden podhd_ratden = {
};
static struct line6_pcm_properties podhd_pcm_properties = {
.snd_line6_playback_hw = {
.playback_hw = {
.info = (SNDRV_PCM_INFO_MMAP |
SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_BLOCK_TRANSFER |
......@@ -61,7 +53,7 @@ static struct line6_pcm_properties podhd_pcm_properties = {
.period_bytes_max = 8192,
.periods_min = 1,
.periods_max = 1024},
.snd_line6_capture_hw = {
.capture_hw = {
.info = (SNDRV_PCM_INFO_MMAP |
SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_BLOCK_TRANSFER |
......@@ -78,7 +70,7 @@ static struct line6_pcm_properties podhd_pcm_properties = {
.period_bytes_max = 8192,
.periods_min = 1,
.periods_max = 1024},
.snd_line6_rates = {
.rates = {
.nrats = 1,
.rats = &podhd_ratden},
.bytes_per_frame = PODHD_BYTES_PER_FRAME
......@@ -179,7 +171,7 @@ static int podhd_probe(struct usb_interface *interface,
{
return line6_probe(interface, id,
&podhd_properties_table[id->driver_info],
podhd_init, sizeof(struct usb_line6_podhd));
podhd_init, sizeof(struct usb_line6));
}
static struct usb_driver podhd_driver = {
......
#ifndef DRIVER_REVISION
/* current subversion revision */
#define DRIVER_REVISION " (904)"
#endif
......@@ -21,7 +21,6 @@
#include "capture.h"
#include "driver.h"
#include "playback.h"
#include "usbdefs.h"
enum line6_device_type {
LINE6_GUITARPORT,
......@@ -43,34 +42,22 @@ struct toneport_led {
};
struct usb_line6_toneport {
/**
Generic Line 6 USB data.
*/
/* Generic Line 6 USB data */
struct usb_line6 line6;
/**
Source selector.
*/
/* Source selector */
int source;
/**
Serial number of device.
*/
/* Serial number of device */
int serial_number;
/**
Firmware version (x 100).
*/
/* Firmware version (x 100) */
int firmware_version;
/**
Timer for delayed PCM startup.
*/
/* Timer for delayed PCM startup */
struct timer_list timer;
/**
Device type.
*/
/* Device type */
enum line6_device_type type;
/* LED instances */
......@@ -89,7 +76,7 @@ static struct snd_ratden toneport_ratden = {
};
static struct line6_pcm_properties toneport_pcm_properties = {
.snd_line6_playback_hw = {
.playback_hw = {
.info = (SNDRV_PCM_INFO_MMAP |
SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_BLOCK_TRANSFER |
......@@ -107,7 +94,7 @@ static struct line6_pcm_properties toneport_pcm_properties = {
.period_bytes_max = 8192,
.periods_min = 1,
.periods_max = 1024},
.snd_line6_capture_hw = {
.capture_hw = {
.info = (SNDRV_PCM_INFO_MMAP |
SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_BLOCK_TRANSFER |
......@@ -124,7 +111,7 @@ static struct line6_pcm_properties toneport_pcm_properties = {
.period_bytes_max = 8192,
.periods_min = 1,
.periods_max = 1024},
.snd_line6_rates = {
.rates = {
.nrats = 1,
.rats = &toneport_ratden},
.bytes_per_frame = 4
......
/*
* Line 6 Linux USB driver
*
* Copyright (C) 2005-2008 Markus Grabner (grabner@icg.tugraz.at)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation, version 2.
*
*/
#ifndef USBDEFS_H
#define USBDEFS_H
#define USB_INTERVALS_PER_SECOND 1000
/* device supports settings parameter via USB */
#define LINE6_CAP_CONTROL (1 << 0)
/* device supports PCM input/output via USB */
#define LINE6_CAP_PCM (1 << 1)
/* device support hardware monitoring */
#define LINE6_CAP_HWMON (1 << 2)
#define LINE6_FALLBACK_INTERVAL 10
#define LINE6_FALLBACK_MAXPACKETSIZE 16
#endif
......@@ -17,7 +17,6 @@
#include <sound/core.h>
#include "driver.h"
#include "usbdefs.h"
#define VARIAX_STARTUP_DELAY1 1000
#define VARIAX_STARTUP_DELAY3 100
......@@ -42,30 +41,20 @@ enum {
};
struct usb_line6_variax {
/**
Generic Line 6 USB data.
*/
/* Generic Line 6 USB data */
struct usb_line6 line6;
/**
Buffer for activation code.
*/
/* Buffer for activation code */
unsigned char *buffer_activate;
/**
Handler for device initializaton.
*/
/* Handler for device initialization */
struct work_struct startup_work;
/**
Timers for device initializaton.
*/
/* Timers for device initialization */
struct timer_list startup_timer1;
struct timer_list startup_timer2;
/**
Current progress in startup procedure.
*/
/* Current progress in startup procedure */
int startup_progress;
};
......@@ -270,9 +259,7 @@ static const struct line6_properties variax_properties_table[] = {
[LINE6_PODXTLIVE_VARIAX] = {
.id = "PODxtLive",
.name = "PODxt Live",
.capabilities = LINE6_CAP_CONTROL
| LINE6_CAP_PCM
| LINE6_CAP_HWMON,
.capabilities = LINE6_CAP_CONTROL,
.altsetting = 1,
.ep_ctrl_r = 0x86,
.ep_ctrl_w = 0x05,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment