6.2.3.2. DVB 音频设备

注意

不要在新驱动程序中使用!请参阅:通用注意事项

DVB 音频设备控制 DVB 硬件的 MPEG2 音频解码器。可以通过 /dev/dvb/adapter?/audio? 访问它。可以通过在应用程序中包含 linux/dvb/audio.h 来访问数据类型和 ioctl 定义。

请注意,大多数 DVB 卡没有自己的 MPEG 解码器,这会导致省略音频和视频设备。

这些 ioctl 也被 V4L2 用来控制 V4L2 中实现的 MPEG 解码器。为此目的使用这些 ioctl 已过时,并且已创建适当的 V4L2 ioctl 或控件来替代该功能。 对于新驱动程序,请使用 V4L2 ioctl

6.2.3.2.1. 音频数据类型

本节描述与音频设备通信时使用的结构、数据类型和定义。


6.2.3.2.1.1. audio_stream_source_t

6.2.3.2.1.1.1. 概要

enum audio_stream_source_t
typedef enum {
AUDIO_SOURCE_DEMUX,
AUDIO_SOURCE_MEMORY
} audio_stream_source_t;

6.2.3.2.1.1.2. 常量

AUDIO_SOURCE_DEMUX

选择解复用器(由前端或 DVR 设备馈送)作为视频流的源。

AUDIO_SOURCE_MEMORY

从通过 write() 系统调用来自应用程序的流中选择。

6.2.3.2.1.1.3. 描述

音频流源通过 AUDIO_SELECT_SOURCE 调用设置,并且可以采用以下值,具体取决于我们是从内部(解复用)还是外部(用户写入)源进行重播。

馈送到解码器的数据也受 PID 过滤器控制。输出选择:dmx_output DMX_OUT_DECODER


6.2.3.2.1.2. audio_play_state_t

6.2.3.2.1.2.1. 概要

enum audio_play_state_t
typedef enum {
    AUDIO_STOPPED,
    AUDIO_PLAYING,
    AUDIO_PAUSED
} audio_play_state_t;

6.2.3.2.1.2.2. 常量

AUDIO_STOPPED

音频已停止。

AUDIO_PLAYING

音频正在播放。

AUDIO_PAUSE

音频已冻结。

6.2.3.2.1.2.3. 描述

此值可以由 AUDIO_GET_STATUS 调用返回,表示音频播放的状态。


6.2.3.2.1.3. audio_channel_select_t

6.2.3.2.1.3.1. 概要

enum audio_channel_select_t
typedef enum {
    AUDIO_STEREO,
    AUDIO_MONO_LEFT,
    AUDIO_MONO_RIGHT,
    AUDIO_MONO,
    AUDIO_STEREO_SWAPPED
} audio_channel_select_t;

6.2.3.2.1.3.2. 常量

AUDIO_STEREO

立体声。

AUDIO_MONO_LEFT

单声道,选择左立体声通道作为源。

AUDIO_MONO_RIGHT

单声道,选择右立体声通道作为源。

AUDIO_MONO

仅限单声道源。

AUDIO_STEREO_SWAPPED

立体声,交换 L & R。

6.2.3.2.1.3.3. 描述

通过 AUDIO_CHANNEL_SELECT 选择的音频通道由此值确定。


6.2.3.2.1.4. audio_mixer_t

6.2.3.2.1.4.1. 概要

struct audio_mixer
typedef struct audio_mixer {
    unsigned int volume_left;
    unsigned int volume_right;
} audio_mixer_t;

6.2.3.2.1.4.2. 变量

unsigned int volume_left

左声道音量。有效范围:0 ... 255

unsigned int volume_right

右声道音量。有效范围:0 ... 255

6.2.3.2.1.4.3. 描述

此结构由 AUDIO_SET_MIXER 调用使用,用于设置音频音量。


6.2.3.2.1.5. audio_status

6.2.3.2.1.5.1. 概要

struct audio_status
typedef struct audio_status {
    int AV_sync_state;
    int mute_state;
    audio_play_state_t play_state;
    audio_stream_source_t stream_source;
    audio_channel_select_t channel_select;
    int bypass_mode;
    audio_mixer_t mixer_state;
} audio_status_t;

6.2.3.2.1.5.2. 变量

int AV_sync_state

显示 A/V 同步是否开启或关闭。

TRUE ( != 0 )

A/V 同步开启。

FALSE ( == 0 )

A/V 同步关闭。

int mute_state

指示音频是否静音。

TRUE ( != 0 )

静音音频

