diff options
| -rw-r--r-- | docs/reference/class/audio.rst | 159 | ||||
| -rw-r--r-- | docs/reference/class/host.rst | 12 | ||||
| -rw-r--r-- | docs/reference/class/index.rst | 2 |
3 files changed, 162 insertions, 11 deletions
diff --git a/docs/reference/class/audio.rst b/docs/reference/class/audio.rst index 6e86dff8c..9a7422324 100644 --- a/docs/reference/class/audio.rst +++ b/docs/reference/class/audio.rst @@ -2,12 +2,17 @@ Audio ***** -Role: device only. TinyUSB supports USB Audio Class 1.0 and 2.0 streaming. +TinyUSB supports USB Audio Class 1.0 and 2.0 streaming in device and host +roles. + +Device driver +============= + 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: @@ -20,7 +25,7 @@ example, confirm that it enumerates, and then change one property at a time: UAC2 at high speed, with multiple rates. Configuration -============= +------------- Set ``CFG_TUD_AUDIO`` to the number of audio functions. The principal options are: @@ -71,7 +76,7 @@ advertised alternate setting, for example intervals per millisecond than full-speed audio. Data path -========= +--------- .. list-table:: :header-rows: 1 @@ -112,7 +117,7 @@ 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 @@ -129,3 +134,147 @@ 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. + +Host driver +=========== + +The host driver discovers one playback stream and one capture stream in each +supported AudioControl function. It presents each usable alternate setting +and discrete sample rate as a complete ``format``, ``sample_rate``, and +``channels`` configuration. The application selects one of these tuples; +TinyUSB manages interface alternate settings, endpoints, packet sizing, and +explicit feedback. + +Start from :doc:`../../examples/host/audio_host`. It discovers configurations, +selects signed 16-bit capture and playback streams, and cycles through +microphone, speaker, and loopback operation. + +Configuration +------------- + +Set ``CFG_TUH_AUDIO`` to enable the driver. The principal options are: + +.. list-table:: + :header-rows: 1 + :widths: 36 18 46 + + * - Option + - Default + - What it controls + * - ``CFG_TUH_AUDIO`` + - ``0`` + - Enables the Audio host class. A nonzero value includes the driver. + * - ``CFG_TUH_AUDIO_PROTOCOLS`` + - UAC1 + - Bitmask of ``TUH_AUDIO_PROTOCOL_UAC1`` and + ``TUH_AUDIO_PROTOCOL_UAC2``. Combine them to accept both versions. + * - ``CFG_TUH_AUDIO_MAX`` + - ``1`` + - Maximum number of mounted AudioControl functions. + * - ``CFG_TUH_AUDIO_MAX_AS`` + - ``4`` + - Maximum number of nonzero-bandwidth alternate settings retained per + logical stream. + * - ``CFG_TUH_AUDIO_MAX_SAM_FREQ`` + - ``5`` + - Maximum discrete sample rates retained per UAC1 alternate setting or + UAC2 Clock Source. + * - ``CFG_TUH_AUDIO_EPIN_BUFSIZE`` / + ``CFG_TUH_AUDIO_EPOUT_BUFSIZE`` + - ``256`` bytes + - Largest capture/playback packet the driver can submit. A configuration + whose packet for one polling interval is larger is rejected. + * - ``CFG_TUH_AUDIO_STREAM_BUFSIZE`` + - ``1024`` bytes + - Per-stream FIFO depth. Playback sends silence when a complete packet + is unavailable; capture overwrites the oldest complete frames when the + FIFO is full. + +Increase the endpoint buffers for high channel counts, sample rates, or sample +widths. All buffers are statically allocated, so these maxima directly affect +RAM use. + +Stream lifecycle +---------------- + +After ``tuh_audio_mount_cb()``, enumerate stream indices from zero through +``tuh_audio_stream_count() - 1``. Use ``tuh_audio_stream_direction()`` to +distinguish ``TUH_AUDIO_STREAM_PLAYBACK`` (host to device) from +``TUH_AUDIO_STREAM_CAPTURE`` (device to host). Then enumerate the stream's +configurations with ``tuh_audio_config_count()`` and +``tuh_audio_config_get()``. + +For each stream: + +1. Call ``tuh_audio_configure()`` with a supported configuration index while + the stream is stopped. +2. Call ``tuh_audio_start()``. A ``true`` return means that startup was + submitted, not that it completed. +3. Wait for ``TUH_AUDIO_EVENT_START_COMPLETE`` in ``tuh_audio_event_cb()`` and + check that its transfer result is successful before handling samples. +4. Use the non-blocking frame FIFO APIs while the stream runs. +5. Call ``tuh_audio_stop()`` and wait for + ``TUH_AUDIO_EVENT_STOP_COMPLETE`` before reconfiguring the stream. + +Capture and playback streams in the same AudioControl function must use the +same sample rate while they run concurrently. ``tuh_audio_active_config()`` +returns ``TUSB_INDEX_INVALID_8`` when no configuration is selected. + +Audio data is counted in frames, not bytes. One frame contains one sample for +every channel; obtain its byte size with ``tuh_audio_config_frame_size()``. +``tuh_audio_read()`` removes whole frames from a capture FIFO, while +``tuh_audio_write()`` queues whole frames for playback. Their return values +may be shorter than requested. Use ``tuh_audio_read_available()`` and +``tuh_audio_write_available()`` to service the FIFOs from the application task; +the transfer callbacks are notifications and need not drive FIFO servicing. + +Callbacks and failures +---------------------- + +``tuh_audio_descriptor_cb()`` runs during enumeration, before the mount +callback. Its descriptor pointers are valid only during the call. Copy any +entity IDs or descriptor fields needed for later raw controls, but do not +submit control transfers from this callback. + +``tuh_audio_capture_cb()`` and ``tuh_audio_playback_cb()`` report successful +isochronous transfers. ``tuh_audio_event_cb()`` reports asynchronous start and +stop completion and ``TUH_AUDIO_EVENT_XFER_FAILED``. A failed stream has been +stopped; the application may reconfigure or restart it. Clear all saved +indices and associated state in ``tuh_audio_umount_cb()`` because an index may +be reused by a later device. + +Run ``tuh_task()`` continuously. Isochronous transfers follow the endpoint's +polling interval, and delaying the host task can exhaust the FIFO even when its +average producer and consumer rates match. + +Feature Unit controls +--------------------- + +The driver discovers master mute and volume capabilities before the mount +callback. Test mute with ``tuh_audio_mute_supported()`` and retrieve the +cached volume range with ``tuh_audio_volume_range_get()``. Volume values use +signed 1/256 dB units; ``TUH_AUDIO_VOLUME_SILENCE`` represents silence, and +``TUH_AUDIO_CHANNEL_MASTER`` selects the master channel. + +The asynchronous ``tuh_audio_mute_*()`` and ``tuh_audio_volume_*()`` APIs use +a completion callback. Their synchronous helpers block until completion and +should only be used while audio streaming is stopped; synchronous transfers +can disrupt isochronous traffic. Use ``tuh_audio_control_xfer()`` for other +class-specific entity controls. Buffers passed to asynchronous controls must +remain valid until their completion callbacks run. + +Supported formats and limitations +--------------------------------- + +The host accepts Type-I PCM in signed 8-, 16-, packed 24-, 24-in-32-, and +32-bit little-endian formats. UAC1 descriptors must list discrete sample +rates; continuous ranges are not supported. UAC2 requires a directly +connected Clock Source. Clock Selectors, Clock Multipliers, Sampling Rate +Converters, Clock Validity, and Valid Alternate Settings controls are not +handled. + +Explicit feedback endpoints using 10.14 or 16.16 values are supported. +Implicit-feedback IN endpoints are treated as ordinary capture endpoints and +do not pace playback. ``MaxPacketsOnly`` endpoints are not supported: OUT +packets are not padded to ``wMaxPacketSize``, and padding in IN packets is not +removed from the captured data. diff --git a/docs/reference/class/host.rst b/docs/reference/class/host.rst index ef42e3dfb..ebb5a552f 100644 --- a/docs/reference/class/host.rst +++ b/docs/reference/class/host.rst @@ -2,10 +2,10 @@ Using Host Classes ****************** -TinyUSB provides application-level host drivers for CDC serial, HID, MIDI 1.0, -MIDI 2.0, and Mass Storage. A host application is asynchronous: a mount -callback reports a ready interface, I/O is queued, and completion or receive -callbacks advance the application state. +TinyUSB provides application-level host drivers for Audio, CDC serial, HID, +MIDI 1.0, MIDI 2.0, and Mass Storage. A host application is asynchronous: a +mount callback reports a ready interface, I/O is queued, and completion or +receive callbacks advance the application state. Setup checklist =============== @@ -28,6 +28,7 @@ Typical configuration: #define CFG_TUH_ENABLED 1 #define CFG_TUH_DEVICE_MAX 4 #define CFG_TUH_HUB 1 + #define CFG_TUH_AUDIO 1 #define CFG_TUH_CDC 1 #define CFG_TUH_HID (3 * CFG_TUH_DEVICE_MAX) #define CFG_TUH_MSC 1 @@ -137,6 +138,7 @@ Do not block ``tuh_task()`` while waiting for a callback that only it can dispatch. Prefer the asynchronous APIs. Where a class provides a synchronous helper, use it only from a context in which the host task can still run. -Start with :doc:`../../examples/host/cdc_msc_hid` for CDC, HID, and MSC, +Start with :doc:`../../examples/host/audio_host` for Audio, +:doc:`../../examples/host/cdc_msc_hid` for CDC, HID, and MSC, :doc:`../../examples/host/midi_rx` for MIDI 1.0, or :doc:`../../examples/host/midi2_host` for MIDI 2.0. diff --git a/docs/reference/class/index.rst b/docs/reference/class/index.rst index 2f8e577d0..dff38aa26 100644 --- a/docs/reference/class/index.rst +++ b/docs/reference/class/index.rst @@ -24,7 +24,7 @@ Support matrix - Guide * - Audio 1.0/2.0 - Yes - - No + - Yes - :doc:`audio` * - Bluetooth HCI - Yes |
