2016-06-30 20:18:56 +07:00
|
|
|
.. -*- coding: utf-8; mode: rst -*-
|
|
|
|
|
|
|
|
.. _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. [1]_ 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
|
|
|
|
:ref:`v4l2_input <v4l2-input>` or struct
|
|
|
|
:ref:`v4l2_output <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
|
2016-07-01 23:58:44 +07:00
|
|
|
:ref:`VIDIOC_ENUMAUDIO` and
|
2016-07-01 23:42:29 +07:00
|
|
|
:ref:`VIDIOC_ENUMAUDOUT <VIDIOC_ENUMAUDIOout>` ioctl, respectively.
|
2016-06-30 20:18:56 +07:00
|
|
|
The struct :ref:`v4l2_audio <v4l2-audio>` returned by the
|
2016-07-01 23:58:44 +07:00
|
|
|
:ref:`VIDIOC_ENUMAUDIO` ioctl also contains signal
|
2016-07-01 08:52:34 +07:00
|
|
|
:status information applicable when the current audio input is queried.
|
2016-06-30 20:18:56 +07:00
|
|
|
|
2016-07-03 20:02:29 +07:00
|
|
|
The :ref:`VIDIOC_G_AUDIO <VIDIOC_G_AUDIO>` and
|
2016-07-01 23:42:29 +07:00
|
|
|
:ref:`VIDIOC_G_AUDOUT <VIDIOC_G_AUDIOout>` ioctls report the current
|
2016-06-30 20:18:56 +07:00
|
|
|
audio input and output, respectively. Note that, unlike
|
2016-07-03 20:02:29 +07:00
|
|
|
:ref:`VIDIOC_G_INPUT <VIDIOC_G_INPUT>` and
|
|
|
|
:ref:`VIDIOC_G_OUTPUT <VIDIOC_G_OUTPUT>` these ioctls return a
|
2016-07-01 23:58:44 +07:00
|
|
|
structure as :ref:`VIDIOC_ENUMAUDIO` and
|
2016-07-01 23:42:29 +07:00
|
|
|
:ref:`VIDIOC_ENUMAUDOUT <VIDIOC_ENUMAUDIOout>` do, not just an index.
|
2016-06-30 20:18:56 +07:00
|
|
|
|
|
|
|
To select an audio input and change its properties applications call the
|
2016-07-01 23:42:29 +07:00
|
|
|
:ref:`VIDIOC_S_AUDIO <VIDIOC_G_AUDIO>` ioctl. To select an audio
|
2016-06-30 20:18:56 +07:00
|
|
|
output (which presently has no changeable properties) applications call
|
2016-07-01 23:42:29 +07:00
|
|
|
the :ref:`VIDIOC_S_AUDOUT <VIDIOC_G_AUDIOout>` ioctl.
|
2016-06-30 20:18:56 +07:00
|
|
|
|
|
|
|
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 :ref:`v4l2_capability <v4l2-capability>` returned by
|
2016-07-01 23:58:44 +07:00
|
|
|
the :ref:`VIDIOC_QUERYCAP` ioctl.
|
2016-06-30 20:18:56 +07:00
|
|
|
|
|
|
|
|
|
|
|
.. code-block:: c
|
2016-07-03 21:24:58 +07:00
|
|
|
:caption: Example 1.3. Information about the current audio input
|
2016-06-30 20:18:56 +07:00
|
|
|
|
|
|
|
struct v4l2_audio audio;
|
|
|
|
|
|
|
|
memset(&audio, 0, sizeof(audio));
|
|
|
|
|
|
|
|
if (-1 == ioctl(fd, VIDIOC_G_AUDIO, &audio)) {
|
2016-07-05 02:25:48 +07:00
|
|
|
perror("VIDIOC_G_AUDIO");
|
|
|
|
exit(EXIT_FAILURE);
|
2016-06-30 20:18:56 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
printf("Current input: %s\\n", audio.name);
|
|
|
|
|
|
|
|
|
|
|
|
.. code-block:: c
|
2016-07-03 21:24:58 +07:00
|
|
|
:caption: Example 1.4. Switching to the first audio input
|
2016-06-30 20:18:56 +07:00
|
|
|
|
|
|
|
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)) {
|
2016-07-05 02:25:48 +07:00
|
|
|
perror("VIDIOC_S_AUDIO");
|
|
|
|
exit(EXIT_FAILURE);
|
2016-06-30 20:18:56 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
.. [1]
|
|
|
|
Actually struct :ref:`v4l2_audio <v4l2-audio>` ought to have a
|
|
|
|
``tuner`` field like struct :ref:`v4l2_input <v4l2-input>`, not
|
|
|
|
only making the API more consistent but also permitting radio devices
|
|
|
|
with multiple tuners.
|