mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.5 KiB
97 lines
3.5 KiB
.. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later |
|
|
|
.. _audio: |
|
|
|
************************ |
|
Audio Inputs and Outputs |
|
************************ |
|
|
|
Audio inputs and outputs are physical connectors of a device. Video |
|
capture devices have inputs, output devices have outputs, zero or more |
|
each. Radio devices have no audio inputs or outputs. They have exactly |
|
one tuner which in fact *is* an audio source, but this API associates |
|
tuners with video inputs or outputs only, and radio devices have none of |
|
these. [#f1]_ A connector on a TV card to loop back the received audio |
|
signal to a sound card is not considered an audio output. |
|
|
|
Audio and video inputs and outputs are associated. Selecting a video |
|
source also selects an audio source. This is most evident when the video |
|
and audio source is a tuner. Further audio connectors can combine with |
|
more than one video input or output. Assumed two composite video inputs |
|
and two audio inputs exist, there may be up to four valid combinations. |
|
The relation of video and audio connectors is defined in the |
|
``audioset`` field of the respective struct |
|
:c:type:`v4l2_input` or struct |
|
:c:type:`v4l2_output`, where each bit represents the index |
|
number, starting at zero, of one audio input or output. |
|
|
|
To learn about the number and attributes of the available inputs and |
|
outputs applications can enumerate them with the |
|
:ref:`VIDIOC_ENUMAUDIO` and |
|
:ref:`VIDIOC_ENUMAUDOUT <VIDIOC_ENUMAUDOUT>` ioctl, respectively. |
|
The struct :c:type:`v4l2_audio` returned by the |
|
:ref:`VIDIOC_ENUMAUDIO` ioctl also contains signal |
|
status information applicable when the current audio input is queried. |
|
|
|
The :ref:`VIDIOC_G_AUDIO <VIDIOC_G_AUDIO>` and |
|
:ref:`VIDIOC_G_AUDOUT <VIDIOC_G_AUDOUT>` ioctls report the current |
|
audio input and output, respectively. |
|
|
|
.. note:: |
|
|
|
Note that, unlike :ref:`VIDIOC_G_INPUT <VIDIOC_G_INPUT>` and |
|
:ref:`VIDIOC_G_OUTPUT <VIDIOC_G_OUTPUT>` these ioctls return a |
|
structure as :ref:`VIDIOC_ENUMAUDIO` and |
|
:ref:`VIDIOC_ENUMAUDOUT <VIDIOC_ENUMAUDOUT>` do, not just an index. |
|
|
|
To select an audio input and change its properties applications call the |
|
:ref:`VIDIOC_S_AUDIO <VIDIOC_G_AUDIO>` ioctl. To select an audio |
|
output (which presently has no changeable properties) applications call |
|
the :ref:`VIDIOC_S_AUDOUT <VIDIOC_G_AUDOUT>` ioctl. |
|
|
|
Drivers must implement all audio input ioctls when the device has |
|
multiple selectable audio inputs, all audio output ioctls when the |
|
device has multiple selectable audio outputs. When the device has any |
|
audio inputs or outputs the driver must set the ``V4L2_CAP_AUDIO`` flag |
|
in the struct :c:type:`v4l2_capability` returned by |
|
the :ref:`VIDIOC_QUERYCAP` ioctl. |
|
|
|
|
|
Example: Information about the current audio input |
|
================================================== |
|
|
|
.. code-block:: c |
|
|
|
struct v4l2_audio audio; |
|
|
|
memset(&audio, 0, sizeof(audio)); |
|
|
|
if (-1 == ioctl(fd, VIDIOC_G_AUDIO, &audio)) { |
|
perror("VIDIOC_G_AUDIO"); |
|
exit(EXIT_FAILURE); |
|
} |
|
|
|
printf("Current input: %s\\n", audio.name); |
|
|
|
|
|
Example: Switching to the first audio input |
|
=========================================== |
|
|
|
.. code-block:: c |
|
|
|
struct v4l2_audio audio; |
|
|
|
memset(&audio, 0, sizeof(audio)); /* clear audio.mode, audio.reserved */ |
|
|
|
audio.index = 0; |
|
|
|
if (-1 == ioctl(fd, VIDIOC_S_AUDIO, &audio)) { |
|
perror("VIDIOC_S_AUDIO"); |
|
exit(EXIT_FAILURE); |
|
} |
|
|
|
.. [#f1] |
|
Actually struct :c:type:`v4l2_audio` ought to have a |
|
``tuner`` field like struct :c:type:`v4l2_input`, not |
|
only making the API more consistent but also permitting radio devices |
|
with multiple tuners.
|
|
|