Merge branch 'fix/misc' into topic/misc
This commit is contained in:
@@ -785,7 +785,7 @@ int snd_usb_caiaq_audio_init(struct snd_usb_caiaqdev *dev)
|
||||
}
|
||||
|
||||
dev->pcm->private_data = dev;
|
||||
strcpy(dev->pcm->name, dev->product_name);
|
||||
strlcpy(dev->pcm->name, dev->product_name, sizeof(dev->pcm->name));
|
||||
|
||||
memset(dev->sub_playback, 0, sizeof(dev->sub_playback));
|
||||
memset(dev->sub_capture, 0, sizeof(dev->sub_capture));
|
||||
|
@@ -136,7 +136,7 @@ int snd_usb_caiaq_midi_init(struct snd_usb_caiaqdev *device)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
strcpy(rmidi->name, device->product_name);
|
||||
strlcpy(rmidi->name, device->product_name, sizeof(rmidi->name));
|
||||
|
||||
rmidi->info_flags = SNDRV_RAWMIDI_INFO_DUPLEX;
|
||||
rmidi->private_data = device;
|
||||
|
@@ -323,6 +323,7 @@ static int snd_usb_audio_create(struct usb_device *dev, int idx,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
mutex_init(&chip->shutdown_mutex);
|
||||
chip->index = idx;
|
||||
chip->dev = dev;
|
||||
chip->card = card;
|
||||
@@ -531,6 +532,7 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, void *ptr)
|
||||
chip = ptr;
|
||||
card = chip->card;
|
||||
mutex_lock(®ister_mutex);
|
||||
mutex_lock(&chip->shutdown_mutex);
|
||||
chip->shutdown = 1;
|
||||
chip->num_interfaces--;
|
||||
if (chip->num_interfaces <= 0) {
|
||||
@@ -548,9 +550,11 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, void *ptr)
|
||||
snd_usb_mixer_disconnect(p);
|
||||
}
|
||||
usb_chip[chip->index] = NULL;
|
||||
mutex_unlock(&chip->shutdown_mutex);
|
||||
mutex_unlock(®ister_mutex);
|
||||
snd_card_free_when_closed(card);
|
||||
} else {
|
||||
mutex_unlock(&chip->shutdown_mutex);
|
||||
mutex_unlock(®ister_mutex);
|
||||
}
|
||||
}
|
||||
|
@@ -95,7 +95,7 @@ enum {
|
||||
};
|
||||
|
||||
|
||||
/*E-mu 0202(0404) eXtension Unit(XU) control*/
|
||||
/*E-mu 0202/0404/0204 eXtension Unit(XU) control*/
|
||||
enum {
|
||||
USB_XU_CLOCK_RATE = 0xe301,
|
||||
USB_XU_CLOCK_SOURCE = 0xe302,
|
||||
@@ -1583,7 +1583,7 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, void *raw
|
||||
cval->initialized = 1;
|
||||
} else {
|
||||
if (type == USB_XU_CLOCK_RATE) {
|
||||
/* E-Mu USB 0404/0202/TrackerPre
|
||||
/* E-Mu USB 0404/0202/TrackerPre/0204
|
||||
* samplerate control quirk
|
||||
*/
|
||||
cval->min = 0;
|
||||
|
@@ -361,6 +361,7 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream,
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
mutex_lock(&subs->stream->chip->shutdown_mutex);
|
||||
/* format changed */
|
||||
snd_usb_release_substream_urbs(subs, 0);
|
||||
/* influenced: period_bytes, channels, rate, format, */
|
||||
@@ -368,6 +369,7 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream,
|
||||
params_rate(hw_params),
|
||||
snd_pcm_format_physical_width(params_format(hw_params)) *
|
||||
params_channels(hw_params));
|
||||
mutex_unlock(&subs->stream->chip->shutdown_mutex);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -385,8 +387,9 @@ static int snd_usb_hw_free(struct snd_pcm_substream *substream)
|
||||
subs->cur_audiofmt = NULL;
|
||||
subs->cur_rate = 0;
|
||||
subs->period_bytes = 0;
|
||||
if (!subs->stream->chip->shutdown)
|
||||
snd_usb_release_substream_urbs(subs, 0);
|
||||
mutex_lock(&subs->stream->chip->shutdown_mutex);
|
||||
snd_usb_release_substream_urbs(subs, 0);
|
||||
mutex_unlock(&subs->stream->chip->shutdown_mutex);
|
||||
return snd_pcm_lib_free_vmalloc_buffer(substream);
|
||||
}
|
||||
|
||||
|
@@ -79,6 +79,13 @@
|
||||
.idProduct = 0x3f0a,
|
||||
.bInterfaceClass = USB_CLASS_AUDIO,
|
||||
},
|
||||
{
|
||||
/* E-Mu 0204 USB */
|
||||
.match_flags = USB_DEVICE_ID_MATCH_DEVICE,
|
||||
.idVendor = 0x041e,
|
||||
.idProduct = 0x3f19,
|
||||
.bInterfaceClass = USB_CLASS_AUDIO,
|
||||
},
|
||||
|
||||
/*
|
||||
* Logitech QuickCam: bDeviceClass is vendor-specific, so generic interface
|
||||
|
@@ -566,7 +566,7 @@ int snd_usb_is_big_endian_format(struct snd_usb_audio *chip, struct audioformat
|
||||
}
|
||||
|
||||
/*
|
||||
* For E-Mu 0404USB/0202USB/TrackerPre sample rate should be set for device,
|
||||
* For E-Mu 0404USB/0202USB/TrackerPre/0204 sample rate should be set for device,
|
||||
* not for interface.
|
||||
*/
|
||||
|
||||
@@ -623,6 +623,7 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs,
|
||||
case USB_ID(0x041e, 0x3f02): /* E-Mu 0202 USB */
|
||||
case USB_ID(0x041e, 0x3f04): /* E-Mu 0404 USB */
|
||||
case USB_ID(0x041e, 0x3f0a): /* E-Mu Tracker Pre */
|
||||
case USB_ID(0x041e, 0x3f19): /* E-Mu 0204 USB */
|
||||
set_format_emu_quirk(subs, fmt);
|
||||
break;
|
||||
}
|
||||
|
@@ -36,6 +36,7 @@ struct snd_usb_audio {
|
||||
struct snd_card *card;
|
||||
u32 usb_id;
|
||||
int shutdown;
|
||||
struct mutex shutdown_mutex;
|
||||
unsigned int txfr_quirk:1; /* Subframe boundaries on transfers */
|
||||
int num_interfaces;
|
||||
int num_suspended_intf;
|
||||
|
Reference in New Issue
Block a user