FALSE ( == 0 )

取消静音音频

audio_play_state_t play_state

当前播放状态。

audio_stream_source_t stream_source

当前数据源。

int bypass_mode

DVB 子系统中是否启用或禁用当前音频流的解码。

TRUE ( != 0 )

禁用旁路。

FALSE ( == 0 )

启用旁路。

audio_mixer_t mixer_state

当前音量设置。

6.2.3.2.1.5.3. 描述

AUDIO_GET_STATUS 调用返回此结构,其中包含有关播放操作的各种状态的信息。


6.2.3.2.1.6. 音频编码

6.2.3.2.1.6.1. 概要

#define AUDIO_CAP_DTS    1
#define AUDIO_CAP_LPCM   2
#define AUDIO_CAP_MP1    4
#define AUDIO_CAP_MP2    8
#define AUDIO_CAP_MP3   16
#define AUDIO_CAP_AAC   32
#define AUDIO_CAP_OGG   64
#define AUDIO_CAP_SDDS 128
#define AUDIO_CAP_AC3  256

6.2.3.2.1.6.2. 常量

AUDIO_CAP_DTS

硬件接受 DTS 音频轨道。

AUDIO_CAP_LPCM

硬件接受具有线性脉冲编码调制 (LPCM) 的未压缩音频

AUDIO_CAP_MP1

硬件接受 MPEG-1 音频 Layer 1。

AUDIO_CAP_MP2

硬件接受 MPEG-1 音频 Layer 2。也称为 MUSICAM。

AUDIO_CAP_MP3

硬件接受 MPEG-1 音频 Layer III。通常称为 .mp3。

AUDIO_CAP_AAC

硬件接受 AAC(高级音频编码)。

AUDIO_CAP_OGG

硬件接受 Vorbis 音频轨道。

AUDIO_CAP_SDDS

硬件接受索尼动态数字声音 (SDDS)。

AUDIO_CAP_AC3

硬件接受杜比数字 ATSC A/52 音频。也称为 AC-3。

6.2.3.2.1.6.3. 描述

调用 AUDIO_GET_CAPABILITIES 返回一个无符号整数,其中根据硬件的功能设置以下位。


6.2.3.2.2. 音频功能调用

6.2.3.2.2.1. AUDIO_STOP

6.2.3.2.2.1.1. 概要

AUDIO_STOP
int ioctl(int fd, int request = AUDIO_STOP)

6.2.3.2.2.1.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 AUDIO_STOP

6.2.3.2.2.1.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用注意事项

此 ioctl 调用要求音频设备停止播放当前流。

6.2.3.2.2.1.4. 返回值

成功时返回 0,出错时返回 -1,并会设置 errno 变量以指示错误类型。通用错误代码请参考通用错误代码章节。


6.2.3.2.2.2. AUDIO_PLAY

6.2.3.2.2.2.1. 概要

AUDIO_PLAY
int  ioctl(int fd, int request = AUDIO_PLAY)

6.2.3.2.2.2.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 AUDIO_PLAY

6.2.3.2.2.2.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用注意事项

此 ioctl 调用请求音频设备从选定的源开始播放音频流。

6.2.3.2.2.2.4. 返回值

成功时返回 0,出错时返回 -1,并会设置 errno 变量以指示错误类型。通用错误代码请参考通用错误代码章节。


6.2.3.2.2.3. AUDIO_PAUSE

6.2.3.2.2.3.1. 概要

AUDIO_PAUSE
int  ioctl(int fd, int request = AUDIO_PAUSE)

6.2.3.2.2.3.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 AUDIO_PAUSE

6.2.3.2.2.3.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用注意事项

此 ioctl 调用暂停正在播放的音频流。解码和播放都将暂停。然后可以使用 AUDIO_CONTINUE 命令再次启动音频流的解码和播放过程。

6.2.3.2.2.3.4. 返回值

成功时返回 0,出错时返回 -1,并会设置 errno 变量以指示错误类型。通用错误代码请参考通用错误代码章节。


6.2.3.2.2.4. AUDIO_CONTINUE

6.2.3.2.2.4.1. 概要

AUDIO_CONTINUE
int  ioctl(int fd, int request = AUDIO_CONTINUE)

6.2.3.2.2.4.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 AUDIO_CONTINUE

6.2.3.2.2.4.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用注意事项

此 ioctl 重新启动之前使用 AUDIO_PAUSE 命令暂停的解码和播放过程。

6.2.3.2.2.4.4. 返回值

