[alsa-devel] usb-audio code refactoring, more v2 support [resend]
This is a rebased version of the usb-audio cleanup patch set. On top of what's already been posted, there is one more fix to support sample rate configuration, and one bugfix.
Commit 864c11080 was also ported over. And Clemens' latest patches are also included.
With these patches applied, I can stream audio on a class v2 device. At least for awhile, then I get CRC errors in DATA0 packets. But that's a different issue.
What's not yet done is all the feature unit parsing, mixers etc.
Daniel
[PATCH 1/8] ALSA: usb-audio: move ua101 driver [PATCH 2/8] ALSA: usb-audio: header file cleanups [PATCH 3/8] ALSA: usb-audio: refactor code [PATCH 4/8] ALSA: usb-audio: rename substream format field to altset_idx [PATCH 5/8] ALSA: usb-audio: use a format bitmask per alternate setting [PATCH 6/8] ALSA: usb-audio: support multiple formats with audio class v2 devices [PATCH 7/8] ALSA: usb-audio: add support for samplerate setting on v2 devices [PATCH 8/8] usb/audio.h: Fix field order
As part of the USB audio code cleanup, move the non-standard ua101 driver out of the way.
Signed-off-by: Daniel Mack daniel@caiaq.de Cc: Clemens Ladisch clemens@ladisch.de Cc: Takashi Iwai tiwai@suse.de --- sound/usb/Makefile | 5 ++--- sound/usb/misc/Makefile | 2 ++ sound/usb/{ => misc}/ua101.c | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 sound/usb/misc/Makefile rename sound/usb/{ => misc}/ua101.c (99%)
diff --git a/sound/usb/Makefile b/sound/usb/Makefile index 5bf64ae..b0e5597 100644 --- a/sound/usb/Makefile +++ b/sound/usb/Makefile @@ -4,12 +4,11 @@
snd-usb-audio-objs := usbaudio.o usbmixer.o snd-usb-lib-objs := usbmidi.o -snd-ua101-objs := ua101.o
# Toplevel Module Dependency obj-$(CONFIG_SND_USB_AUDIO) += snd-usb-audio.o snd-usb-lib.o -obj-$(CONFIG_SND_USB_UA101) += snd-ua101.o snd-usb-lib.o +obj-$(CONFIG_SND_USB_UA101) += snd-usb-lib.o obj-$(CONFIG_SND_USB_USX2Y) += snd-usb-lib.o obj-$(CONFIG_SND_USB_US122L) += snd-usb-lib.o
-obj-$(CONFIG_SND) += usx2y/ caiaq/ +obj-$(CONFIG_SND) += misc/ usx2y/ caiaq/ diff --git a/sound/usb/misc/Makefile b/sound/usb/misc/Makefile new file mode 100644 index 0000000..ccefd81 --- /dev/null +++ b/sound/usb/misc/Makefile @@ -0,0 +1,2 @@ +snd-ua101-objs := ua101.o +obj-$(CONFIG_SND_USB_UA101) += snd-ua101.o diff --git a/sound/usb/ua101.c b/sound/usb/misc/ua101.c similarity index 99% rename from sound/usb/ua101.c rename to sound/usb/misc/ua101.c index 3d458d3..e9b0ae5 100644 --- a/sound/usb/ua101.c +++ b/sound/usb/misc/ua101.c @@ -23,7 +23,7 @@ #include <sound/initval.h> #include <sound/pcm.h> #include <sound/pcm_params.h> -#include "usbaudio.h" +#include "../usbaudio.h"
MODULE_DESCRIPTION("Edirol UA-101/1000 driver"); MODULE_AUTHOR("Clemens Ladisch clemens@ladisch.de");
Rename snd-usb-lib to snd-usbmidi-lib as MIDI functions are the only thing it actually contains. Introduce a new header file to only declare these functions.
Introduced usbmixer.h for all functions exported by usbmixer.c.
Signed-off-by: Daniel Mack daniel@caiaq.de Cc: Clemens Ladisch clemens@ladisch.de Cc: Takashi Iwai tiwai@suse.de --- sound/usb/Makefile | 11 +++++---- sound/usb/misc/ua101.c | 1 + sound/usb/usbaudio.c | 3 +- sound/usb/usbaudio.h | 51 -------------------------------------------- sound/usb/usbmidi.c | 1 + sound/usb/usbmidi.h | 48 +++++++++++++++++++++++++++++++++++++++++ sound/usb/usbmixer.c | 1 + sound/usb/usbmixer.h | 11 +++++++++ sound/usb/usx2y/us122l.c | 1 + sound/usb/usx2y/usbusx2y.h | 1 + 10 files changed, 72 insertions(+), 57 deletions(-) create mode 100644 sound/usb/usbmidi.h create mode 100644 sound/usb/usbmixer.h
diff --git a/sound/usb/Makefile b/sound/usb/Makefile index b0e5597..423d829 100644 --- a/sound/usb/Makefile +++ b/sound/usb/Makefile @@ -3,12 +3,13 @@ #
snd-usb-audio-objs := usbaudio.o usbmixer.o -snd-usb-lib-objs := usbmidi.o +snd-usbmidi-lib-objs := usbmidi.o
# Toplevel Module Dependency -obj-$(CONFIG_SND_USB_AUDIO) += snd-usb-audio.o snd-usb-lib.o -obj-$(CONFIG_SND_USB_UA101) += snd-usb-lib.o -obj-$(CONFIG_SND_USB_USX2Y) += snd-usb-lib.o -obj-$(CONFIG_SND_USB_US122L) += snd-usb-lib.o +obj-$(CONFIG_SND_USB_AUDIO) += snd-usb-audio.o snd-usbmidi-lib.o + +obj-$(CONFIG_SND_USB_UA101) += snd-usbmidi-lib.o +obj-$(CONFIG_SND_USB_USX2Y) += snd-usbmidi-lib.o +obj-$(CONFIG_SND_USB_US122L) += snd-usbmidi-lib.o
obj-$(CONFIG_SND) += misc/ usx2y/ caiaq/ diff --git a/sound/usb/misc/ua101.c b/sound/usb/misc/ua101.c index e9b0ae5..b4a4cb4 100644 --- a/sound/usb/misc/ua101.c +++ b/sound/usb/misc/ua101.c @@ -24,6 +24,7 @@ #include <sound/pcm.h> #include <sound/pcm_params.h> #include "../usbaudio.h" +#include "../usbmidi.h"
MODULE_DESCRIPTION("Edirol UA-101/1000 driver"); MODULE_AUTHOR("Clemens Ladisch clemens@ladisch.de"); diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index 11b0826..5b91aa0 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c @@ -56,7 +56,8 @@ #include <sound/initval.h>
#include "usbaudio.h" - +#include "usbmidi.h" +#include "usbmixer.h"
MODULE_AUTHOR("Takashi Iwai tiwai@suse.de"); MODULE_DESCRIPTION("USB Audio"); diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index 42c299c..49a691a 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h @@ -21,9 +21,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-/* maximum number of endpoints per interface */ -#define MIDI_MAX_ENDPOINTS 2 - /* handling of USB vendor/product ID pairs as 32-bit numbers */ #define USB_ID(vendor, product) (((vendor) << 16) | (product)) #define USB_ID_VENDOR(id) ((id) >> 16) @@ -89,39 +86,6 @@ struct snd_usb_audio_quirk { const void *data; };
-/* data for QUIRK_MIDI_FIXED_ENDPOINT */ -struct snd_usb_midi_endpoint_info { - int8_t out_ep; /* ep number, 0 autodetect */ - uint8_t out_interval; /* interval for interrupt endpoints */ - int8_t in_ep; - uint8_t in_interval; - uint16_t out_cables; /* bitmask */ - uint16_t in_cables; /* bitmask */ -}; - -/* for QUIRK_MIDI_YAMAHA, data is NULL */ - -/* for QUIRK_MIDI_MIDIMAN, data points to a snd_usb_midi_endpoint_info - * structure (out_cables and in_cables only) */ - -/* for QUIRK_COMPOSITE, data points to an array of snd_usb_audio_quirk - * structures, terminated with .ifnum = -1 */ - -/* for QUIRK_AUDIO_FIXED_ENDPOINT, data points to an audioformat structure */ - -/* for QUIRK_AUDIO/MIDI_STANDARD_INTERFACE, data is NULL */ - -/* for QUIRK_AUDIO_EDIROL_UAXX, data is NULL */ - -/* for QUIRK_IGNORE_INTERFACE, data is NULL */ - -/* for QUIRK_MIDI_NOVATION and _RAW, data is NULL */ - -/* for QUIRK_MIDI_EMAGIC, data points to a snd_usb_midi_endpoint_info - * structure (out_cables and in_cables only) */ - -/* for QUIRK_MIDI_CME, data is NULL */ - /* */
@@ -148,21 +112,6 @@ int snd_usb_ctl_msg(struct usb_device *dev, unsigned int pipe, __u8 request, __u8 requesttype, __u16 value, __u16 index, void *data, __u16 size, int timeout);
-int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif, - int ignore_error); -void snd_usb_mixer_disconnect(struct list_head *p); - -int snd_usbmidi_create(struct snd_card *card, - struct usb_interface *iface, - struct list_head *midi_list, - const struct snd_usb_audio_quirk *quirk); -void snd_usbmidi_input_stop(struct list_head* p); -void snd_usbmidi_input_start(struct list_head* p); -void snd_usbmidi_disconnect(struct list_head *p); - -void snd_emuusb_set_samplerate(struct snd_usb_audio *chip, - unsigned char samplerate_id); - /* * retrieve usb_interface descriptor from the host interface * (conditional for compatibility with the older API) diff --git a/sound/usb/usbmidi.c b/sound/usb/usbmidi.c index 2c59afd..5915a04 100644 --- a/sound/usb/usbmidi.c +++ b/sound/usb/usbmidi.c @@ -53,6 +53,7 @@ #include <sound/rawmidi.h> #include <sound/asequencer.h> #include "usbaudio.h" +#include "usbmidi.h"
/* diff --git a/sound/usb/usbmidi.h b/sound/usb/usbmidi.h new file mode 100644 index 0000000..2089ec9 --- /dev/null +++ b/sound/usb/usbmidi.h @@ -0,0 +1,48 @@ +#ifndef __USBMIDI_H +#define __USBMIDI_H + +/* maximum number of endpoints per interface */ +#define MIDI_MAX_ENDPOINTS 2 + +/* data for QUIRK_MIDI_FIXED_ENDPOINT */ +struct snd_usb_midi_endpoint_info { + int8_t out_ep; /* ep number, 0 autodetect */ + uint8_t out_interval; /* interval for interrupt endpoints */ + int8_t in_ep; + uint8_t in_interval; + uint16_t out_cables; /* bitmask */ + uint16_t in_cables; /* bitmask */ +}; + +/* for QUIRK_MIDI_YAMAHA, data is NULL */ + +/* for QUIRK_MIDI_MIDIMAN, data points to a snd_usb_midi_endpoint_info + * structure (out_cables and in_cables only) */ + +/* for QUIRK_COMPOSITE, data points to an array of snd_usb_audio_quirk + * structures, terminated with .ifnum = -1 */ + +/* for QUIRK_AUDIO_FIXED_ENDPOINT, data points to an audioformat structure */ + +/* for QUIRK_AUDIO/MIDI_STANDARD_INTERFACE, data is NULL */ + +/* for QUIRK_AUDIO_EDIROL_UA700_UA25/UA1000, data is NULL */ + +/* for QUIRK_IGNORE_INTERFACE, data is NULL */ + +/* for QUIRK_MIDI_NOVATION and _RAW, data is NULL */ + +/* for QUIRK_MIDI_EMAGIC, data points to a snd_usb_midi_endpoint_info + * structure (out_cables and in_cables only) */ + +/* for QUIRK_MIDI_CME, data is NULL */ + +int snd_usbmidi_create(struct snd_card *card, + struct usb_interface *iface, + struct list_head *midi_list, + const struct snd_usb_audio_quirk *quirk); +void snd_usbmidi_input_stop(struct list_head* p); +void snd_usbmidi_input_start(struct list_head* p); +void snd_usbmidi_disconnect(struct list_head *p); + +#endif /* __USBMIDI_H */ diff --git a/sound/usb/usbmixer.c b/sound/usb/usbmixer.c index 8e8f871..43d53a3 100644 --- a/sound/usb/usbmixer.c +++ b/sound/usb/usbmixer.c @@ -41,6 +41,7 @@ #include <sound/tlv.h>
#include "usbaudio.h" +#include "usbmixer.h"
/* */ diff --git a/sound/usb/usbmixer.h b/sound/usb/usbmixer.h new file mode 100644 index 0000000..e199e4b --- /dev/null +++ b/sound/usb/usbmixer.h @@ -0,0 +1,11 @@ +#ifndef __USBMIXER_H +#define __USBMIXER_H + +int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif, + int ignore_error); +void snd_usb_mixer_disconnect(struct list_head *p); + +void snd_emuusb_set_samplerate(struct snd_usb_audio *chip, + unsigned char samplerate_id); + +#endif /* __USBMIXER_H */ diff --git a/sound/usb/usx2y/us122l.c b/sound/usb/usx2y/us122l.c index 44deb21..4f6518c 100644 --- a/sound/usb/usx2y/us122l.c +++ b/sound/usb/usx2y/us122l.c @@ -25,6 +25,7 @@ #define MODNAME "US122L" #include "usb_stream.c" #include "../usbaudio.h" +#include "../usbmidi.h" #include "us122l.h"
MODULE_AUTHOR("Karsten Wiese fzu@wemgehoertderstaat.de"); diff --git a/sound/usb/usx2y/usbusx2y.h b/sound/usb/usx2y/usbusx2y.h index 1d174ce..9ab97b4 100644 --- a/sound/usb/usx2y/usbusx2y.h +++ b/sound/usb/usx2y/usbusx2y.h @@ -1,6 +1,7 @@ #ifndef USBUSX2Y_H #define USBUSX2Y_H #include "../usbaudio.h" +#include "../usbmidi.h" #include "usbus428ctldefs.h"
#define NRURBS 2
On Fri, Mar 05, 2010 at 08:41:17AM +0100, Daniel Mack wrote:
This is a rebased version of the usb-audio cleanup patch set. On top of what's already been posted, there is one more fix to support sample rate configuration, and one bugfix.
Commit 864c11080 was also ported over. And Clemens' latest patches are also included.
With these patches applied, I can stream audio on a class v2 device. At least for awhile, then I get CRC errors in DATA0 packets. But that's a different issue.
What's not yet done is all the feature unit parsing, mixers etc.
Daniel
[PATCH 1/8] ALSA: usb-audio: move ua101 driver [PATCH 2/8] ALSA: usb-audio: header file cleanups [PATCH 3/8] ALSA: usb-audio: refactor code [PATCH 4/8] ALSA: usb-audio: rename substream format field to altset_idx [PATCH 5/8] ALSA: usb-audio: use a format bitmask per alternate setting [PATCH 6/8] ALSA: usb-audio: support multiple formats with audio class v2 devices [PATCH 7/8] ALSA: usb-audio: add support for samplerate setting on v2 devices [PATCH 8/8] usb/audio.h: Fix field order
Takashi applied all these now to a new branch. Even though the changes made to the driver should only affect devices compliant to v2 of the USB audio standard, I could have introduced bugs when refactoring the code.
So - if anyone with a common USB audio device could try this branch and report any regressions, that would help a lot, and make the branch merge smoother eventually.
git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git topic/usb
Thanks, Daniel
participants (1)
-
Daniel Mack