blob: f36d76ebd6773ea32254a0050759f6c28cdfb9d8 [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 */
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080024int dvb_set_demux_source(int dmx_idx, DVB_DemuxSource_t src)
Gong Ked869dd72020-07-20 09:00:25 +080025{
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080026 char node[32];
27 struct stat st;
28 int r;
Gong Ked869dd72020-07-20 09:00:25 +080029
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080030 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", dmx_idx);
Gong Ked869dd72020-07-20 09:00:25 +080031
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080032 r = stat(node, &st);
33 if (r == -1)
34 {
35 int fd, source;
36 memset(node, 0, sizeof(node));
37 snprintf(node, sizeof(node), "/dev/dvb0.demux%d", dmx_idx);
38 fd = open(node, O_WRONLY);
39 if (fd != -1)
40 {
41 switch (src)
42 {
43 case DVB_DEMUX_SOURCE_TS0:
44 source = FRONTEND_TS0;
45 break;
46 case DVB_DEMUX_SOURCE_TS1:
47 source = FRONTEND_TS1;
48 break;
49 case DVB_DEMUX_SOURCE_TS2:
50 source = FRONTEND_TS2;
51 break;
52 case DVB_DEMUX_SOURCE_TS3:
53 source = FRONTEND_TS3;
54 break;
55 case DVB_DEMUX_SOURCE_TS4:
56 source = FRONTEND_TS4;
57 break;
58 case DVB_DEMUX_SOURCE_TS5:
59 source = FRONTEND_TS5;
60 break;
61 case DVB_DEMUX_SOURCE_TS6:
62 source = FRONTEND_TS6;
63 break;
64 case DVB_DEMUX_SOURCE_TS7:
65 source = FRONTEND_TS7;
66 break;
67 case DVB_DEMUX_SOURCE_DMA0:
68 source = DMA_0;
69 break;
70 case DVB_DEMUX_SOURCE_DMA1:
71 source = DMA_1;
72 break;
73 case DVB_DEMUX_SOURCE_DMA2:
74 source = DMA_2;
75 break;
76 case DVB_DEMUX_SOURCE_DMA3:
77 source = DMA_3;
78 break;
79 case DVB_DEMUX_SOURCE_DMA4:
80 source = DMA_4;
81 break;
82 case DVB_DEMUX_SOURCE_DMA5:
83 source = DMA_5;
84 break;
85 case DVB_DEMUX_SOURCE_DMA6:
86 source = DMA_6;
87 break;
88 case DVB_DEMUX_SOURCE_DMA7:
89 source = DMA_7;
90 break;
91 default:
Chuanzhi Wang670fc042020-08-12 11:11:04 +080092 assert(0);
93 }
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080094 if (ioctl(fd, DMX_SET_HW_SOURCE, &source) == -1)
95 {
Chuanzhi Wang670fc042020-08-12 11:11:04 +080096 DVR_DEBUG(1, "ioctl DMX_SET_HW_SOURCE:%d error:%d", source, errno);
97 }
98 close(fd);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +080099 }
100 else
101 {
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800102 DVR_DEBUG(1, "open \"%s\" failed, error:%d", node, errno);
103 }
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800104 }
105 else
106 {
107 char *val;
Gong Ked869dd72020-07-20 09:00:25 +0800108
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800109 switch (src)
110 {
111 case DVB_DEMUX_SOURCE_TS0:
112 val = "ts0";
113 break;
114 case DVB_DEMUX_SOURCE_TS1:
115 val = "ts1";
116 break;
117 case DVB_DEMUX_SOURCE_TS2:
118 val = "ts2";
119 break;
120 case DVB_DEMUX_SOURCE_DMA0:
121 val = "hiu";
122 break;
123 default:
124 assert(0);
125 }
Gong Ked869dd72020-07-20 09:00:25 +0800126
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800127 r = dvr_file_echo(node, val);
128 }
Gong Ked869dd72020-07-20 09:00:25 +0800129
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800130 return r;
Gong Ked869dd72020-07-20 09:00:25 +0800131}
132
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800133/**
134 * Get the demux's input source.
135 * \param dmx_idx Demux device's index.
136 * \param point src that demux's input source.
137 * \retval 0 On success.
138 * \retval -1 On error.
139 */
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800140int dvb_get_demux_source(int dmx_idx, DVB_DemuxSource_t *src)
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800141{
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800142 char node[32] = {0};
143 char buf[32] = {0};
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800144 struct stat st;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800145 int r, source_no;
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800146
147 snprintf(node, sizeof(node), "/sys/class/stb/demux%d_source", dmx_idx);
148 r = stat(node, &st);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800149 if (r == -1)
150 {
Chuanzhi Wang670fc042020-08-12 11:11:04 +0800151 int fd, source;
152 memset(node, 0, sizeof(node));
153 snprintf(node, sizeof(node), "/dev/dvb0.demux%d", dmx_idx);
154 fd = open(node, O_RDONLY);
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800155 if (fd != -1)
156 {
157 if (ioctl(fd, DMX_GET_HW_SOURCE, &source) != -1)
158 {
159 switch (source)
160 {
161 case FRONTEND_TS0:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800162 *src = DVB_DEMUX_SOURCE_TS0;
163 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800164 case FRONTEND_TS1:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800165 *src = DVB_DEMUX_SOURCE_TS1;
166 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800167 case FRONTEND_TS2:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800168 *src = DVB_DEMUX_SOURCE_TS2;
169 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800170 case FRONTEND_TS3:
171 *src = DVB_DEMUX_SOURCE_TS3;
172 break;
173 case FRONTEND_TS4:
174 *src = DVB_DEMUX_SOURCE_TS4;
175 break;
176 case FRONTEND_TS5:
177 *src = DVB_DEMUX_SOURCE_TS5;
178 break;
179 case FRONTEND_TS6:
180 *src = DVB_DEMUX_SOURCE_TS6;
181 break;
182 case FRONTEND_TS7:
183 *src = DVB_DEMUX_SOURCE_TS7;
184 break;
185 case DMA_0:
186 *src = DVB_DEMUX_SOURCE_DMA0;
187 break;
188 case DMA_1:
189 *src = DVB_DEMUX_SOURCE_DMA1;
190 break;
191 case DMA_2:
192 *src = DVB_DEMUX_SOURCE_DMA2;
193 break;
194 case DMA_3:
195 *src = DVB_DEMUX_SOURCE_DMA3;
196 break;
197 case DMA_4:
198 *src = DVB_DEMUX_SOURCE_DMA4;
199 break;
200 case DMA_5:
201 *src = DVB_DEMUX_SOURCE_DMA5;
202 break;
203 case DMA_6:
204 *src = DVB_DEMUX_SOURCE_DMA6;
205 break;
206 case DMA_7:
207 *src = DVB_DEMUX_SOURCE_DMA7;
208 break;
209 default:
210 assert(0);
211 }
212 }
213 else
214 {
215 DVR_DEBUG(1, "ioctl DMX_GET_HW_SOURCE:%d error:%d", source, errno);
216 }
217 close(fd);
218 }
219 else
220 {
221 DVR_DEBUG(1, "open \"%s\" failed, error:%d", node, errno);
222 }
223 }
224 else
225 {
226 r = dvr_file_read(node, buf, sizeof(buf));
227 if (r != -1)
228 {
229 if (strncmp(buf, "ts", 2) == 0 && strlen(buf) == 3)
230 {
231 sscanf(buf, "ts%d", &source_no);
232 switch (source_no)
233 {
234 case 0:
235 *src = DVB_DEMUX_SOURCE_TS0;
236 break;
237 case 1:
238 *src = DVB_DEMUX_SOURCE_TS1;
239 break;
240 case 2:
241 *src = DVB_DEMUX_SOURCE_TS2;
242 break;
243 default:
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800244 DVR_DEBUG(1, "do not support demux source:%s", buf);
245 r = -1;
246 break;
Chuanzhi Wangaacfd752020-08-24 16:07:27 +0800247 }
248 }
249 else if (strncmp(buf, "hiu", 3) == 0)
250 {
251 *src = DVB_DEMUX_SOURCE_DMA0;
252 }
253 else
254 {
255 r = -1;
256 }
257 DVR_DEBUG(1, "dvb_get_demux_source \"%s\" :%s", node, buf);
258 }
Chuanzhi Wang41bc0672020-07-29 15:58:56 +0800259 }
260
261 return r;
262}