7.35. ioctl VIDIOC_G_MODULATOR, VIDIOC_S_MODULATOR

7.35.1. 名称

VIDIOC_G_MODULATOR - VIDIOC_S_MODULATOR - 获取或设置调制器属性

7.35.2. 概要

VIDIOC_G_MODULATOR

int ioctl(int fd, VIDIOC_G_MODULATOR, struct v4l2_modulator *argp)

VIDIOC_S_MODULATOR

int ioctl(int fd, VIDIOC_S_MODULATOR, const struct v4l2_modulator *argp)

7.35.3. 参数

fd

open() 返回的文件描述符。

argp

指向 struct v4l2_modulator 的指针。

7.35.4. 描述

要查询调制器的属性,应用程序初始化 index 字段并将 struct v4l2_modulatorreserved 数组清零,并使用指向此结构的指针调用 VIDIOC_G_MODULATOR ioctl。 当索引超出范围时,驱动程序会填充结构的其余部分或返回 EINVAL 错误代码。 要枚举所有调制器,应用程序应从索引零开始,每次递增 1,直到驱动程序返回 EINVAL。

调制器具有两个可写属性,一个是音频调制集,另一个是无线电频率。 要更改调制的音频子程序,应用程序初始化 indextxsubchans 字段以及 reserved 数组,并调用 VIDIOC_S_MODULATOR ioctl。 如果无法满足请求,驱动程序可能会选择不同的音频调制。 但是,这是一个只写 ioctl,它不会返回实际选择的音频调制。

SDR 特定调制器类型是 V4L2_TUNER_SDRV4L2_TUNER_RF。 对于 SDR 设备,txsubchans 字段必须初始化为零。 在这种情况下,“调制器”一词表示 SDR 发射器。

要更改无线电频率,可以使用 VIDIOC_S_FREQUENCY ioctl。

type v4l2_modulator
struct v4l2_modulator

__u32

index

标识调制器,由应用程序设置。

__u8

name[32]

调制器的名称,一个以 NUL 结尾的 ASCII 字符串。

此信息供用户使用。

__u32

capability

调制器功能标志。 未为此字段定义标志,因此相应地使用 struct v4l2_tuner 中的调谐器标志。 音频标志指示编码音频子节目的能力。 它们不会因当前视频标准而改变。

__u32

rangelow

最低可调频率,单位为 62.5 KHz;如果设置了 capability 标志 V4L2_TUNER_CAP_LOW,则单位为 62.5 Hz;如果设置了 capability 标志 V4L2_TUNER_CAP_1HZ,则单位为 1 Hz。

__u32

rangehigh

最高可调频率,单位为 62.5 KHz;如果设置了 capability 标志 V4L2_TUNER_CAP_LOW,则单位为 62.5 Hz;如果设置了 capability 标志 V4L2_TUNER_CAP_1HZ,则单位为 1 Hz。

__u32

txsubchans

通过此字段,应用程序可以确定音频子载波的调制方式。 它包含一组标志,如 调制器音频传输标志 中所定义。

注意

重用了调谐器 rxsubchans 标志,但语义不同。 假定视频输出设备具有带有 1-3 个通道的模拟或 PCM 音频输入。txsubchans 标志选择一个或多个通道进行调制,以及一些音频子节目指示器,例如,立体声引导音。

__u32

type

调制器的类型,请参阅 v4l2_tuner_type

__u32

reserved[3]

保留供将来扩展。

驱动程序和应用程序必须将数组设置为零。

调制器音频传输标志

V4L2_TUNER_SUB_MONO

0x0001

将通道 1 调制为单声道音频;当输入具有多个通道时,将通道 1 和 2 混音。 此标志不与 V4L2_TUNER_SUB_STEREOV4L2_TUNER_SUB_LANG1 组合。

V4L2_TUNER_SUB_STEREO

0x0002

将通道 1 和 2 调制为立体声音频信号的左右声道。 当输入只有一个通道或两个通道并且还设置了 V4L2_TUNER_SUB_SAP 时,通道 1 被编码为左右声道。 此标志不与 V4L2_TUNER_SUB_MONOV4L2_TUNER_SUB_LANG1 组合。 当驱动程序不支持立体声音频时,应回退到单声道。

V4L2_TUNER_SUB_LANG1

0x0008

将通道 1 和 2 调制为双语音频信号的主要语言和辅助语言。 当输入只有一个通道时,它用于两种语言。 无法仅编码主要语言或辅助语言。 此标志不与 V4L2_TUNER_SUB_MONOV4L2_TUNER_SUB_STEREOV4L2_TUNER_SUB_SAP 组合。 如果硬件不支持相应的音频矩阵,或者当前视频标准不允许双语音频,则 VIDIOC_S_MODULATOR ioctl 应返回 EINVAL 错误代码,并且驱动程序应回退到单声道或立体声模式。

V4L2_TUNER_SUB_LANG2

0x0004

V4L2_TUNER_SUB_SAP 效果相同。

V4L2_TUNER_SUB_SAP

0x0004

当与 V4L2_TUNER_SUB_MONO 组合时,第一个通道被编码为单声道音频,最后一个通道被编码为第二音频节目。 当输入只有一个通道时,它用于两个音轨。 当输入有三个通道时,单声道音轨是通道 1 和 2 的混音。 当与 V4L2_TUNER_SUB_STEREO 组合时,通道 1 和 2 被编码为左右立体声音频,通道 3 被编码为第二音频节目。 当输入只有两个通道时,第一个通道被编码为左右声道,第二个通道被编码为 SAP。 当输入只有一个通道时,它用于所有音轨。 无法仅编码第二音频节目。 此标志必须与 V4L2_TUNER_SUB_MONOV4L2_TUNER_SUB_STEREO 组合。 如果硬件不支持相应的音频矩阵,或者当前视频标准不允许 SAP,则 VIDIOC_S_MODULATOR ioctl 应返回 EINVAL 错误代码,并且驱动程序应回退到单声道或立体声模式。

V4L2_TUNER_SUB_RDS

0x0010

为无线电 FM 发射器启用 RDS 编码器。

7.35.5. 返回值

成功时返回 0,出错时返回 -1,并适当设置 errno 变量。 通用错误代码在 通用错误代码 章节中描述。

EINVAL

struct v4l2_modulator index 超出范围。