blob: 8c6b9d824b7edabe63b8b3e00bdae66ba5674cf8 [file] [log] [blame]
Gong Ked869dd72020-07-20 09:00:25 +08001#include <stddef.h>
2#include <stdlib.h>
3#include <string.h>
4#include <errno.h>
5#include <sys/types.h>
6#include <sys/stat.h>
7#include <unistd.h>
Chuanzhi Wang670fc042020-08-12 11:11:04 +08008#include <fcntl.h>
Gong Ked869dd72020-07-20 09:00:25 +08009#include <assert.h>
10
11#include "dvr_types.h"
12#include "dvb_utils.h"
13#include "dvr_utils.h"
14
Chuanzhi Wang670fc042020-08-12 11:11:04 +080015#include <dmx.h>
16
Gong Ked869dd72020-07-20 09:00:25 +080017/**
18 * Set the demux's input source.
19 * \param dmx_idx Demux device's index.
20 * \param src The demux's input source.
21 * \retval 0 On success.
22 * \retval -1 On error.
23 */
24int dvb_set_demux_source (int dmx_idx, DVB_DemuxSource_t src)
25{
26 char node[32];
27 struct stat st;
28 int r;
29
30 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", dmx_idx);
31
Chuanzhi Wang670fc042020-08-12 11:11:04 +080032 r = stat(node, &st);
33 if (r == -1) {
34 int fd, source;
35 memset(node, 0, sizeof(node));
36 snprintf(node, sizeof(node), "/dev/dvb0.demux%d", dmx_idx);
37 fd = open(node, O_WRONLY);
38 if (fd != -1) {
39 switch (src) {
40 case DVB_DEMUX_SOURCE_TS0:
41 source = FRONTEND_TS0;
42 break;
43 case DVB_DEMUX_SOURCE_TS1:
44 source = FRONTEND_TS1;
45 break;
46 case DVB_DEMUX_SOURCE_TS2:
47 source = FRONTEND_TS2;
48 break;
49 case DVB_DEMUX_SOURCE_TS3:
50 source = FRONTEND_TS3;
51 break;
52 case DVB_DEMUX_SOURCE_TS4:
53 source = FRONTEND_TS4;
54 break;
55 case DVB_DEMUX_SOURCE_TS5:
56 source = FRONTEND_TS5;
57 break;
58 case DVB_DEMUX_SOURCE_TS6:
59 source = FRONTEND_TS6;
60 break;
61 case DVB_DEMUX_SOURCE_TS7:
62 source = FRONTEND_TS7;
63 break;
64 case DVB_DEMUX_SOURCE_DMA0:
65 source = DMA_0;
66 break;
67 case DVB_DEMUX_SOURCE_DMA1:
68 source = DMA_1;
69 break;
70 case DVB_DEMUX_SOURCE_DMA2:
71 source = DMA_2;
72 break;
73 case DVB_DEMUX_SOURCE_DMA3:
74 source = DMA_3;
75 break;
76 case DVB_DEMUX_SOURCE_DMA4:
77 source = DMA_4;
78 break;
79 case DVB_DEMUX_SOURCE_DMA5:
80 source = DMA_5;
81 break;
82 case DVB_DEMUX_SOURCE_DMA6:
83 source = DMA_6;
84 break;
85 case DVB_DEMUX_SOURCE_DMA7:
86 source = DMA_7;
87 break;
88 default:
89 assert(0);
90 }
91 if (ioctl(fd, DMX_SET_HW_SOURCE, &source) == -1) {
92 DVR_DEBUG(1, "ioctl DMX_SET_HW_SOURCE:%d error:%d", source, errno);
93 }
94 close(fd);
95 }else {
96 DVR_DEBUG(1, "open \"%s\" failed, error:%d", node, errno);
97 }
Gong Ked869dd72020-07-20 09:00:25 +080098 } else {
99 char *val;
100
101 switch (src) {
102 case DVB_DEMUX_SOURCE_TS0:
103 val = "ts0";
104 break;
105 case DVB_DEMUX_SOURCE_TS1:
106 val = "ts1";
107 break;
108 case DVB_DEMUX_SOURCE_TS2:
109 val = "ts2";
110 break;
111 case DVB_DEMUX_SOURCE_DMA0:
112 val = "hiu";
113 break;
114 default:
115 assert(0);
116 }
117
118 r = dvr_file_echo(node, val);
119 }
120
121 return r;
122}
123
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800124/**
125 * Get the demux's input source.
126 * \param dmx_idx Demux device's index.
127 * \param point src that demux's input source.
128 * \retval 0 On success.
129 * \retval -1 On error.
130 */
131int dvb_get_demux_source (int dmx_idx, DVB_DemuxSource_t *src)
132{
133 char node[32] = {0};
134 char buf[32] = {0};
135 struct stat st;
136 int r, source_no;
137
138 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", dmx_idx);
139 r = stat(node, &st);
140 if (r == -1) {
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800141 int fd, source;
142 memset(node, 0, sizeof(node));
143 snprintf(node, sizeof(node), "/dev/dvb0.demux%d", dmx_idx);
144 fd = open(node, O_RDONLY);
145 if (fd != -1) {
146 if (ioctl(fd, DMX_GET_HW_SOURCE, &source) != -1) {
147 switch (source) {
148 case FRONTEND_TS0:
149 *src = DVB_DEMUX_SOURCE_TS0;
150 break;
151 case FRONTEND_TS1:
152 *src = DVB_DEMUX_SOURCE_TS1;
153 break;
154 case FRONTEND_TS2:
155 *src = DVB_DEMUX_SOURCE_TS2;
156 break;
157 case FRONTEND_TS3:
158 *src = DVB_DEMUX_SOURCE_TS3;
159 break;
160 case FRONTEND_TS4:
161 *src = DVB_DEMUX_SOURCE_TS4;
162 break;
163 case FRONTEND_TS5:
164 *src = DVB_DEMUX_SOURCE_TS5;
165 break;
166 case FRONTEND_TS6:
167 *src = DVB_DEMUX_SOURCE_TS6;
168 break;
169 case FRONTEND_TS7:
170 *src = DVB_DEMUX_SOURCE_TS7;
171 break;
172 case DMA_0:
173 *src = DVB_DEMUX_SOURCE_DMA0;
174 break;
175 case DMA_1:
176 *src = DVB_DEMUX_SOURCE_DMA1;
177 break;
178 case DMA_2:
179 *src = DVB_DEMUX_SOURCE_DMA2;
180 break;
181 case DMA_3:
182 *src = DVB_DEMUX_SOURCE_DMA3;
183 break;
184 case DMA_4:
185 *src = DVB_DEMUX_SOURCE_DMA4;
186 break;
187 case DMA_5:
188 *src = DVB_DEMUX_SOURCE_DMA5;
189 break;
190 case DMA_6:
191 *src = DVB_DEMUX_SOURCE_DMA6;
192 break;
193 case DMA_7:
194 *src = DVB_DEMUX_SOURCE_DMA7;
195 break;
196 default:
197 assert(0);
198 }
199 }else {
200 DVR_DEBUG(1, "ioctl DMX_GET_HW_SOURCE:%d error:%d", source, errno);
201 }
202 }else {
203 DVR_DEBUG(1, "open \"%s\" failed, error:%d", node, errno);
204 }
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800205 } else {
206 r = dvr_file_read(node, buf, sizeof(buf));
207 if (r != -1) {
208 if (strncmp(buf, "ts", 2) == 0 && strlen(buf) == 3) {
209 sscanf(buf, "ts%d", &source_no);
210 switch (source_no)
211 {
212 case 0:
213 *src = DVB_DEMUX_SOURCE_TS0;
214 break;
215 case 1:
216 *src = DVB_DEMUX_SOURCE_TS1;
217 break;
218 case 2:
219 *src = DVB_DEMUX_SOURCE_TS2;
220 break;
221 default:
222 DVR_DEBUG(1, "do not support demux source:%s", buf);
223 r = -1;
224 break;
225 }
226 }else if (strncmp(buf, "hiu", 3) == 0) {
227 *src = DVB_DEMUX_SOURCE_DMA0;
228 }else {
229 r = -1;
230 }
231 DVR_DEBUG(1, "dvb_get_demux_source \"%s\" :%s", node, buf);
232 }
233 }
234
235 return r;
236}