| ***** |
| Audio |
| ***** |
| |
| Role: device only. TinyUSB supports USB Audio Class 1.0 and 2.0 streaming. |
| The descriptors define the topology, formats, channels, rates, controls, and |
| alternate settings; the application supplies or consumes the audio samples. |
| |
| Start from an example |
| ===================== |
| |
| Audio descriptors and buffer sizes are tightly coupled. Copy the closest |
| example, confirm that it enumerates, and then change one property at a time: |
| |
| * :doc:`../../examples/device/audio_test` -- one-channel UAC2 microphone; |
| * :doc:`../../examples/device/audio_4_channel_mic` -- four-channel microphone; |
| * :doc:`../../examples/device/uac2_speaker_fb` -- speaker with feedback; |
| * :doc:`../../examples/device/uac2_headset` -- bidirectional headset; |
| * :doc:`../../examples/device/audio_test_multi_rate` -- UAC1 at full speed, |
| UAC2 at high speed, with multiple rates. |
| |
| Configuration |
| ============= |
| |
| Set ``CFG_TUD_AUDIO`` to the number of audio functions. The principal options |
| are: |
| |
| .. list-table:: |
| :header-rows: 1 |
| :widths: 37 16 47 |
| |
| * - Option |
| - Default |
| - What it controls |
| * - ``CFG_TUD_AUDIO_CTRL_BUF_SZ`` |
| - ``64`` bytes |
| - Largest class control payload, such as a RANGE or channel-cluster |
| response. Increase it to fit the largest advertised control. |
| * - ``CFG_TUD_AUDIO_ENABLE_EP_IN`` |
| - ``0`` |
| - Enables microphone/device-to-host streaming. |
| * - ``CFG_TUD_AUDIO_ENABLE_EP_OUT`` |
| - ``0`` |
| - Enables speaker/host-to-device streaming. |
| * - ``CFG_TUD_AUDIO_FUNC_n_EP_IN_SZ_MAX`` / |
| ``CFG_TUD_AUDIO_FUNC_n_EP_OUT_SZ_MAX`` |
| - Required per enabled direction |
| - Maximum endpoint packet size across that function's alternate settings. |
| * - ``CFG_TUD_AUDIO_FUNC_n_EP_IN_SW_BUF_SZ`` / |
| ``CFG_TUD_AUDIO_FUNC_n_EP_OUT_SW_BUF_SZ`` |
| - ``0`` |
| - Software FIFO size. Set it to at least the corresponding maximum |
| endpoint size when using the FIFO APIs. |
| * - ``CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL`` |
| - ``1`` |
| - Adapts IN packet consumption to the FIFO fill level to reduce |
| underruns/overruns. |
| * - ``CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP`` |
| - ``0`` |
| - Enables an explicit feedback endpoint, normally required by an |
| asynchronous speaker. |
| * - ``CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP`` |
| - ``0`` |
| - Enables the AudioControl interrupt endpoint for status notifications. |
| |
| For each enabled direction, define the maximum endpoint size used by any |
| advertised alternate setting, for example |
| ``CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX``. A software FIFO such as |
| ``CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ`` must be at least that large. Use |
| ``TUD_AUDIO_EP_SIZE()`` as the examples do; high-speed audio has more service |
| intervals per millisecond than full-speed audio. |
| |
| Data path |
| ========= |
| |
| .. list-table:: |
| :header-rows: 1 |
| :widths: 34 66 |
| |
| * - Operation |
| - Main API |
| * - ``tud_audio_mounted()`` / ``tud_audio_version()`` |
| - Tests whether function zero is configured and returns its negotiated |
| Audio Class version. |
| * - ``tud_audio_available()`` / ``tud_audio_read()`` |
| - Reports and removes speaker bytes from the OUT software FIFO. The read |
| count can be shorter than requested. |
| * - ``tud_audio_write()`` |
| - Copies microphone bytes into the IN software FIFO and returns the number |
| accepted. |
| * - ``tud_audio_clear_ep_*_ff()`` |
| - Discards queued samples in the selected endpoint FIFO, useful when a |
| streaming alternate setting closes. |
| * - ``tud_audio_get_ep_*_ff()`` |
| - Returns the underlying FIFO object for advanced zero-copy or DMA |
| integration; the application must preserve its invariants. |
| * - ``tud_audio_n_fb_set()`` |
| - Supplies the feedback value for one audio function when application |
| feedback mode is used. Pass 16.16 samples per frame; TinyUSB converts |
| it to full-speed 10.14 format when required. |
| * - ``tud_audio_feedback_update()`` |
| - Updates internally calculated feedback from elapsed master-clock cycles |
| and returns the current 16.16 value, or zero on error. |
| * - ``tud_audio_n_*()`` |
| - Selects a function explicitly with ``func_id``; helpers without ``n`` |
| operate on function zero. |
| |
| The host starts and stops a stream by selecting interface alternate settings. |
| Use ``tud_audio_set_itf_cb()`` and ``tud_audio_set_itf_close_ep_cb()`` to start |
| or stop the application-side I2S/DMA path. Do not produce or consume samples |
| merely because the device is mounted; wait until the streaming interface is |
| active. |
| |
| Control requests |
| ================ |
| |
| Implement the ``tud_audio_get_req_*_cb()`` and ``tud_audio_set_req_*_cb()`` |
| callbacks for every control advertised by the descriptors, such as clock |
| frequency, clock validity, mute, and volume. A descriptor that advertises a |
| control but stalls its normal requests is likely to be rejected or behave |
| poorly on a host. |
| |
| Asynchronous speakers normally need a feedback endpoint. Enable |
| ``CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP`` and either configure the feedback method |
| through ``tud_audio_feedback_params_cb()`` or provide feedback with |
| ``tud_audio_n_fb_set()``. Begin with the speaker-feedback example; incorrect |
| feedback causes periodic underruns or overruns even when the nominal sample |
| rates match. |
| |
| Specifications used: *USB Device Class Definition for Audio Devices*, Release |
| 1.0 and Release 2.0, plus *Audio Data Formats*, Release 2.0. |