6.2.3.2. DVB音频设备

注意

不要在新驱动程序中使用!请参阅:通用说明

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

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

V4L2也使用这些ioctl来控制在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同步是ON还是OFF。

TRUE(!= 0)

AV同步ON。

FALSE(== 0)

AV同步OFF。

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音频层1。

AUDIO_CAP_MP2

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

AUDIO_CAP_MP3

硬件接受MPEG-1音频层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,则通过write命令将数据馈送到音频设备。如果选择了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 ioctl VIDIOC_DECODER_CMD, VIDIOC_TRY_DECODER_CMD,并使用V4L2_DEC_CMD_START_MUTE_AUDIO标志代替。

此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)

AV同步ON。

FALSE(== 0)

AV同步OFF。

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系统无法处理的流,则应使用此模式。如果硬件可以处理,Dolby DigitalTM流将自动由DVB子系统转发。

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,ID必须在[0x80,0x87]范围内,对于LPCM,ID必须在[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

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


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命令将以阻塞模式打开的设备稍后置于非阻塞模式(反之亦然)。这是一个标准系统调用,记录在fcntl的Linux手册页中。只有一个用户可以在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不是有效的打开文件描述符。