成功时返回 0,出错时返回 -1,并会设置 errno 变量以指示错误类型。通用错误代码请参考通用错误代码章节。


6.2.3.2.2.5. AUDIO_SELECT_SOURCE

6.2.3.2.2.5.1. 概要

AUDIO_SELECT_SOURCE
int ioctl(int fd, int request = AUDIO_SELECT_SOURCE,
audio_stream_source_t source)

6.2.3.2.2.5.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 AUDIO_SELECT_SOURCE

audio_stream_source_t source

指示将用于音频流的源。

6.2.3.2.2.5.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用注意事项

此 ioctl 调用通知音频设备将使用哪个源作为输入数据。可能的源是解复用器或内存。如果选择 AUDIO_SOURCE_MEMORY,则通过写入命令将数据馈送到音频设备。如果选择 AUDIO_SOURCE_DEMUX,则数据直接从板载解复用器设备传输到解码器。注意:到目前为止,这仅支持具有一个解复用器和一个解码器的 DVB 设备。

6.2.3.2.2.5.4. 返回值

成功时返回 0,出错时返回 -1,并会设置 errno 变量以指示错误类型。通用错误代码请参考通用错误代码章节。


6.2.3.2.2.6. AUDIO_SET_MUTE

6.2.3.2.2.6.1. 概要

AUDIO_SET_MUTE
int  ioctl(int fd, int request = AUDIO_SET_MUTE, int state)

6.2.3.2.2.6.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 AUDIO_SET_MUTE

int state

指示音频设备是否静音。

TRUE ( != 0 )

静音音频

FALSE ( == 0 )

取消静音音频

6.2.3.2.2.6.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用注意事项

此 ioctl 仅适用于 DVB 设备。要控制 V4L2 解码器,请改用带有 V4L2_DEC_CMD_START_MUTE_AUDIO 标志的 V4L2 ioctl VIDIOC_DECODER_CMD, VIDIOC_TRY_DECODER_CMD

此 ioctl 调用请求音频设备将当前正在播放的流静音。

6.2.3.2.2.6.4. 返回值

成功时返回 0,出错时返回 -1,并会设置 errno 变量以指示错误类型。通用错误代码请参考通用错误代码章节。


6.2.3.2.2.7. AUDIO_SET_AV_SYNC

6.2.3.2.2.7.1. 概要

AUDIO_SET_AV_SYNC
int  ioctl(int fd, int request = AUDIO_SET_AV_SYNC, int state)

6.2.3.2.2.7.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 AUDIO_AV_SYNC

int state

告知 DVB 子系统是否应启用或禁用 A/V 同步。

TRUE ( != 0 )

A/V 同步开启。

FALSE ( == 0 )

A/V 同步关闭。

6.2.3.2.2.7.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用注意事项

此 ioctl 调用请求音频设备打开或关闭 A/V 同步。

6.2.3.2.2.7.4. 返回值

成功时返回 0,出错时返回 -1,并会设置 errno 变量以指示错误类型。通用错误代码请参考通用错误代码章节。


6.2.3.2.2.8. AUDIO_SET_BYPASS_MODE

6.2.3.2.2.8.1. 概要

AUDIO_SET_BYPASS_MODE
int ioctl(int fd, int request = AUDIO_SET_BYPASS_MODE, int mode)

6.2.3.2.2.8.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 AUDIO_SET_BYPASS_MODE

int mode

在 DVB 子系统中启用或禁用当前音频流的解码。

TRUE ( != 0 )

禁用旁路

FALSE ( == 0 )

启用旁路

6.2.3.2.2.8.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用注意事项

此 ioctl 调用请求音频设备绕过音频解码器并转发流而不进行解码。如果应解码 DVB 系统无法处理的流,则应使用此模式。如果硬件可以处理,DVB 子系统会自动转发 Dolby DigitalTM 流。

6.2.3.2.2.8.4. 返回值

成功时返回 0,出错时返回 -1,并会设置 errno 变量以指示错误类型。通用错误代码请参考通用错误代码章节。


6.2.3.2.2.9. AUDIO_CHANNEL_SELECT

6.2.3.2.2.9.1. 概要

AUDIO_CHANNEL_SELECT
int ioctl(int fd, int request = AUDIO_CHANNEL_SELECT,
audio_channel_select_t)

6.2.3.2.2.9.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 AUDIO_CHANNEL_SELECT

audio_channel_select_t ch

选择音频的输出格式(单声道左/右,立体声)。

6.2.3.2.2.9.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用注意事项

