From patchwork Sun Nov 9 00:37:08 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Damien Zammit X-Patchwork-Id: 5259341 Return-Path: X-Original-To: patchwork-alsa-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 081D59F387 for ; Sun, 9 Nov 2014 00:39:11 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id EFD9F2014A for ; Sun, 9 Nov 2014 00:39:09 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.kernel.org (Postfix) with ESMTP id 8EEB220145 for ; Sun, 9 Nov 2014 00:39:08 +0000 (UTC) Received: by alsa0.perex.cz (Postfix, from userid 1000) id A825826054D; Sun, 9 Nov 2014 01:39:07 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=no version=3.3.1 Received: from alsa0.perex.cz (localhost [IPv6:::1]) by alsa0.perex.cz (Postfix) with ESMTP id 0CAA72604DB; Sun, 9 Nov 2014 01:38:07 +0100 (CET) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id 514372604DE; Sun, 9 Nov 2014 01:38:05 +0100 (CET) Received: from mail-pd0-f174.google.com (mail-pd0-f174.google.com [209.85.192.174]) by alsa0.perex.cz (Postfix) with ESMTP id 5698E2604BF for ; Sun, 9 Nov 2014 01:37:59 +0100 (CET) Received: by mail-pd0-f174.google.com with SMTP id p10so5520817pdj.19 for ; Sat, 08 Nov 2014 16:37:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=SoGtSM12IeUZmkmT9nvs93SuiXPp6vOIQva3nWTrkKk=; b=YyH2VcjhWysqnr3U4ippIykKsD5H0OkreOqPFeRvctm3dj//iSOQEdF9sOU7brL8Fc STtr7pwqLVnzAiMz1DbbIqu1BK3ry4SHdkplyj9Ju4QV7PyRnkG/Jl+/rW+Dbbh+Esc+ 2xmLSzXHkiriKoK7Bu+D6SAyChxdN7I7B1PS1GWRDcATeg10nXLmi8U7eAMxC2d6JUq9 8VhlzXbny6la9XvVg8QlTT+LAtwlKP5dyv36kyRASCEcN1CMqOoxBTQZROJ3bTiuM8uz DxSPHLvS3uUGSJjIXyCncLb8Bto2fwdc2gbskdS6HMDkz5YJK+Pa8hPKxbZvaDCKTV8b nY/w== X-Received: by 10.66.251.3 with SMTP id zg3mr6076791pac.113.1415493478009; Sat, 08 Nov 2014 16:37:58 -0800 (PST) Received: from localhost.localdomain (14-201-185-176.static.tpgi.com.au. [14.201.185.176]) by mx.google.com with ESMTPSA id f12sm12435470pdl.94.2014.11.08.16.37.56 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 08 Nov 2014 16:37:57 -0800 (PST) From: damien.zammit@gmail.com To: alsa-devel@alsa-project.org Date: Sun, 9 Nov 2014 11:37:08 +1100 Message-Id: <1415493428-31653-3-git-send-email-damien.zammit@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1415493428-31653-1-git-send-email-damien.zammit@gmail.com> References: <1415493428-31653-1-git-send-email-damien.zammit@gmail.com> Cc: Damien Zammit Subject: [alsa-devel] [PATCH 2/2 v2] ALSA: usb-audio: Add duplex mode for Digidesign Mbox 1 and enable mixer X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP From: Damien Zammit 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. Signed-off-by: Damien Zammit --- 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 */ 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,