2.3. 屬性型別

調整到數字電視物理頻道並開始解碼需要更改一組引數,以便控制調諧器、解調器、線性低噪聲放大器 (LNA) 並透過衛星裝置控制 - SEC(在衛星系統上)設定天線子系統。實際引數特定於每個特定的數字電視標準,並且可能會隨著數字電視規範的發展而變化。

過去(直到 DVB API 版本 3 - DVBv3),使用的策略是擁有一個包含調諧 DVB-S、DVB-C、DVB-T 和 ATSC 傳輸系統所需引數的聯合體。問題是,隨著第二代標準的出現,此類聯合體的大小不足以容納這些新標準所需的結構體。此外,擴充套件它會破壞使用者空間。

因此,不建議使用基於舊聯合體/結構體的方法,而推薦使用屬性集方法。在這種方法中,FE_GET_PROPERTY 和 FE_SET_PROPERTY用於設定前端並讀取其狀態。

實際操作由一組 dtv_property cmd/data 對確定。透過一個 ioctl,可以獲取/設定最多 64 個屬性。

本節介紹設定前端的新推薦方法,它支援所有數字電視傳輸系統。

注意

  1. 在 Linux DVB API 版本 3 中,透過結構體 dvb_frontend_parameters完成前端設定。

  2. 請勿在支援較新標準的硬體上使用 DVB API 版本 3 呼叫。此類 API 不提供或僅提供非常有限的對新標準和/或新硬體的支援。

  3. 如今,大多數前端都支援多種傳輸系統。只有透過 DVB API 版本 5 呼叫才能在前端支援的多種傳輸系統之間切換。

  4. DVB API 版本 5 也稱為 *S2API*,因為新增到它的第一個新標準是 DVB-S2。

示例:為了將硬體設定為調諧到 651 kHz 的 DVB-C 頻道,以 256-QAM 調製,FEC 3/4 和 5.217 Mbauds 的符號率,應將這些屬性發送到 FE_SET_PROPERTY ioctl

DTV_DELIVERY_SYSTEM = SYS_DVBC_ANNEX_A

DTV_FREQUENCY = 651000000

DTV_MODULATION = QAM_256

DTV_INVERSION = INVERSION_AUTO

DTV_SYMBOL_RATE = 5217000

DTV_INNER_FEC = FEC_3_4

DTV_TUNE

執行上述操作的程式碼在 示例:設定數字電視前端屬性中顯示。

示例:設定數字電視前端屬性
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/dvb/frontend.h>

static struct dtv_property props[] = {
    { .cmd = DTV_DELIVERY_SYSTEM, .u.data = SYS_DVBC_ANNEX_A },
    { .cmd = DTV_FREQUENCY,       .u.data = 651000000 },
    { .cmd = DTV_MODULATION,      .u.data = QAM_256 },
    { .cmd = DTV_INVERSION,       .u.data = INVERSION_AUTO },
    { .cmd = DTV_SYMBOL_RATE,     .u.data = 5217000 },
    { .cmd = DTV_INNER_FEC,       .u.data = FEC_3_4 },
    { .cmd = DTV_TUNE }
};

static struct dtv_properties dtv_prop = {
    .num = 6, .props = props
};

int main(void)
{
    int fd = open("/dev/dvb/adapter0/frontend0", O_RDWR);

    if (!fd) {
        perror ("open");
        return -1;
    }
    if (ioctl(fd, FE_SET_PROPERTY, &dtv_prop) == -1) {
        perror("ioctl");
        return -1;
    }
    printf("Frontend set\\n");
    return 0;
}

注意

雖然可以直接呼叫像上面示例那樣的核心程式碼,但強烈建議使用 libdvbv5,因為它提供了與支援的數字電視標準一起工作的抽象,並提供了用於諸如程式掃描和讀取/寫入頻道描述符檔案等常用操作的方法。