此 ioctl 仅适用于 DVB 设备。要控制 V4L2 解码器,请改用 V4L2 V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK 控制。

此 ioctl 调用请求音频设备在可能的情况下选择请求的通道。

6.2.3.2.2.9.4. 返回值

成功时返回 0,出错时返回 -1,并会设置 errno 变量以指示错误类型。通用错误代码请参考通用错误代码章节。


6.2.3.2.2.10. AUDIO_GET_STATUS

6.2.3.2.2.10.1. 概要

AUDIO_GET_STATUS
int ioctl(int fd, int request = AUDIO_GET_STATUS,
struct audio_status *status)

6.2.3.2.2.10.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 AUDIO_GET_STATUS。

struct audio_status *status

返回音频设备的当前状态。

6.2.3.2.2.10.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用注意事项

此 ioctl 调用请求音频设备返回音频设备的当前状态。

6.2.3.2.2.10.4. 返回值

成功时返回 0,出错时返回 -1,并会设置 errno 变量以指示错误类型。通用错误代码请参考通用错误代码章节。


6.2.3.2.2.11. AUDIO_GET_CAPABILITIES

6.2.3.2.2.11.1. 概要

AUDIO_GET_CAPABILITIES
int ioctl(int fd, int request = AUDIO_GET_CAPABILITIES,
unsigned int *cap)

6.2.3.2.2.11.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 AUDIO_GET_CAPABILITIES

unsigned int *cap

返回支持的声音格式的位数组。位在 音频编码中定义。

6.2.3.2.2.11.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用注意事项

此 ioctl 调用请求音频设备告知我们音频硬件的解码能力。

6.2.3.2.2.11.4. 返回值

成功时返回 0,出错时返回 -1,并会设置 errno 变量以指示错误类型。通用错误代码请参考通用错误代码章节。


6.2.3.2.2.12. AUDIO_CLEAR_BUFFER

6.2.3.2.2.12.1. 概要

AUDIO_CLEAR_BUFFER
int  ioctl(int fd, int request = AUDIO_CLEAR_BUFFER)

6.2.3.2.2.12.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

等于此命令的 AUDIO_CLEAR_BUFFER

6.2.3.2.2.12.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用注意事项

此 ioctl 调用请求音频设备清除音频解码器设备的所有软件和硬件缓冲区。

6.2.3.2.2.12.4. 返回值

成功时返回 0,出错时返回 -1,并会设置 errno 变量以指示错误类型。通用错误代码请参考通用错误代码章节。


6.2.3.2.2.13. AUDIO_SET_ID

6.2.3.2.2.13.1. 概要

AUDIO_SET_ID
int  ioctl(int fd, int request = AUDIO_SET_ID, int id)

6.2.3.2.2.13.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

等于此命令的 AUDIO_SET_ID

int id

音频子流 ID。

6.2.3.2.2.13.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用注意事项

如果程序或系统流被发送到视频设备,此 ioctl 选择要解码的子流。

如果未设置音频流类型,则对于 MPEG 音频,ID 必须在 [0xC0,0xDF] 范围内,对于 AC3 在 [0x80,0x87] 范围内,对于 LPCM 在 [0xA0,0xA7] 范围内。有关更多描述,请参见 ITU-T H.222.0 | ISO/IEC 13818-1。

如果使用 AUDIO_SET_STREAMTYPE 设置了流类型,则 ID 仅指定音频流的子流 ID,并且仅识别前 5 位(& 0x1F)。

6.2.3.2.2.13.4. 返回值

成功时返回 0,出错时返回 -1,并会设置 errno 变量以指示错误类型。通用错误代码请参考通用错误代码章节。


6.2.3.2.2.14. AUDIO_SET_MIXER

6.2.3.2.2.14.1. 概要

AUDIO_SET_MIXER
int ioctl(int fd, int request = AUDIO_SET_MIXER, audio_mixer_t *mix)

6.2.3.2.2.14.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

等于此命令的 AUDIO_SET_MIXER

audio_mixer_t *mix

混音器设置。

6.2.3.2.2.14.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用注意事项

此 ioctl 允许您调整音频解码器的混音器设置。

6.2.3.2.2.14.4. 返回值

成功时返回 0,出错时返回 -1,并会设置 errno 变量以指示错误类型。通用错误代码请参考通用错误代码章节。


6.2.3.2.2.15. AUDIO_SET_STREAMTYPE

6.2.3.2.2.15.1. 概要

AUDIO_SET_STREAMTYPE
int  ioctl(fd, int request = AUDIO_SET_STREAMTYPE, int type)

