diff mbox series

ALSA: usb-audio: Expose sample resolution through proc interface

Message ID 20190217221721.6396-1-jussi@sonarnerd.net (mailing list archive)
State New, archived
Headers show
Series ALSA: usb-audio: Expose sample resolution through proc interface | expand

Commit Message

Jussi Laako Feb. 17, 2019, 10:17 p.m. UTC
At least some USB devices use (MSB-aligned) audio format larger
than the actual resolution of the device. In order to expose the
actual device resolution (bBitResolution), add extra field to the
procfs stream info interface.

Signed-off-by: Jussi Laako <jussi@sonarnerd.net>
---
 sound/usb/card.h   | 1 +
 sound/usb/format.c | 2 ++
 sound/usb/proc.c   | 1 +
 3 files changed, 4 insertions(+)

Comments

Jussi Laako Feb. 18, 2019, 9:23 a.m. UTC | #1
On 2/18/19 10:40 AM, Takashi Iwai wrote:
> 
> The code change looks but, just some minor issues:
> 
> Please use tabs.  checkpatch will catch such a problem, so please run
> it at the next time before submission.
> 
> I applied the patch with these fixed locally.

OK, thanks! Will do!

Ultimately I would like to get the sample resolution for example through 
snd_pcm_hw_params_get_sbits(), but I didn't find a nice way to get this 
information to the ALSA API without lot of changes all over the place, 
or alternatively introducing a new sample format which I think is not a 
good idea in this case.

I can parse the stream info from proc though, so it is not so much issue.


Best regards,

	- Jussi
diff mbox series

Patch

diff --git a/sound/usb/card.h b/sound/usb/card.h
index ac785d15ced4..d9bb2c4a3bd9 100644
--- a/sound/usb/card.h
+++ b/sound/usb/card.h
@@ -14,6 +14,7 @@  struct audioformat {
 	u64 formats;			/* ALSA format bits */
 	unsigned int channels;		/* # channels */
 	unsigned int fmt_type;		/* USB audio format type (1-3) */
+        unsigned int fmt_bits;          /* number of significant bits */
 	unsigned int frame_size;	/* samples per frame for non-audio */
 	int iface;			/* interface number */
 	unsigned char altsetting;	/* corresponding alternate setting */
diff --git a/sound/usb/format.c b/sound/usb/format.c
index fd13ac11b136..d5b7cbcc2956 100644
--- a/sound/usb/format.c
+++ b/sound/usb/format.c
@@ -87,6 +87,8 @@  static u64 parse_audio_format_i_type(struct snd_usb_audio *chip,
 	}
 	}
 
+	fp->fmt_bits = (unsigned int) sample_width;
+
 	if ((pcm_formats == 0) &&
 	    (format == 0 || format == (1 << UAC_FORMAT_TYPE_I_UNDEFINED))) {
 		/* some devices don't define this correctly... */
diff --git a/sound/usb/proc.c b/sound/usb/proc.c
index e80c9d0749c9..ef9190530fd2 100644
--- a/sound/usb/proc.c
+++ b/sound/usb/proc.c
@@ -109,6 +109,7 @@  static void proc_dump_substream_formats(struct snd_usb_substream *subs, struct s
 		if (subs->speed != USB_SPEED_FULL)
 			snd_iprintf(buffer, "    Data packet interval: %d us\n",
 				    125 * (1 << fp->datainterval));
+		snd_iprintf(buffer, "    Bits: %d\n", fp->fmt_bits);
 		// snd_iprintf(buffer, "    Max Packet Size = %d\n", fp->maxpacksize);
 		// snd_iprintf(buffer, "    EP Attribute = %#x\n", fp->attributes);
 	}