[alsa-devel] [PATCH 2/2] snd-usb-audio: Add duplex mode for Digidesign Mbox 1 and enable mixer

Takashi Iwai tiwai at suse.de
Thu Nov 6 15:15:06 CET 2014


At Tue,  4 Nov 2014 11:06:37 +1100,
Damien Zammit wrote:
> 
> This patch provides duplex support for the Digidesign Mbox 1 sound
> card and has been a work in progress for about a year.
> Users have confirmed on my website that previous versions of this patch
> have worked on the hardware and I have been testing extensively.
> 
> It also enables the mixer control for providing clock source
> selector based on the previous patch.
> 
> The sample rate has been hardcoded to 48kHz because it works better with
> the S/PDIF sync mode when the sample rate is locked.  This is the
> highest rate that the device supports and no loss of functionality
> is observed by restricting the sample rate.

Hmm, can we achieve this without introducing the new audioformats
thing, e.g. with COMPOSITE, instead?


thanks,

Takashi

> 
> Signed-off-by: Damien Zammit <damien at zamaudio.com>
> ---
>  sound/usb/card.h         |  5 ++++
>  sound/usb/quirks-table.h | 73 ++++++++++++++++++++++++++++++++----------------
>  sound/usb/quirks.c       | 30 ++++++++++++++++++++
>  sound/usb/usbaudio.h     |  1 +
>  4 files changed, 85 insertions(+), 24 deletions(-)
> 
> diff --git a/sound/usb/card.h b/sound/usb/card.h
> index 97acb90..a8fe22f 100644
> --- a/sound/usb/card.h
> +++ b/sound/usb/card.h
> @@ -33,6 +33,11 @@ struct audioformat {
>  	bool dsd_bitrev;		/* reverse the bits of each DSD sample */
>  };
>  
> +struct audioformats {
> +	unsigned int n_formats;
> +	const struct audioformat *format;
> +};
> +
>  struct snd_usb_substream;
>  struct snd_usb_endpoint;
>  
> diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h
> index c657752..0b5f4fb 100644
> --- a/sound/usb/quirks-table.h
> +++ b/sound/usb/quirks-table.h
> @@ -2937,43 +2937,68 @@ YAMAHA_DEVICE(0x7010, "UB99"),
>  	/* Thanks to Clemens Ladisch <clemens at ladisch.de> */
>  	USB_DEVICE(0x0dba, 0x1000),
>  	.driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
> -		.vendor_name = "Digidesign",
> -		.product_name = "MBox",
> -		.ifnum = QUIRK_ANY_INTERFACE,
> -		.type = QUIRK_COMPOSITE,
> -		.data = (const struct snd_usb_audio_quirk[]){
> -			{
> -				.ifnum = 0,
> -				.type = QUIRK_IGNORE_INTERFACE,
> -			},
> -			{
> -				.ifnum = 1,
> -				.type = QUIRK_AUDIO_FIXED_ENDPOINT,
> -				.data = &(const struct audioformat) {
> +	.vendor_name = "Digidesign",
> +	.product_name = "MBox",
> +	.ifnum = QUIRK_ANY_INTERFACE,
> +	.type = QUIRK_COMPOSITE,
> +	.data = (const struct snd_usb_audio_quirk[]) {
> +		{
> +			.ifnum = 0,
> +			.type = QUIRK_AUDIO_STANDARD_MIXER,
> +		},
> +		{
> +			.ifnum = 1,
> +			.type = QUIRK_AUDIO_FIXED_MULTI_ENDPOINT,
> +			.data = &(const struct audioformats)
> +			{
> +				.n_formats = 2,
> +				.format = (const struct audioformat[]) {
> +					{
>  					.formats = SNDRV_PCM_FMTBIT_S24_3BE,
>  					.channels = 2,
>  					.iface = 1,
>  					.altsetting = 1,
>  					.altset_idx = 1,
> -					.attributes = UAC_EP_CS_ATTR_SAMPLE_RATE,
> +					.attributes = 0x4,
>  					.endpoint = 0x02,
> -					.ep_attr = 0x01,
> -					.rates = SNDRV_PCM_RATE_44100 |
> -						 SNDRV_PCM_RATE_48000,
> -					.rate_min = 44100,
> +					.ep_attr = USB_ENDPOINT_XFER_ISOC |
> +						USB_ENDPOINT_SYNC_SYNC,
> +					.maxpacksize = 0x130,
> +					.rates = SNDRV_PCM_RATE_48000,
> +					.rate_min = 48000,
>  					.rate_max = 48000,
> -					.nr_rates = 2,
> +					.nr_rates = 1,
>  					.rate_table = (unsigned int[]) {
> -						44100, 48000
> +						48000
> +					}
> +					},
> +					{
> +					.formats = SNDRV_PCM_FMTBIT_S24_3BE,
> +					.channels = 2,
> +					.iface = 1,
> +					.altsetting = 1,
> +					.altset_idx = 1,
> +					.attributes = 0x4,
> +					.endpoint = 0x81,
> +					.ep_attr = USB_ENDPOINT_XFER_ISOC |
> +						USB_ENDPOINT_SYNC_ASYNC,
> +					.maxpacksize = 0x130,
> +					.rates = SNDRV_PCM_RATE_48000,
> +					.rate_min = 48000,
> +					.rate_max = 48000,
> +					.nr_rates = 1,
> +					.rate_table = (unsigned int[]) {
> +						48000
> +					}
>  					}
>  				}
> -			},
> -			{
> -				.ifnum = -1
>  			}
> +		},
> +		{
> +			.ifnum = -1
>  		}
> -
>  	}
> +}
>  },
>  
>  /* DIGIDESIGN MBOX 2 */
> diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
> index d2aa45a..90227cd 100644
> --- a/sound/usb/quirks.c
> +++ b/sound/usb/quirks.c
> @@ -180,6 +180,34 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip,
>  	return 0;
>  }
>  
> +/*
> + * create N streams for an interface without proper descriptors but with
> + * multiple endpoints
> + */
> +static int create_fixed_multi_stream_quirk(struct snd_usb_audio *chip,
> +				     struct usb_interface *iface,
> +				     struct usb_driver *driver,
> +				     const struct snd_usb_audio_quirk *quirk)
> +{
> +	struct audioformats *fp;
> +	int i;
> +
> +	fp = kmemdup(quirk->data, sizeof(*fp), GFP_KERNEL);
> +	if (!fp) {
> +		usb_audio_err(chip, "cannot memdup\n");
> +		return -ENOMEM;
> +	}
> +	for (i = 0; i < fp->n_formats; i++) {
> +		struct snd_usb_audio_quirk nquirk = {
> +			.ifnum = quirk->ifnum,
> +			.type = QUIRK_AUDIO_FIXED_MULTI_ENDPOINT,
> +			.data = (const struct audioformat *) &fp->format[i]
> +		};
> +		create_fixed_stream_quirk(chip, iface, driver, &nquirk);
> +	}
> +	return 0;
> +}
> +
>  static int create_auto_pcm_quirk(struct snd_usb_audio *chip,
>  				 struct usb_interface *iface,
>  				 struct usb_driver *driver)
> @@ -528,6 +556,8 @@ int snd_usb_create_quirk(struct snd_usb_audio *chip,
>  		[QUIRK_MIDI_FTDI] = create_any_midi_quirk,
>  		[QUIRK_AUDIO_STANDARD_INTERFACE] = create_standard_audio_quirk,
>  		[QUIRK_AUDIO_FIXED_ENDPOINT] = create_fixed_stream_quirk,
> +		[QUIRK_AUDIO_FIXED_MULTI_ENDPOINT] =
> +			create_fixed_multi_stream_quirk,
>  		[QUIRK_AUDIO_EDIROL_UAXX] = create_uaxx_quirk,
>  		[QUIRK_AUDIO_ALIGN_TRANSFER] = create_align_transfer_quirk,
>  		[QUIRK_AUDIO_STANDARD_MIXER] = create_standard_mixer_quirk,
> diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
> index 91d0380..31d8ff0 100644
> --- a/sound/usb/usbaudio.h
> +++ b/sound/usb/usbaudio.h
> @@ -96,6 +96,7 @@ enum quirk_type {
>  	QUIRK_MIDI_FTDI,
>  	QUIRK_AUDIO_STANDARD_INTERFACE,
>  	QUIRK_AUDIO_FIXED_ENDPOINT,
> +	QUIRK_AUDIO_FIXED_MULTI_ENDPOINT,
>  	QUIRK_AUDIO_EDIROL_UAXX,
>  	QUIRK_AUDIO_ALIGN_TRANSFER,
>  	QUIRK_AUDIO_STANDARD_MIXER,
> -- 
> 1.9.1
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> 


More information about the Alsa-devel mailing list