1 diff --git a/usbtunerhelper.c b/usbtunerhelper.c
2 index 77b8728..7906f9b 100644
5 @@ -94,7 +94,7 @@ struct vtuner_adapter
7 struct vtuner_adapter adapters[MAX_ADAPTERS];
10 +int available_vtuner = 0;
13 void sigint_handler(int sig)
14 @@ -166,31 +166,6 @@ int scan_adapters()
18 - dirvtun = opendir(VTUNER_PATH);
21 - while ((edirvtun = readdir(dirvtun)) != NULL)
23 - if (strlen(edirvtun->d_name) < 7) continue;
24 - if (!strncmp(edirvtun->d_name, "vtuner", 6)) vtunercount++;
30 - for (i = 0; i < adaptercount; i++)
32 - if (i < vtunercount)
34 - adapters[i].vtunerindex = i;
35 - printf("usb device %s (adapter%d) assigned to vtuner%d\n", adapters[i].name, adapters[i].index, i);
39 - adapters[i].vtunerindex = -1;
40 - printf("usb device %s (adapter%d) not assigned\n", adapters[i].name, adapters[i].index);
46 @@ -448,25 +423,112 @@ error:
50 +int get_avail_vtuner()
52 + int total_vtuner = 0;
53 + int reserved_vtuner = 0;
56 + const char* conf = "/etc/vtuner.conf";
62 + sprintf(filename, "/dev/misc/vtuner%d", total_vtuner);
63 + if (access(filename, F_OK) < 0 ) break;
67 + /* reserved vtuner */
68 + fp = fopen(conf, "rt");
72 + const char *vtuner_type = "vtuner_type:";
73 + const char *usb_tuner = "usb_tuner";
77 + if (!fgets(line, sizeof(line), fp))
80 + char *p = strstr(line, vtuner_type);
83 + p += strlen(vtuner_type);
84 + if (strncmp(p, usb_tuner, strlen(usb_tuner)))
92 + return total_vtuner - reserved_vtuner;
95 +int get_vtuner(int id)
101 + struct vtuner_adapter *adapter = &adapters[id];
103 + adapter->vtuner = -1;
104 + adapter->vtunerindex = -1;
106 + if (!available_vtuner)
109 + while (vtuner_fd < 0)
111 + sprintf(filename, "/dev/misc/vtuner%d", vtuner_idx);
112 + if (access(filename, F_OK) < 0) break;
114 + printf("open vtuner %s\n", filename);
115 + vtuner_fd = open(filename, O_RDWR);
126 + adapter->vtuner = vtuner_fd;
127 + adapter->vtunerindex = vtuner_idx;
128 + available_vtuner--;
133 int init_adapter(int id)
136 struct dmx_pes_filter_params filter;
137 struct dvb_frontend_info fe_info;
138 - char frontend_filename[256], demux_filename[256], vtuner_filename[256];
139 + char frontend_filename[256], demux_filename[256];
141 struct vtuner_adapter *adapter = &adapters[id];
143 adapter->eventthread = 0;
144 adapter->pumpthread = 0;
148 + if (adapter->vtunerindex == -1)
151 printf("linking adapter%d/frontend0 to vtuner%d\n", adapter->index, adapter->vtunerindex);
153 sprintf(frontend_filename, "/dev/dvb/adapter%d/frontend0", adapter->index);
154 sprintf(demux_filename, "/dev/dvb/adapter%d/demux0", adapter->index);
155 - sprintf(vtuner_filename, "/dev/misc/vtuner%d", adapter->vtunerindex);
157 - adapter->frontend = adapter->demux = adapter->vtuner = -1;
158 + adapter->frontend = adapter->demux = -1;
160 adapter->frontend = open(frontend_filename, O_RDWR);
161 if (adapter->frontend < 0)
162 @@ -482,13 +544,6 @@ int init_adapter(int id)
166 - adapter->vtuner = open(vtuner_filename, O_RDWR);
167 - if (adapter->vtuner < 0)
169 - perror(vtuner_filename);
173 if (ioctl(adapter->frontend, FE_GET_INFO, &fe_info) < 0)
175 perror("FE_GET_INFO");
176 @@ -635,9 +690,11 @@ int main(int argc, char *argv[])
177 sleep(scan_inverval);
180 + available_vtuner = get_avail_vtuner();
182 for (i = 0; i < adaptercount; i++)
184 - if (adapters[i].vtunerindex >= 0) init_adapter(i);
188 for (i = 0; i < adaptercount; i++)