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 個屬性。
本節介紹設定前端的新推薦方法,它支援所有數字電視傳輸系統。
注意
在 Linux DVB API 版本 3 中,透過結構體
dvb_frontend_parameters完成前端設定。請勿在支援較新標準的硬體上使用 DVB API 版本 3 呼叫。此類 API 不提供或僅提供非常有限的對新標準和/或新硬體的支援。
如今,大多數前端都支援多種傳輸系統。只有透過 DVB API 版本 5 呼叫才能在前端支援的多種傳輸系統之間切換。
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
執行上述操作的程式碼在 示例:設定數字電視前端屬性中顯示。
#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,因為它提供了與支援的數字電視標準一起工作的抽象,並提供了用於諸如程式掃描和讀取/寫入頻道描述符檔案等常用操作的方法。