]> git.neil.brown.name Git - history.git/commitdiff
ALSA CVS update - Clemens Ladisch <clemens@ladisch.de>
authorJaroslav Kysela <perex@suse.cz>
Thu, 18 Mar 2004 12:18:25 +0000 (13:18 +0100)
committerJaroslav Kysela <perex@suse.cz>
Thu, 18 Mar 2004 12:18:25 +0000 (13:18 +0100)
USB generic driver
replace usage of interface index with calls to usb_ifnum_to_if

sound/usb/usbaudio.c
sound/usb/usbaudio.h
sound/usb/usbmixer.c

index 4a582b885097ff5ef7845069101821f841645d11..6b33beedf355e6687681f0fe23f6f7a4717aa35e 100644 (file)
@@ -1082,7 +1082,8 @@ static int set_format(snd_usb_substream_t *subs, struct audioformat *fmt)
        int is_playback = subs->direction == SNDRV_PCM_STREAM_PLAYBACK;
        int err;
 
-       iface = get_iface(config, fmt->iface);
+       iface = usb_ifnum_to_if(dev, fmt->iface);
+       snd_assert(iface, return -EINVAL);
        alts = &iface->altsetting[fmt->altset_idx];
        altsd = get_iface_desc(alts);
        snd_assert(altsd->bAlternateSetting == fmt->altsetting, return -EINVAL);
@@ -1213,10 +1214,9 @@ static int snd_usb_hw_params(snd_pcm_substream_t *substream,
                return ret;
 
        if (subs->cur_rate != rate) {
-               struct usb_host_config *config = subs->dev->actconfig;
                struct usb_host_interface *alts;
                struct usb_interface *iface;
-               iface = get_iface(config, fmt->iface);
+               iface = usb_ifnum_to_if(subs->dev, fmt->iface);
                alts = &iface->altsetting[fmt->altset_idx];
                ret = init_usb_sample_rate(subs->dev, subs->interface, alts, fmt, rate);
                if (ret < 0)
@@ -2269,7 +2269,6 @@ static int parse_audio_format(struct usb_device *dev, struct audioformat *fp,
 static int parse_audio_endpoints(snd_usb_audio_t *chip, int iface_no)
 {
        struct usb_device *dev;
-       struct usb_host_config *config;
        struct usb_interface *iface;
        struct usb_host_interface *alts;
        struct usb_interface_descriptor *altsd;
@@ -2279,10 +2278,9 @@ static int parse_audio_endpoints(snd_usb_audio_t *chip, int iface_no)
        unsigned char *fmt, *csep;
 
        dev = chip->dev;
-       config = dev->actconfig;
 
        /* parse the interface's altsettings */
-       iface = get_iface(config, iface_no);
+       iface = usb_ifnum_to_if(dev, iface_no);
        for (i = 0; i < iface->num_altsetting; i++) {
                alts = &iface->altsetting[i];
                altsd = get_iface_desc(alts);
@@ -2448,15 +2446,13 @@ static void snd_usb_stream_disconnect(struct list_head *head, struct usb_driver
 static int snd_usb_create_streams(snd_usb_audio_t *chip, int ctrlif)
 {
        struct usb_device *dev = chip->dev;
-       struct usb_host_config *config;
        struct usb_host_interface *host_iface;
        struct usb_interface *iface;
        unsigned char *p1;
        int i, j;
 
        /* find audiocontrol interface */
-       config = dev->actconfig;
-       host_iface = &get_iface(config, ctrlif)->altsetting[0];
+       host_iface = &usb_ifnum_to_if(dev, ctrlif)->altsetting[0];
        if (!(p1 = snd_usb_find_csint_desc(host_iface->extra, host_iface->extralen, NULL, HEADER))) {
                snd_printk(KERN_ERR "cannot find HEADER\n");
                return -EINVAL;
@@ -2473,12 +2469,12 @@ static int snd_usb_create_streams(snd_usb_audio_t *chip, int ctrlif)
                struct usb_host_interface *alts;
                struct usb_interface_descriptor *altsd;
                j = p1[8 + i];
-               if (j >= get_cfg_desc(config)->bNumInterfaces) {
+               iface = usb_ifnum_to_if(dev, j);
+               if (!iface) {
                        snd_printk(KERN_ERR "%d:%u:%d : does not exist\n",
                                   dev->devnum, ctrlif, j);
                        continue;
                }
-               iface = get_iface(config, j);
                if (usb_interface_claimed(iface)) {
                        snd_printdd(KERN_INFO "%d:%d:%d: skipping, already claimed\n", dev->devnum, ctrlif, j);
                        continue;
@@ -2535,6 +2531,11 @@ static int create_fixed_stream_quirk(snd_usb_audio_t *chip,
                kfree(fp);
                return err;
        }
+       if (fp->iface != get_iface_desc(&iface->altsetting[0])->bInterfaceNumber ||
+           fp->altset_idx >= iface->num_altsetting) {
+               kfree(fp);
+               return -EINVAL;
+       }
        alts = &iface->altsetting[fp->altset_idx];
        usb_set_interface(chip->dev, fp->iface, 0);
        init_usb_pitch(chip->dev, fp->iface, alts, fp);
index d26075663cc45bd29f43081701b752b9ece184c4..96e404811555fccec8d1eb0a5993be9dab323a72 100644 (file)
@@ -207,7 +207,6 @@ void snd_usbmidi_disconnect(struct list_head *p, struct usb_driver *driver);
  * (conditional for compatibility with the older API)
  */
 #ifndef get_iface_desc
-#define get_iface(cfg, num)    ((cfg)->interface[(num)])
 #define get_iface_desc(iface)  (&(iface)->desc)
 #define get_endpoint(alt,ep)   (&(alt)->endpoint[ep].desc)
 #define get_ep_desc(ep)                (&(ep)->desc)
index ee30c9f4bb6ab08ec657087b7b1022331a8c8655..afbf51f9f7c4da49fda229a8f28178662032a1fa 100644 (file)
@@ -1481,7 +1481,7 @@ int snd_usb_create_mixer(snd_usb_audio_t *chip, int ctrlif)
        int err;
        const struct usbmix_ctl_map *map;
        struct usb_device_descriptor *dev = &chip->dev->descriptor;
-       struct usb_host_interface *hostif = &get_iface(chip->dev->actconfig, ctrlif)->altsetting[0];
+       struct usb_host_interface *hostif = &usb_ifnum_to_if(chip->dev, ctrlif)->altsetting[0];
 
        strcpy(chip->card->mixername, "USB Mixer");