Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 157a57b6 authored by Daniel Mack's avatar Daniel Mack Committed by Takashi Iwai
Browse files

ALSA: usb-audio: move and add some comments



Also add a list of open topics.

Signed-off-by: default avatarDaniel Mack <daniel@caiaq.de>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 21af7d8c
Loading
Loading
Loading
Loading
+15 −0
Original line number Original line Diff line number Diff line
@@ -18,6 +18,21 @@
/* v1.0 and v2.0 of this standard have many things in common. For the rest
/* v1.0 and v2.0 of this standard have many things in common. For the rest
 * of the definitions, please refer to audio.h */
 * of the definitions, please refer to audio.h */


/*
 * bmControl field decoders
 *
 * From the USB Audio spec v2.0:
 *
 *   bmaControls() is a (ch+1)-element array of 4-byte bitmaps,
 *   each containing a set of bit pairs. If a Control is present,
 *   it must be Host readable. If a certain Control is not
 *   present then the bit pair must be set to 0b00.
 *   If a Control is present but read-only, the bit pair must be
 *   set to 0b01. If a Control is also Host programmable, the bit
 *   pair must be set to 0b11. The value 0b10 is not allowed.
 *
 */

static inline bool uac2_control_is_readable(u32 bmControls, u8 control)
static inline bool uac2_control_is_readable(u32 bmControls, u8 control)
{
{
	return (bmControls >> (control * 2)) & 0x1;
	return (bmControls >> (control * 2)) & 0x1;
+14 −2
Original line number Original line Diff line number Diff line
@@ -120,8 +120,6 @@ static bool uac_clock_source_is_valid(struct snd_usb_audio *chip, int source_id)
	return !!data;
	return !!data;
}
}


/* Try to find the clock source ID of a given clock entity */

static int __uac_clock_find_source(struct snd_usb_audio *chip,
static int __uac_clock_find_source(struct snd_usb_audio *chip,
				   struct usb_host_interface *host_iface,
				   struct usb_host_interface *host_iface,
				   int entity_id, unsigned long *visited)
				   int entity_id, unsigned long *visited)
@@ -154,6 +152,8 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip,
		if (ret < 0)
		if (ret < 0)
			return ret;
			return ret;


		/* Selector values are one-based */

		if (ret > selector->bNrInPins || ret < 1) {
		if (ret > selector->bNrInPins || ret < 1) {
			printk(KERN_ERR
			printk(KERN_ERR
				"%s(): selector reported illegal value, id %d, ret %d\n",
				"%s(): selector reported illegal value, id %d, ret %d\n",
@@ -176,6 +176,17 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip,
	return -EINVAL;
	return -EINVAL;
}
}


/*
 * For all kinds of sample rate settings and other device queries,
 * the clock source (end-leaf) must be used. However, clock selectors,
 * clock multipliers and sample rate converters may be specified as
 * clock source input to terminal. This functions walks the clock path
 * to its end and tries to find the source.
 *
 * The 'visited' bitfield is used internally to detect recursive loops.
 *
 * Returns the clock source UnitID (>=0) on success, or an error.
 */
int snd_usb_clock_find_source(struct snd_usb_audio *chip,
int snd_usb_clock_find_source(struct snd_usb_audio *chip,
			      struct usb_host_interface *host_iface,
			      struct usb_host_interface *host_iface,
			      int entity_id)
			      int entity_id)
@@ -246,6 +257,7 @@ static int set_sample_rate_v2(struct snd_usb_audio *chip, int iface,
		return clock;
		return clock;


	if (!uac_clock_source_is_valid(chip, clock)) {
	if (!uac_clock_source_is_valid(chip, clock)) {
		/* TODO: should we try to find valid clock setups by ourself? */
		snd_printk(KERN_ERR "%d:%d:%d: clock source %d is not valid, cannot use\n",
		snd_printk(KERN_ERR "%d:%d:%d: clock source %d is not valid, cannot use\n",
			   dev->devnum, iface, fmt->altsetting, clock);
			   dev->devnum, iface, fmt->altsetting, clock);
		return -ENXIO;
		return -ENXIO;
+16 −8
Original line number Original line Diff line number Diff line
@@ -26,6 +26,22 @@
 *
 *
 */
 */


/*
 * TODOs, for both the mixer and the streaming interfaces:
 *
 *  - support for UAC2 effect units
 *  - support for graphical equalizers
 *  - RANGE and MEM set commands (UAC2)
 *  - RANGE and MEM interrupt dispatchers (UAC2)
 *  - audio channel clustering (UAC2)
 *  - audio sample rate converter units (UAC2)
 *  - proper handling of clock multipliers (UAC2)
 *  - dispatch clock change notifications (UAC2)
 *  	- stop PCM streams which use a clock that became invalid
 *  	- stop PCM streams which use a clock selector that has changed
 *  	- parse available sample rates again when clock sources changed
 */

#include <linux/bitops.h>
#include <linux/bitops.h>
#include <linux/init.h>
#include <linux/init.h>
#include <linux/list.h>
#include <linux/list.h>
@@ -1199,14 +1215,6 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, void
		}
		}
	} else { /* UAC_VERSION_2 */
	} else { /* UAC_VERSION_2 */
		for (i = 0; i < 30/2; i++) {
		for (i = 0; i < 30/2; i++) {
			/* From the USB Audio spec v2.0:
			   bmaControls() is a (ch+1)-element array of 4-byte bitmaps,
			   each containing a set of bit pairs. If a Control is present,
			   it must be Host readable. If a certain Control is not
			   present then the bit pair must be set to 0b00.
			   If a Control is present but read-only, the bit pair must be
			   set to 0b01. If a Control is also Host programmable, the bit
			   pair must be set to 0b11. The value 0b10 is not allowed. */
			unsigned int ch_bits = 0;
			unsigned int ch_bits = 0;
			unsigned int ch_read_only = 0;
			unsigned int ch_read_only = 0;