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. 常量¶
|
选择解复用器(由前端或 DVR 设备馈送)作为视频流的源。 |
|
|
从通过 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. 常量¶
|
音频已停止。 |
|
音频正在播放。 |
|
音频已冻结。 |
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. 常量¶
|
立体声。 |
|
单声道,选择左立体声通道作为源。 |
|
单声道,选择右立体声通道作为源。 |
|
仅限单声道源。 |
|
立体声,交换 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. 变量¶
|
左声道音量。有效范围:0 ... 255 |
|
右声道音量。有效范围: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. 变量¶
|
显示 A/V 同步是否开启或关闭。 |
|
TRUE ( != 0 ) |
A/V 同步开启。 |
|
FALSE ( == 0 ) |
A/V 同步关闭。 |
|
|
指示音频是否静音。 |
|
TRUE ( != 0 ) |
静音音频 |
|
FALSE ( == 0 ) |
取消静音音频 |
|
audio_play_state_t |
当前播放状态。 |
|
audio_stream_source_t |
当前数据源。 |
|
|
DVB 子系统中是否启用或禁用当前音频流的解码。 |
|
TRUE ( != 0 ) |
禁用旁路。 |
|
FALSE ( == 0 ) |
启用旁路。 |
|
audio_mixer_t |
当前音量设置。 |
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. 常量¶
|
硬件接受 DTS 音频轨道。 |
|
|
硬件接受具有线性脉冲编码调制 (LPCM) 的未压缩音频 |
|
|
硬件接受 MPEG-1 音频 Layer 1。 |
|
|
硬件接受 MPEG-1 音频 Layer 2。也称为 MUSICAM。 |
|
|
硬件接受 MPEG-1 音频 Layer III。通常称为 .mp3。 |
|
|
硬件接受 AAC(高级音频编码)。 |
|
|
硬件接受 Vorbis 音频轨道。 |
|
|
硬件接受索尼动态数字声音 (SDDS)。 |
|
|
硬件接受杜比数字 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. 参数¶
|
先前调用 open() 返回的文件描述符。 |
|
|
对于此命令,等于 |
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. 参数¶
|
先前调用 open() 返回的文件描述符。 |
|
|
对于此命令,等于 |
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. 参数¶
|
先前调用 open() 返回的文件描述符。 |
|
|
对于此命令,等于 |
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. 参数¶
|
先前调用 open() 返回的文件描述符。 |
|
|
对于此命令,等于 |
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. 参数¶
|
先前调用 open() 返回的文件描述符。 |
|
|
对于此命令,等于 |
|
audio_stream_source_t |
指示将用于音频流的源。 |
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. 参数¶
|
先前调用 open() 返回的文件描述符。 |
|
|
对于此命令,等于 |
|
|
指示音频设备是否静音。 |
|
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. 参数¶
|
先前调用 open() 返回的文件描述符。 |
|
|
对于此命令,等于 |
|
|
告知 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. 参数¶
|
先前调用 open() 返回的文件描述符。 |
|
|
对于此命令,等于 |
|
|
在 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. 参数¶
|
先前调用 open() 返回的文件描述符。 |
|
|
对于此命令,等于 |
|
选择音频的输出格式(单声道左/右,立体声)。 |
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. 参数¶
|
先前调用 open() 返回的文件描述符。 |
|
|
对于此命令,等于 AUDIO_GET_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. 参数¶
|
先前调用 open() 返回的文件描述符。 |
|
|
对于此命令,等于 |
|
|
返回支持的声音格式的位数组。位在 音频编码中定义。 |
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. 参数¶
|
先前调用 open() 返回的文件描述符。 |
|
|
等于此命令的 |
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. 参数¶
|
先前调用 open() 返回的文件描述符。 |
|
|
等于此命令的 |
|
|
音频子流 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. 参数¶
|
先前调用 open() 返回的文件描述符。 |
|
|
等于此命令的 |
|
|
混音器设置。 |
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. 参数¶
|
先前调用 open() 返回的文件描述符。 |
|
|
等于此命令的 |
|
|
流类型。 |
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
变量以指示错误类型。通用错误代码请参考通用错误代码章节。
|
类型不是有效或支持的流类型。 |
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. 参数¶
|
先前调用 open() 返回的文件描述符。 |
|
|
等于此命令的 |
|
|
选择音频的输出格式(单声道左/右,立体声)。 |
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. 参数¶
|
特定音频设备的名称。 |
|
|
以下标志的按位 OR |
|
|
只读访问 |
|
|
读/写访问 |
|
|
在非阻塞模式下打开
(阻塞模式为默认模式)
|
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. 返回值¶
|
设备驱动程序未加载/不可用。 |
|
设备或资源忙。 |
|
无效参数。 |
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. 参数¶
|
先前调用 open() 返回的文件描述符。 |
6.2.3.2.2.18.3. 描述¶
此系统调用关闭先前打开的音频设备。
6.2.3.2.2.18.4. 返回值¶
|
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. 参数¶
|
先前调用 open() 返回的文件描述符。 |
|
|
指向包含 PES 数据的缓冲区的指针。 |
|
|
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. 返回值¶
|
未选择模式 |
|
|
尝试写入的数据量超过了内部缓冲区可以容纳的大小。 |
|
|
Fd 不是有效的打开文件描述符。 |