6.2.3.2.2.15.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

等于此命令的 AUDIO_SET_STREAMTYPE

int type

流类型。

6.2.3.2.2.15.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用注意事项

此 ioctl 告诉驱动程序要期望哪种音频流。如果流提供多个音频子流(如 LPCM 和 AC3),则此功能很有用。

使用 ITU-T H.222.0 | ISO/IEC 13818-1 中定义的流类型。

6.2.3.2.2.15.4. 返回值

成功时返回 0,出错时返回 -1,并会设置 errno 变量以指示错误类型。通用错误代码请参考通用错误代码章节。

EINVAL

类型不是有效或支持的流类型。


6.2.3.2.2.16. AUDIO_BILINGUAL_CHANNEL_SELECT

6.2.3.2.2.16.1. 概要

AUDIO_BILINGUAL_CHANNEL_SELECT
int ioctl(int fd, int request = AUDIO_BILINGUAL_CHANNEL_SELECT,
audio_channel_select_t)

6.2.3.2.2.16.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

等于此命令的 AUDIO_BILINGUAL_CHANNEL_SELECT

audio_channel_select_t ch

选择音频的输出格式(单声道左/右,立体声)。

6.2.3.2.2.16.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用注意事项

此 ioctl 已被 V4L2 V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK 控制取代,用于通过 V4L2 控制的 MPEG 解码器。

此 ioctl 调用请求音频设备在可能的情况下为双语流选择请求的通道。

6.2.3.2.2.16.4. 返回值

成功时返回 0,出错时返回 -1,并会设置 errno 变量以指示错误类型。通用错误代码请参考通用错误代码章节。


6.2.3.2.2.17. open()

6.2.3.2.2.17.1. 概要

#include <fcntl.h>
int open(const char *deviceName, int flags)

6.2.3.2.2.17.2. 参数

const char *deviceName

特定音频设备的名称。

int flags

以下标志的按位 OR

O_RDONLY

只读访问

O_RDWR

读/写访问

O_NONBLOCK

在非阻塞模式下打开
(阻塞模式为默认模式)

6.2.3.2.2.17.3. 描述

此系统调用打开指定的音频设备(例如,/dev/dvb/adapter0/audio0),以便后续使用。当 open() 调用成功时,该设备将准备好使用。阻塞或非阻塞模式的意义在存在差异的函数的文档中描述。它不影响 open() 调用本身的语义。在阻塞模式下打开的设备稍后可以使用 fcntl 系统调用的 F_SETFL 命令置于非阻塞模式(反之亦然)。这是一个标准的系统调用,记录在 Linux fcntl 手册页中。只有一个用户可以在 O_RDWR 模式下打开音频设备。所有其他尝试在此模式下打开设备的操作都将失败,并返回一个错误代码。如果音频设备以 O_RDONLY 模式打开,则唯一可以使用的 ioctl 调用是 AUDIO_GET_STATUS。所有其他调用都将返回一个错误代码。

6.2.3.2.2.17.4. 返回值

ENODEV

设备驱动程序未加载/不可用。

EBUSY

设备或资源忙。

EINVAL

无效参数。


6.2.3.2.2.18. close()

6.2.3.2.2.18.1. 概要

int close(int fd)

6.2.3.2.2.18.2. 参数

int fd

先前调用 open() 返回的文件描述符。

6.2.3.2.2.18.3. 描述

此系统调用关闭先前打开的音频设备。

6.2.3.2.2.18.4. 返回值

EBADF

Fd 不是有效的打开文件描述符。


6.2.3.2.2.19. write()

6.2.3.2.2.19.1. 概要

size_t write(int fd, const void *buf, size_t count)

6.2.3.2.2.19.2. 参数

int fd

先前调用 open() 返回的文件描述符。

void *buf

指向包含 PES 数据的缓冲区的指针。

size_t count

buf 的大小。

6.2.3.2.2.19.3. 描述

只有在ioctl调用AUDIO_SELECT_SOURCE中选择了AUDIO_SOURCE_MEMORY时,才能使用此系统调用。提供的数据应为PES格式。如果未指定O_NONBLOCK,则该函数将阻塞,直到有可用的缓冲区空间。要传输的数据量由count隐含。

6.2.3.2.2.19.4. 返回值

EPERM

未选择模式AUDIO_SOURCE_MEMORY

ENOMEM

尝试写入的数据量超过了内部缓冲区可以容纳的大小。

EBADF

Fd 不是有效的打开文件描述符。