Re: [PATCH v2 3/3] usb: gadget: add f_uac1 variant based on new u_audio api

From: Ruslan Bilovol
Date: Tue Aug 16 2016 - 16:38:51 EST


On Tue, Aug 16, 2016 at 5:52 AM, Peter Chen <hzpeterchen@xxxxxxxxx> wrote:
> On Sun, Aug 14, 2016 at 01:21:24AM +0300, Ruslan Bilovol wrote:
>> This patch adds new function f_uac1_newapi that
>> uses recently created u_audio api. This makes
>> f_uac1_newapi implementation much simpler by
>> reusing existing u_audio core utilities.
>>
>> This also drops previous f_uac1 approach (write
>> audio samples directly to existing ALSA sound
>> card) and moves to more generic/flexible
>> one - create an f_uac1 ALSA sound card that
>> represents USB Audio function and allows to
>> be used by userspace tools.
>>
>> f_uac1_newapi also has capture support (gadget->host).
>> By default, capture interface has 48000kHz/2ch
>> configuration, same as playback channel has.
>>
>> f_uac1_newapi descriptors naming conventios
>> uses f_uac2 driver naming convention that
>> makes it more common and meaningful.
>>
>> Comparing to f_uac1, the f_uac1_newapi doesn't
>> have volume/mute functionality. This is because
>> the volume/mute feature unit was dummy
>> implementation since that driver creation (2009)
>> and never had real volume control or mute
>> functionality.
>>
>> g_audio can be built using one of existing
>> uac functions (f_uac1, f_uac1_newapi or f_uac2)
>>
>> Signed-off-by: Ruslan Bilovol <ruslan.bilovol@xxxxxxxxx>
>> ---
>> .../ABI/testing/configfs-usb-gadget-uac1_newapi | 12 +
>> Documentation/usb/gadget-testing.txt | 41 ++
>> drivers/usb/gadget/Kconfig | 21 +
>> drivers/usb/gadget/function/Makefile | 2 +
>> drivers/usb/gadget/function/f_uac1_newapi.c | 795 +++++++++++++++++++++
>> drivers/usb/gadget/function/u_uac1_newapi.h | 39 +
>> drivers/usb/gadget/legacy/Kconfig | 15 +-
>> drivers/usb/gadget/legacy/audio.c | 52 ++
>> 8 files changed, 975 insertions(+), 2 deletions(-)
>> create mode 100644 Documentation/ABI/testing/configfs-usb-gadget-uac1_newapi
>> create mode 100644 drivers/usb/gadget/function/f_uac1_newapi.c
>> create mode 100644 drivers/usb/gadget/function/u_uac1_newapi.h
>>
>> diff --git a/Documentation/ABI/testing/configfs-usb-gadget-uac1_newapi b/Documentation/ABI/testing/configfs-usb-gadget-uac1_newapi
>> new file mode 100644
>> index 0000000..d355275
>> --- /dev/null
>> +++ b/Documentation/ABI/testing/configfs-usb-gadget-uac1_newapi
>> @@ -0,0 +1,12 @@
>> +What: /config/usb-gadget/gadget/functions/uac1_newapi.name
>> +Date: Aug 2016
>> +KernelVersion: 4.9
>> +Description:
>> + The attributes:
>> +
>> + c_chmask - capture channel mask
>> + c_srate - capture sampling rate
>> + c_ssize - capture sample size (bytes)
>> + p_chmask - playback channel mask
>> + p_srate - playback sampling rate
>> + p_ssize - playback sample size (bytes)
>> diff --git a/Documentation/usb/gadget-testing.txt b/Documentation/usb/gadget-testing.txt
>> index 5819605..4598d7f 100644
>> --- a/Documentation/usb/gadget-testing.txt
>> +++ b/Documentation/usb/gadget-testing.txt
>> @@ -20,6 +20,7 @@ provided by gadgets.
>> 17. UAC2 function
>> 18. UVC function
>> 19. PRINTER function
>> +20. UAC1 function (new API)
>>
>>
>> 1. ACM function
>> @@ -770,3 +771,43 @@ host:
>>
>> More advanced testing can be done with the prn_example
>> described in Documentation/usb/gadget-printer.txt.
>> +
>> +
>> +20. UAC1 function (new API, using u_audio)
>> +=================
>> +
>> +The function is provided by usb_f_uac1_newapi.ko module.
>> +
>> +Function-specific configfs interface
>> +------------------------------------
>> +
>> +The function name to use when creating the function directory
>> +is "uac1_newapi". The uac1_newapi function provides these attributes
>> +in its function directory:
>> +
>> + c_chmask - capture channel mask
>> + c_srate - capture sampling rate
>> + c_ssize - capture sample size (bytes)
>> + p_chmask - playback channel mask
>> + p_srate - playback sampling rate
>> + p_ssize - playback sample size (bytes)
>> +
>> +The attributes have sane default values.
>> +
>> +Testing the UAC1 function
>> +-------------------------
>> +
>> +device: run the gadget
>> +host: aplay -l # should list our USB Audio Gadget
>> +
>> +This function does not require real hardware support, it just
>> +sends a stream of audio data to/from the host. In order to
>> +actually hear something at the device side, a command similar
>> +to this must be used at the device side:
>> +
>> +$ arecord -f dat -t wav -D hw:2,0 | aplay -D hw:0,0 &
>> +
>> +e.g.:
>> +
>> +$ arecord -f dat -t wav -D hw:CARD=UAC1Gadget,DEV=0 | \
>> +aplay -D default:CARD=OdroidU3
>> diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
>> index a25afd8..abcb539 100644
>> --- a/drivers/usb/gadget/Kconfig
>> +++ b/drivers/usb/gadget/Kconfig
>> @@ -194,6 +194,9 @@ config USB_F_FS
>> config USB_F_UAC1
>> tristate
>>
>> +config USB_F_UAC1_NEWAPI
>> + tristate
>> +
>> config USB_F_UAC2
>> tristate
>>
>> @@ -397,6 +400,24 @@ config USB_CONFIGFS_F_UAC1
>> This driver requires a real Audio codec to be present
>> on the device.
>>
>> +config USB_CONFIGFS_F_UAC1_NEWAPI
>> + bool "Audio Class 1.0 (new API)"
>> + depends on USB_CONFIGFS
>> + depends on SND
>> + select USB_LIBCOMPOSITE
>> + select SND_PCM
>> + select USB_U_AUDIO
>> + select USB_F_UAC1_NEWAPI
>> + help
>> + This Audio function implements 1 AudioControl interface,
>> + 1 AudioStreaming Interface each for USB-OUT and USB-IN.
>
> %s/1/one
>

That's same naming as already used for UAC1 and UAC2 description
in this Kconfig file. Let's keep it "1" for consistency

Best regards,
Ruslan