diff --git a/patches/minisatip-axe.patch b/patches/minisatip-axe.patch index bcff8c7c..586a8a5e 100644 --- a/patches/minisatip-axe.patch +++ b/patches/minisatip-axe.patch @@ -1,5 +1,5 @@ diff --git a/adapter.c b/adapter.c -index 285faea..da18c74 100755 +index 285faea..97cb45d 100755 --- a/adapter.c +++ b/adapter.c @@ -29,10 +29,15 @@ @@ -246,7 +246,7 @@ index 285faea..da18c74 100755 char buf[100], *arg[20], *sep1, *sep2; strncpy(buf, o, sizeof(buf)); -@@ -839,17 +920,47 @@ void set_unicable_adapters(char *o, int type) +@@ -839,17 +920,67 @@ void set_unicable_adapters(char *o, int type) sep2 = strchr(arg[i], '-'); if( !sep1 || !sep2) continue; @@ -291,11 +291,31 @@ index 285faea..da18c74 100755 + a[b_id].slave = a_id + 1; + LOG("Setting adapter %d as master for adapter %d", a_id, b_id); + } ++} ++ ++void set_unicable_input(char *o) ++{ ++ int i, la, input, input2; ++ char buf[100], *arg[20], *sep1; ++ ++ strncpy(buf, o, sizeof(buf)-1); ++ buf[sizeof(buf)-1] = '\0'; ++ la = split(arg, buf, sizeof(arg), ','); ++ for (i=input=0; i < 4; i++) ++ { ++ if (i < la) { ++ input2=map_intd(arg[i], NULL, -1); ++ if (input2 >= 0 && input2 < 4) ++ input = input2; ++ } ++ opts.axe_unicinp[i] = input; ++ LOG("Setting input %d for unicable adapter %d", input, i); ++ } +} int delsys_match(adapter *ad, int del_sys) { -@@ -866,3 +977,71 @@ int delsys_match(adapter *ad, int del_sys) +@@ -866,3 +997,71 @@ int delsys_match(adapter *ad, int del_sys) return 0; } @@ -368,7 +388,7 @@ index 285faea..da18c74 100755 +} +#endif diff --git a/adapter.h b/adapter.h -index 629bd9c..d95e59a 100755 +index 629bd9c..2b435fb 100755 --- a/adapter.h +++ b/adapter.h @@ -45,6 +45,7 @@ typedef struct struct_adapter @@ -379,14 +399,16 @@ index 629bd9c..d95e59a 100755 } adapter; int init_hw (); -@@ -65,6 +66,7 @@ void dump_pids (int aid); +@@ -65,7 +66,8 @@ void dump_pids (int aid); void sort_pids (int aid); void enable_adapters(char *o); void set_unicable_adapters(char *o, int type); +- +void set_link_adapters(char *o); - ++void set_unicable_input(char *o); int delsys_match(adapter *ad, int del_sys); + #define get_adapter(a) get_adapter1(a, __FILE__, __LINE__) diff --git a/axe.h b/axe.h new file mode 100644 index 0000000..cfc1927 @@ -543,7 +565,7 @@ index 0000000..cfc1927 + +#endif diff --git a/dvb.c b/dvb.c -index 5701bd2..32fd683 100755 +index 5701bd2..d143387 100755 --- a/dvb.c +++ b/dvb.c @@ -41,6 +41,10 @@ @@ -662,7 +684,7 @@ index 5701bd2..32fd683 100755 if (freq < SLOF) { freq = (freq - LOF1); -@@ -330,12 +371,100 @@ int setup_switch (int frontend_fd, transponder *tp) +@@ -330,12 +371,108 @@ int setup_switch (int frontend_fd, transponder *tp) hiband = 1; } @@ -721,6 +743,14 @@ index 5701bd2..32fd683 100755 + } + } + if (ad && opts.quattro) { ++ if (opts.quattro_hiband == 1 && hiband) { ++ LOG("axe_fe: hiband is not allowed for quattro config (adapter %d)", input); ++ return 0; ++ } ++ if (opts.quattro_hiband == 2 && !hiband) { ++ LOG("axe_fe: lowband is not allowed for quattro config (adapter %d)", input); ++ return 0; ++ } + input = ((hiband ^ 1) << 1) | (pol ^ 1); + adm = get_adapter(input); + if (adm == NULL) { @@ -735,7 +765,7 @@ index 5701bd2..32fd683 100755 + } + } + } else { -+ input = opts.axe_unicinp; ++ input = opts.axe_unicinp[input & 3]; + ad = get_adapter(input); + if (ad == NULL) { + LOGL(3, "axe setup: unable to find adapter %d", input); @@ -763,7 +793,7 @@ index 5701bd2..32fd683 100755 }else { if(tp->old_pol != pol || tp->old_hiband != hiband || tp->old_diseqc != diseqc) -@@ -343,6 +472,16 @@ int setup_switch (int frontend_fd, transponder *tp) +@@ -343,6 +480,16 @@ int setup_switch (int frontend_fd, transponder *tp) else LOGL(3, "Skip sending diseqc commands since the switch position doesn't need to be changed: pol %d, hiband %d, switch position %d", pol, hiband, diseqc); } @@ -780,7 +810,7 @@ index 5701bd2..32fd683 100755 tp->old_pol = pol; tp->old_hiband = hiband; -@@ -383,8 +522,10 @@ tune_it_s2 (int fd_frontend, transponder * tp) +@@ -383,8 +530,10 @@ tune_it_s2 (int fd_frontend, transponder * tp) {.cmd = DTV_INVERSION,.u.data = 0}, {.cmd = DTV_SYMBOL_RATE,.u.data = 0}, {.cmd = DTV_INNER_FEC,.u.data = 0}, @@ -791,7 +821,7 @@ index 5701bd2..32fd683 100755 {.cmd = DTV_TUNE}, }; static struct dtv_properties dvbs2_cmdseq = -@@ -462,11 +603,15 @@ tune_it_s2 (int fd_frontend, transponder * tp) +@@ -462,11 +611,15 @@ tune_it_s2 (int fd_frontend, transponder * tp) tp->mtype = QPSK; bpol = getTick(); if_freq = setup_switch (fd_frontend, tp); @@ -807,7 +837,7 @@ index 5701bd2..32fd683 100755 p->props[INVERSION].u.data = tp->inversion; p->props[SYMBOL_RATE].u.data = tp->sr; p->props[FEC_INNER].u.data = tp->fec; -@@ -475,7 +620,12 @@ tune_it_s2 (int fd_frontend, transponder * tp) +@@ -475,7 +628,12 @@ tune_it_s2 (int fd_frontend, transponder * tp) LOG("tuning to %d(%d) pol: %s (%d) sr:%d fec:%s delsys:%s mod:%s rolloff:%s pilot:%s, ts clear=%d, ts pol=%d", tp->freq, p->props[FREQUENCY].u.data, get_pol(tp->pol), tp->pol, p->props[SYMBOL_RATE].u.data, fe_fec[p->props[FEC_INNER].u.data], fe_delsys[p->props[DELSYS].u.data], fe_modulation[p->props[MODULATION].u.data], @@ -821,7 +851,7 @@ index 5701bd2..32fd683 100755 break; -@@ -560,6 +710,20 @@ set_pid (int hw, int ad, uint16_t i_pid) +@@ -560,6 +718,20 @@ set_pid (int hw, int ad, uint16_t i_pid) char buf[100]; int fd; @@ -842,7 +872,7 @@ index 5701bd2..32fd683 100755 if ( i_pid > 8192 ) LOG_AND_RETURN(-1, "pid %d > 8192 for /dev/dvb/adapter%d/demux%d", i_pid, hw, ad); -@@ -585,6 +749,7 @@ set_pid (int hw, int ad, uint16_t i_pid) +@@ -585,6 +757,7 @@ set_pid (int hw, int ad, uint16_t i_pid) } LOG ("setting filter on PID %d for fd %d", i_pid, fd); @@ -850,7 +880,7 @@ index 5701bd2..32fd683 100755 return fd; } -@@ -592,6 +757,17 @@ set_pid (int hw, int ad, uint16_t i_pid) +@@ -592,6 +765,17 @@ set_pid (int hw, int ad, uint16_t i_pid) int del_filters (int fd, int pid) { @@ -868,7 +898,7 @@ index 5701bd2..32fd683 100755 if (fd < 0) LOG_AND_RETURN(0, "DMX_STOP on an invalid handle %d, pid %d", fd, pid); if (ioctl (fd, DMX_STOP) < 0) -@@ -599,6 +775,7 @@ int del_filters (int fd, int pid) +@@ -599,6 +783,7 @@ int del_filters (int fd, int pid) else LOG ("clearing filters on PID %d FD %d", pid, fd); close (fd); @@ -876,7 +906,7 @@ index 5701bd2..32fd683 100755 return 0; } -@@ -606,6 +783,15 @@ int del_filters (int fd, int pid) +@@ -606,6 +791,15 @@ int del_filters (int fd, int pid) fe_delivery_system_t dvb_delsys (int aid, int fd, fe_delivery_system_t *sys) { @@ -892,7 +922,7 @@ index 5701bd2..32fd683 100755 int i, res, rv = 0; struct dvb_frontend_info fe_info; -@@ -703,6 +889,7 @@ dvb_delsys (int aid, int fd, fe_delivery_system_t *sys) +@@ -703,6 +897,7 @@ dvb_delsys (int aid, int fd, fe_delivery_system_t *sys) LOG ("returning default from dvb_delsys => %s (count %d)", fe_delsys[rv] , nsys); return (fe_delivery_system_t) rv; @@ -901,7 +931,7 @@ index 5701bd2..32fd683 100755 } diff --git a/minisatip.c b/minisatip.c -index d4076ba..dad15ae 100755 +index d4076ba..fcf5a5c 100755 --- a/minisatip.c +++ b/minisatip.c @@ -36,6 +36,7 @@ @@ -912,7 +942,7 @@ index d4076ba..dad15ae 100755 #include "socketworks.h" #include "stream.h" #include "adapter.h" -@@ -62,10 +63,16 @@ usage () +@@ -62,10 +63,17 @@ usage () -c X: bandwidth capping for the output to the network (default: unlimited)\n\ -b X: set the DVR buffer to X KB (default: %dKB)\n\ -l increases the verbosity (you can use multiple -l), logging to stdout in foreground mode or in /tmp/log when a daemon\n\ @@ -924,12 +954,13 @@ index d4076ba..dad15ae 100755 -j jess_string: same format as unicable_string \n\ + -L link adapters (identical src,lo/hi,h/v), the format is M:S (master:slave)\n\ + -Q quattro LNB config (H/H,H/V,L/H,L/V)\n\ -+ -X AXE unicable/jess input (0-3)\n\ ++ -Z X: enable loband (0) or hiband (1) only for quattro LNB\n\ ++ -X X[,Y]: AXE unicable/jess input (0-3) for all tuners\n\ + -M X: skip initial MPEG-TS packets for AXE demuxer (default 35)\n\ ", DVR_BUFFER / 1024); exit (1); -@@ -97,11 +104,12 @@ set_options (int argc, char *argv[]) +@@ -97,11 +105,12 @@ set_options (int argc, char *argv[]) opts.device_id = 0; opts.bootid = 0; opts.force_scan = 0; @@ -940,11 +971,11 @@ index d4076ba..dad15ae 100755 memset(opts.playlist, sizeof(opts.playlist), 0); - while ((opt = getopt (argc, argv, "flr:a:t:d:w:p:shc:b:m:p:e:x:u:j:")) != -1) -+ while ((opt = getopt (argc, argv, "flr:a:t:d:w:p:shc:b:m:p:e:x:u:j:gL:QX:S:")) != -1) ++ while ((opt = getopt (argc, argv, "flr:a:t:d:w:p:shc:b:m:p:e:x:u:j:gL:QZ:X:S:")) != -1) { // printf("options %d %c %s\n",opt,opt,optarg); switch (opt) -@@ -143,6 +151,12 @@ set_options (int argc, char *argv[]) +@@ -143,6 +152,12 @@ set_options (int argc, char *argv[]) break; } @@ -957,7 +988,7 @@ index d4076ba..dad15ae 100755 case HELP_OPT: { usage (); -@@ -164,6 +178,10 @@ set_options (int argc, char *argv[]) +@@ -164,6 +179,10 @@ set_options (int argc, char *argv[]) case DVRBUFFER_OPT: { opts.dvr = atoi (optarg) * 1024; @@ -968,7 +999,7 @@ index d4076ba..dad15ae 100755 break; } -@@ -209,6 +227,37 @@ set_options (int argc, char *argv[]) +@@ -209,6 +228,39 @@ set_options (int argc, char *argv[]) break; } @@ -984,13 +1015,15 @@ index d4076ba..dad15ae 100755 + break; + } + ++ case QUATTRO_HIBAND_OPT: ++ { ++ opts.quattro_hiband = atoi(optarg) + 1; ++ break; ++ } ++ + case AXE_UNICINP_OPT: + { -+ opts.axe_unicinp = atoi(optarg); -+ if (opts.axe_unicinp < 0 || opts.axe_unicinp > 3) { -+ LOG("unicable input %d out of range, using 0", opts.axe_unicinp); -+ opts.axe_unicinp = 0; -+ } ++ set_unicable_input(optarg); + break; + } + @@ -1006,7 +1039,7 @@ index d4076ba..dad15ae 100755 } } -@@ -483,6 +532,11 @@ http_response (sockets *s, int rc, char *ah, char *desc, int cseq, int lr) +@@ -483,6 +535,11 @@ http_response (sockets *s, int rc, char *ah, char *desc, int cseq, int lr) #define RBUF 4000 @@ -1018,7 +1051,7 @@ index d4076ba..dad15ae 100755 int read_rtsp (sockets * s) { -@@ -507,8 +561,7 @@ read_rtsp (sockets * s) +@@ -507,8 +564,7 @@ read_rtsp (sockets * s) } } @@ -1028,7 +1061,7 @@ index d4076ba..dad15ae 100755 { if( s->rlen > RBUF - 10 ) { -@@ -524,6 +577,9 @@ read_rtsp (sockets * s) +@@ -524,6 +580,9 @@ read_rtsp (sockets * s) return 0; } @@ -1038,7 +1071,7 @@ index d4076ba..dad15ae 100755 rlen = s->rlen; s->rlen = 0; -@@ -726,8 +782,7 @@ read_http (sockets * s) +@@ -726,8 +785,7 @@ read_http (sockets * s) "%s" ""; @@ -1048,7 +1081,7 @@ index d4076ba..dad15ae 100755 { if( s->rlen > RBUF - 10 ) { -@@ -749,6 +804,9 @@ read_http (sockets * s) +@@ -749,6 +807,9 @@ read_http (sockets * s) return 0; } @@ -1058,7 +1091,7 @@ index d4076ba..dad15ae 100755 rlen = s->rlen; s->rlen = 0; -@@ -781,6 +839,15 @@ read_http (sockets * s) +@@ -781,6 +842,15 @@ read_http (sockets * s) return 0; } @@ -1074,7 +1107,7 @@ index d4076ba..dad15ae 100755 if (strncmp (arg[1], "/icons/", 7) == 0) { char *ctype = NULL; -@@ -904,6 +971,9 @@ ssdp_reply (sockets * s) +@@ -904,6 +974,9 @@ ssdp_reply (sockets * s) return 0; } @@ -1084,7 +1117,7 @@ index d4076ba..dad15ae 100755 // not my uuid LOG("Received SSDP packet from %s:%d -> handle %d", inet_ntoa(s->sa.sin_addr), ntohs(s->sa.sin_port), s->sock); LOGL(3, "%s", s->buf); -@@ -987,7 +1057,13 @@ main (int argc, char *argv[]) +@@ -987,7 +1060,13 @@ main (int argc, char *argv[]) set_options (argc, argv); if (opts.daemon) becomeDaemon (); @@ -1098,7 +1131,7 @@ index d4076ba..dad15ae 100755 readBootID(); if ((ssdp = udp_bind (NULL, 1900)) < 1) FAIL ("SSDP: Could not bind on udp port 1900"); -@@ -1021,7 +1097,9 @@ main (int argc, char *argv[]) +@@ -1021,7 +1100,9 @@ main (int argc, char *argv[]) select_and_execute (); unlink(PID_FILE); free_all (); @@ -1109,7 +1142,7 @@ index d4076ba..dad15ae 100755 } -@@ -1247,12 +1325,16 @@ void _log(int level, char * file, int line, const char *fmt, ...) { +@@ -1247,12 +1328,16 @@ void _log(int level, char * file, int line, const char *fmt, ...) { idx = 1; else if ( idx < 0) idx = 0; @@ -1129,7 +1162,7 @@ index d4076ba..dad15ae 100755 both = 0; va_start(arg, fmt); len += vsnprintf(output[idx] + len, sizeof(output[0]) - len, fmt, arg); -@@ -1271,9 +1353,9 @@ void _log(int level, char * file, int line, const char *fmt, ...) { +@@ -1271,9 +1356,9 @@ void _log(int level, char * file, int line, const char *fmt, ...) { } if(both){ @@ -1142,7 +1175,7 @@ index d4076ba..dad15ae 100755 fflush(stdout); } diff --git a/minisatip.h b/minisatip.h -index 821e756..44ca0c9 100755 +index 821e756..485be5d 100755 --- a/minisatip.h +++ b/minisatip.h @@ -9,7 +9,7 @@ @@ -1154,19 +1187,20 @@ index 821e756..44ca0c9 100755 void set_options (int argc, char *argv[]); -@@ -30,6 +30,11 @@ void set_options (int argc, char *argv[]); +@@ -30,6 +30,12 @@ void set_options (int argc, char *argv[]); #define ENABLE_ADAPTERS_OPT 'e' #define UNICABLE_OPT 'u' #define JESS_OPT 'j' +#define SYSLOG_OPT 'g' +#define LINK_OPT 'L' +#define QUATTRO_OPT 'Q' ++#define QUATTRO_HIBAND_OPT 'Z' +#define AXE_UNICINP_OPT 'X' +#define AXE_SKIP_PKT 'M' #define PID_FILE "/var/run/minisatip.pid" struct struct_opts -@@ -39,6 +44,7 @@ struct struct_opts +@@ -39,6 +45,7 @@ struct struct_opts char *disc_host; //discover host char mac[13]; unsigned int log, @@ -1174,12 +1208,13 @@ index 821e756..44ca0c9 100755 start_rtp, http_port; int timeout_sec; -@@ -50,6 +56,9 @@ struct struct_opts +@@ -50,6 +57,10 @@ struct struct_opts int dvr; int force_scan; int file_line; + int quattro; -+ int axe_unicinp; ++ int quattro_hiband; ++ int axe_unicinp[4]; + int axe_skippkt; char *last_log; char playlist[200]; diff --git a/patches/minisatip5-axe.patch b/patches/minisatip5-axe.patch index f721ba7a..8118306d 100644 --- a/patches/minisatip5-axe.patch +++ b/patches/minisatip5-axe.patch @@ -1,5 +1,5 @@ diff --git a/adapter.c b/adapter.c -index 033490a..36b3dfd 100644 +index 033490a..d5ae166 100644 --- a/adapter.c +++ b/adapter.c @@ -49,6 +49,31 @@ extern struct struct_opts opts; @@ -312,7 +312,7 @@ index 033490a..36b3dfd 100644 } } -@@ -1152,16 +1271,43 @@ void set_slave_adapters(char *o) +@@ -1152,16 +1271,63 @@ void set_slave_adapters(char *o) for (j = a_id; j <= a_id2; j++) { if (!a[j]) @@ -354,11 +354,31 @@ index 033490a..36b3dfd 100644 + LOG("Setting adapter %d as master for adapter %d", a_id, b_id); + } +} ++ ++void set_unicable_input(char *o) ++{ ++ int i, la, input, input2; ++ char buf[100], *arg[20], *sep1; ++ ++ strncpy(buf, o, sizeof(buf)-1); ++ buf[sizeof(buf)-1] = '\0'; ++ la = split(arg, buf, sizeof(arg), ','); ++ for (i=input=0; i < 4; i++) ++ { ++ if (i < la) { ++ input2=map_intd(arg[i], NULL, -1); ++ if (input2 >= 0 && input2 < 4) ++ input = input2; ++ } ++ opts.axe_unicinp[i] = input; ++ LOG("Setting input %d for unicable adapter %d", input, i); ++ } ++} + extern char *fe_delsys[]; void set_adapters_delsys(char *o) { -@@ -1186,7 +1332,7 @@ void set_adapters_delsys(char *o) +@@ -1186,7 +1352,7 @@ void set_adapters_delsys(char *o) ds = map_intd(sep + 1, fe_delsys, 0); if (!a[a_id]) @@ -367,7 +387,7 @@ index 033490a..36b3dfd 100644 ad = a[a_id]; ad->sys[0] = ds; -@@ -1371,42 +1517,24 @@ char *get_all_delsys(int aid, char *dest, int max_size) +@@ -1371,42 +1537,24 @@ char *get_all_delsys(int aid, char *dest, int max_size) return dest; } @@ -427,7 +447,7 @@ index 033490a..36b3dfd 100644 { "ad_pids", VAR_FUNCTION_STRING, (void *) &get_adapter_pids, 0, 0, 0 }, { "tuner_s2", VAR_INT, &tuner_s2, 1, 0, 0 }, diff --git a/adapter.h b/adapter.h -index e693479..b37c238 100644 +index e693479..10b9b93 100644 --- a/adapter.h +++ b/adapter.h @@ -6,7 +6,11 @@ @@ -471,13 +491,14 @@ index e693479..b37c238 100644 int set_adapter_for_stream(int i, int a); void close_adapter_for_stream(int sid, int aid); int set_adapter_parameters(int aid, int sid, transponder * tp); -@@ -128,7 +132,9 @@ void sort_pids(int aid); +@@ -128,7 +132,10 @@ void sort_pids(int aid); void enable_adapters(char *o); void set_unicable_adapters(char *o, int type); void set_diseqc_adapters(char *o); +void set_diseqc_timing(char *o); void set_slave_adapters(char *o); +void set_link_adapters(char *o); ++void set_unicable_input(char *o); void reset_pids_type(int aid, int clear_pat); void reset_ecm_type_for_key(int aid, int key); int delsys_match(adapter *ad, int del_sys); @@ -637,7 +658,7 @@ index 0000000..d8b06bc + +#endif diff --git a/dvb.c b/dvb.c -index 259b93d..8040849 100644 +index 259b93d..3d6ef66 100644 --- a/dvb.c +++ b/dvb.c @@ -42,6 +42,11 @@ @@ -898,7 +919,7 @@ index 259b93d..8040849 100644 { int hiband = 0; int diseqc = (tp->diseqc > 0) ? tp->diseqc - 1 : 0; -@@ -550,35 +583,129 @@ int setup_switch(int frontend_fd, transponder *tp) +@@ -550,35 +583,137 @@ int setup_switch(int frontend_fd, transponder *tp) hiband = 1; } @@ -950,6 +971,14 @@ index 259b93d..8040849 100644 + } + } + if (ad && opts.quattro) { ++ if (opts.quattro_hiband == 1 && hiband) { ++ LOG("axe_fe: hiband is not allowed for quattro config (adapter %d)", input); ++ return 0; ++ } ++ if (opts.quattro_hiband == 2 && !hiband) { ++ LOG("axe_fe: lowband is not allowed for quattro config (adapter %d)", input); ++ return 0; ++ } + input = ((hiband ^ 1) << 1) | (pol ^ 1); + adm = get_adapter(input); + if (adm == NULL) { @@ -964,7 +993,7 @@ index 259b93d..8040849 100644 + } + } + } else { -+ input = opts.axe_unicinp; ++ input = opts.axe_unicinp[ad->id & 3]; + ad = get_adapter(input); + if (ad == NULL) { + LOGL(3, "axe setup: unable to find adapter %d", input); @@ -1044,7 +1073,7 @@ index 259b93d..8040849 100644 return freq; } -@@ -611,6 +738,14 @@ int dvb_tune(int aid, transponder * tp) +@@ -611,6 +746,14 @@ int dvb_tune(int aid, transponder * tp) memset(p_cmd, 0, sizeof(p_cmd)); bclear = getTick(); @@ -1059,7 +1088,7 @@ index 259b93d..8040849 100644 if ((ioctl(fd_frontend, FE_SET_PROPERTY, &cmdseq_clear)) == -1) { LOG("FE_SET_PROPERTY DTV_CLEAR failed for fd %d: %s", fd_frontend, -@@ -624,14 +759,16 @@ int dvb_tune(int aid, transponder * tp) +@@ -624,14 +767,16 @@ int dvb_tune(int aid, transponder * tp) case SYS_DVBS2: bpol = getTick(); @@ -1077,7 +1106,7 @@ index 259b93d..8040849 100644 #if DVBAPIVERSION >= 0x0502 ADD_PROP(DTV_STREAM_ID, tp->plp) #endif -@@ -640,7 +777,12 @@ int dvb_tune(int aid, transponder * tp) +@@ -640,7 +785,12 @@ int dvb_tune(int aid, transponder * tp) "tuning to %d(%d) pol: %s (%d) sr:%d fec:%s delsys:%s mod:%s rolloff:%s pilot:%s, ts clear=%d, ts pol=%d", tp->freq, freq, get_pol(tp->pol), tp->pol, tp->sr, fe_fec[tp->fec], fe_delsys[tp->sys], fe_modulation[tp->mtype], @@ -1091,7 +1120,7 @@ index 259b93d..8040849 100644 break; case SYS_DVBT: -@@ -741,29 +883,46 @@ int dvb_tune(int aid, transponder * tp) +@@ -741,29 +891,46 @@ int dvb_tune(int aid, transponder * tp) if (ioctl(fd_frontend, FE_SET_PROPERTY, &p) == -1) { LOG("dvb_tune: set property failed %d %s", errno, strerror(errno)); @@ -1143,7 +1172,7 @@ index 259b93d..8040849 100644 return -1; } -@@ -789,10 +948,22 @@ int dvb_set_pid(adapter *a, uint16_t i_pid) +@@ -789,10 +956,22 @@ int dvb_set_pid(adapter *a, uint16_t i_pid) LOG("setting filter on PID %d for fd %d", i_pid, fd); return fd; @@ -1166,7 +1195,7 @@ index 259b93d..8040849 100644 if (fd < 0) LOG_AND_RETURN(0, "DMX_STOP on an invalid handle %d, pid %d", fd, pid); if (ioctl(fd, DMX_STOP, NULL) < 0) -@@ -801,10 +972,20 @@ int dvb_del_filters(int fd, int pid) +@@ -801,10 +980,20 @@ int dvb_del_filters(int fd, int pid) LOG("clearing filter on PID %d FD %d", pid, fd); close(fd); return 0; @@ -1187,7 +1216,7 @@ index 259b93d..8040849 100644 int i, res, rv = 0; struct dvb_frontend_info fe_info; -@@ -893,6 +1074,7 @@ fe_delivery_system_t dvb_delsys(int aid, int fd, fe_delivery_system_t *sys) +@@ -893,6 +1082,7 @@ fe_delivery_system_t dvb_delsys(int aid, int fd, fe_delivery_system_t *sys) fe_delsys[sys[i]], sys[i]); return (fe_delivery_system_t) rv; @@ -1195,7 +1224,7 @@ index 259b93d..8040849 100644 } -@@ -1005,6 +1187,7 @@ void dvb_get_signal(adapter *ad) +@@ -1005,6 +1195,7 @@ void dvb_get_signal(adapter *ad) ad->max_strength = (ad->strength > 0) ? ad->strength : 1; if (ad->max_snr <= ad->snr) ad->max_snr = (ad->snr > 0) ? ad->snr : 1; @@ -1203,7 +1232,7 @@ index 259b93d..8040849 100644 if (ad->snr > 4096) new_gs = 0; if (new_gs) -@@ -1017,6 +1200,14 @@ void dvb_get_signal(adapter *ad) +@@ -1017,6 +1208,14 @@ void dvb_get_signal(adapter *ad) ad->strength = ad->strength >> 8; ad->snr = ad->snr >> 8; } @@ -1218,7 +1247,7 @@ index 259b93d..8040849 100644 } void dvb_commit(adapter *a) -@@ -1024,6 +1215,33 @@ void dvb_commit(adapter *a) +@@ -1024,6 +1223,33 @@ void dvb_commit(adapter *a) return; } @@ -1252,7 +1281,7 @@ index 259b93d..8040849 100644 void find_dvb_adapter(adapter **a) { int na = 0; -@@ -1032,9 +1250,21 @@ void find_dvb_adapter(adapter **a) +@@ -1032,9 +1258,21 @@ void find_dvb_adapter(adapter **a) int i = 0, j = 0; adapter *ad; @@ -1274,7 +1303,7 @@ index 259b93d..8040849 100644 sprintf(buf, "/dev/dvb/adapter%d/frontend%d", i, j); fd = open(buf, O_RDONLY | O_NONBLOCK); if (fd < 0) -@@ -1042,7 +1272,8 @@ void find_dvb_adapter(adapter **a) +@@ -1042,7 +1280,8 @@ void find_dvb_adapter(adapter **a) sprintf(buf, "/dev/dvb/adapter%d/ca%d", i, j); fd = open(buf, O_RDONLY | O_NONBLOCK); } @@ -1284,7 +1313,7 @@ index 259b93d..8040849 100644 if (fd >= 0) { // if (is_adapter_disabled(na)) -@@ -1051,7 +1282,7 @@ void find_dvb_adapter(adapter **a) +@@ -1051,7 +1290,7 @@ void find_dvb_adapter(adapter **a) // continue; // } if (!a[na]) @@ -1293,7 +1322,7 @@ index 259b93d..8040849 100644 ad = a[na]; ad->pa = i; -@@ -1064,7 +1295,7 @@ void find_dvb_adapter(adapter **a) +@@ -1064,7 +1303,7 @@ void find_dvb_adapter(adapter **a) ad->tune = (Tune) dvb_tune; ad->delsys = (Dvb_delsys) dvb_delsys; ad->post_init = NULL; @@ -1302,7 +1331,7 @@ index 259b93d..8040849 100644 ad->get_signal = (Device_signal) dvb_get_signal; ad->type = ADAPTER_DVB; close(fd); -@@ -1073,6 +1304,14 @@ void find_dvb_adapter(adapter **a) +@@ -1073,6 +1312,14 @@ void find_dvb_adapter(adapter **a) if (na == MAX_ADAPTERS) return; } @@ -1520,7 +1549,7 @@ index c4c91c0..5ec0d29 100644 for(var j=0;jIP servers in the network)\n \ * eg: -D 4 \n\ -@@ -179,13 +210,23 @@ Help\n\ +@@ -179,13 +212,23 @@ Help\n\ * -m xx: simulate xx as local mac address, generates UUID based on mac\n\ * eg: -m 001122334455 \n\ \n\ @@ -1644,7 +1675,7 @@ index d6b26d3..b26be53 100644 * -p url: specify playlist url using X_SATIPM3U header \n\ * eg: -p http://192.168.2.3:8080/playlist\n\ - this will add X_SATIPM3U tag into the satip description xml\n\ -@@ -195,6 +236,9 @@ Help\n\ +@@ -195,6 +238,9 @@ Help\n\ \n\ * -R --document-root directory: document root for the minisatip web page and images\n\ \n\ @@ -1654,7 +1685,7 @@ index d6b26d3..b26be53 100644 * -s --satip-servers DELSYS:host:port - specify the remote satip host and port with delivery system DELSYS, it is possible to use multiple -s \n\ * DELSYS - can be one of: dvbs, dvbs2, dvbt, dvbt2, dvbc, dvbc2, isdbt, atsc, dvbcb ( - DVBC_ANNEX_B ) [default: dvbs2]\n\ host - the server of the satip server\n\ -@@ -204,6 +248,9 @@ Help\n\ +@@ -204,6 +250,9 @@ Help\n\ - specifies 1 dvbt satip server with address 192.168.1.3:554\n\ - specifies 1 dvbc satip server with address 192.168.1.4:554\n\ \n\ @@ -1664,15 +1695,11 @@ index d6b26d3..b26be53 100644 * -S --slave ADAPTER1,ADAPTER2-ADAPTER4[,..] - specify slave adapters \n\ * Allows specifying bonded adapters (multiple adapters connected with a splitter to the same LNB)\n\ Only one adapter needs to be master all others needs to have this parameter specified\n\ -@@ -237,7 +284,26 @@ Help\n\ +@@ -237,7 +286,28 @@ Help\n\ * eg: -y 5544 \n\ - changing this to a port > 1024 removes the requirement for minisatip to run as root\n\ \n\ -", -+* -L --link-adapters mapping_string: link adapters (identical src,lo/hi,h/v)\n\ -+\t* The format is: M1:S1[,[M2:S2]] - master:slave\n\ -+ * eg: 0:1,0:2,0:3 \n\ -+\n\ +" +#ifdef AXE +"\ @@ -1682,7 +1709,13 @@ index d6b26d3..b26be53 100644 +\n\ +* -Q --quattro quattro LNB config (H/H,H/V,L/H,L/V)\n\ +\n\ -+* -U --axe-uinput adapterno: AXE unicable/jess input (0-3)\n\ ++* -Z --quattro-hiband hiband\n\ ++ * if hiband is 0, do not allow hiband\n\ ++ * if hiband is 1, allow hiband\n\ ++\n\ ++* -U --axe-uinput adapterno[,adapterno2]: AXE unicable/jess input (0-3)\n\ ++ * eg: 0,0,2,2 (two unicable connections at inputs 0 and 2)\n\ ++ * (tuners 0,1: unicable input 0, tuners 2,3: unicable input 2)\n\ +\n\ +* -M --skip-mpegts packets: skip initial MPEG-TS packets for AXE demuxer (default 35)\n\ +\n\ @@ -1692,7 +1725,7 @@ index d6b26d3..b26be53 100644 app_name, ADAPTER_BUFFER, DVR_BUFFER, opts.no_threads ? "DISABLED" : "ENABLED"); -@@ -277,17 +343,24 @@ void set_options(int argc, char *argv[]) +@@ -277,17 +347,24 @@ void set_options(int argc, char *argv[]) opts.satip_setup_pids = 0; opts.output_buffer = 512 * 1024; opts.satip_servers[0] = 0; @@ -1715,11 +1748,11 @@ index d6b26d3..b26be53 100644 while ((opt = getopt_long(argc, argv, - "flr:a:td:w:p:s:n:hc:b:m:p:e:x:u:j:o:gy:i:D:VR:S:TX:Y:", -+ "flr:a:td:w:p:s:n:hc:b:m:p:e:x:u:j:o:gy:i:q:D:VR:S:TX:Y:L:QU:M:", ++ "flr:a:td:w:p:s:n:hc:b:m:p:e:x:u:j:o:gy:i:q:D:VR:S:TX:Y:L:QZ:U:M:", long_options, NULL)) != -1) { // printf("options %d %c %s\n",opt,opt,optarg); -@@ -359,9 +432,12 @@ void set_options(int argc, char *argv[]) +@@ -359,9 +436,12 @@ void set_options(int argc, char *argv[]) opts.adapter_buffer = (opts.adapter_buffer / 188) * 188; if (opts.adapter_buffer < ADAPTER_BUFFER) opts.adapter_buffer = ADAPTER_BUFFER; @@ -1733,7 +1766,7 @@ index d6b26d3..b26be53 100644 break; } -@@ -410,6 +486,12 @@ void set_options(int argc, char *argv[]) +@@ -410,6 +490,12 @@ void set_options(int argc, char *argv[]) break; } @@ -1746,7 +1779,7 @@ index d6b26d3..b26be53 100644 case SLAVE_OPT: { set_slave_adapters(optarg); -@@ -508,6 +590,33 @@ void set_options(int argc, char *argv[]) +@@ -508,6 +594,33 @@ void set_options(int argc, char *argv[]) LOGL(0, "Not a valid path for the xml file") ; break; @@ -1759,14 +1792,14 @@ index d6b26d3..b26be53 100644 + opts.quattro = 1; + break; + -+ case AXE_UNICINP_OPT: -+ opts.axe_unicinp = atoi(optarg); -+ if (opts.axe_unicinp < 0 || opts.axe_unicinp > 3) { -+ LOG("unicable input %d out of range, using 0", opts.axe_unicinp); -+ opts.axe_unicinp = 0; -+ } ++ case QUATTRO_HIBAND_OPT: ++ opts.quattro_hiband = atoi(optarg) + 1; + break; + ++ case AXE_UNICINP_OPT: ++ set_unicable_input(optarg); ++ break; ++ + case AXE_SKIP_PKT: + { + opts.axe_skippkt = atoi(optarg); @@ -1780,7 +1813,7 @@ index d6b26d3..b26be53 100644 } } -@@ -676,7 +785,6 @@ int read_rtsp(sockets * s) +@@ -676,7 +789,6 @@ int read_rtsp(sockets * s) if (transport) { int s_timeout; @@ -1788,7 +1821,7 @@ index d6b26d3..b26be53 100644 if (sid->timeout == 1) sid->timeout = opts.timeout_sec; -@@ -1003,6 +1111,9 @@ int ssdp_reply(sockets * s) +@@ -1003,6 +1115,9 @@ int ssdp_reply(sockets * s) return 0; } @@ -1798,7 +1831,7 @@ index d6b26d3..b26be53 100644 // not my uuid LOG("Received SSDP packet from %s:%d -> handle %d", get_socket_rhost(s->id, ra, sizeof(ra)), get_socket_rport(s->id), -@@ -1138,7 +1249,11 @@ int main(int argc, char *argv[]) +@@ -1138,7 +1253,11 @@ int main(int argc, char *argv[]) if (!opts.no_threads) set_socket_thread(sock_signal, start_new_thread("signal")); @@ -1813,7 +1846,7 @@ index d6b26d3..b26be53 100644 diff --git a/minisatip.h b/minisatip.h old mode 100644 new mode 100755 -index 403af34..3cd6977 +index 403af34..cbdc23c --- a/minisatip.h +++ b/minisatip.h @@ -10,13 +10,15 @@ @@ -1833,17 +1866,18 @@ index 403af34..3cd6977 #define copy32(a,i,v) { a[i] = ((v)>>24) & 0xFF;\ a[i+1] = ((v)>>16) & 0xFF;\ a[i+2] = ((v)>>8) & 0xFF;\ -@@ -48,6 +50,9 @@ struct struct_opts +@@ -48,6 +50,10 @@ struct struct_opts int force_scan; int clean_psi; int file_line; + int quattro; -+ int axe_unicinp; ++ int quattro_hiband; ++ int axe_unicinp[4]; + int axe_skippkt; char *last_log; int dvbapi_port; char *dvbapi_host; -@@ -62,6 +67,15 @@ struct struct_opts +@@ -62,6 +68,15 @@ struct struct_opts char *xml_path; char no_threads; int th_priority;