Mercurial > pt1.oyama
diff recpt1/recpt1.c @ 33:f25820d90249
make recpt1 try other tuner devices when it fails to tune a tuner to the specified channel.
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Tue, 03 Mar 2009 17:59:17 +0900 |
parents | 6004fe4f37f9 |
children | 3f2487de156e |
line wrap: on
line diff
--- a/recpt1/recpt1.c Tue Mar 03 05:30:25 2009 +0900 +++ b/recpt1/recpt1.c Tue Mar 03 17:59:17 2009 +0900 @@ -550,6 +550,8 @@ int port_to = 1234; sock_data *sockdata = NULL; char *device = NULL; + char **tuner; + int num_devs; while((result = getopt_long(argc, argv, "br:smua:p:d:h", long_options, &option_index)) != -1) { @@ -614,56 +616,65 @@ /* get channel */ ptr = searchrecoff(argv[optind]); if(ptr == NULL) { - fprintf(stderr, "Channel Select Error(%s)\n", argv[optind]); + fprintf(stderr, "Invalid Channel: %s\n", argv[optind]); return 1; } freq.frequencyno = ptr->set_freq; freq.slot = ptr->add_freq; - if(ptr->type == CHTYPE_SATELLITE) { - if(device) { - tfd = open(device, O_RDONLY); - if(tfd < 0) { - fprintf(stderr, "Cannot open tuner\n"); - return 1; - } - } - else { - for(lp = 0; lp < NUM_BSDEV; lp++) { - tfd = open(bsdev[lp], O_RDONLY); - if(tfd >= 0) { - break; - } - } - if(tfd < 0) { - fprintf(stderr, "Cannot open tuner\n"); - return 1; - } + /* open tuner */ + /* 1. specified tuner device */ + if(device) { + tfd = open(device, O_RDONLY); + if(tfd < 0) { + fprintf(stderr, "Cannot open tuner device: %s\n", device); + return 1; } } + + /* 2. loop around available devices */ + if(ptr->type == CHTYPE_SATELLITE) { + tuner = bsdev; + num_devs = NUM_BSDEV; + } else { - if(device) { - tfd = open(device, O_RDONLY); - if(tfd < 0) { - fprintf(stderr, "Cannot open tuner\n"); - return 1; - } - } - else { - for(lp = 0; lp < NUM_ISDB_T_DEV; lp++) { - tfd = open(isdb_t_dev[lp], O_RDONLY); - if(tfd >= 0) { - break; + tuner = isdb_t_dev; + num_devs = NUM_ISDB_T_DEV; + } + + for(lp = 0; lp < num_devs; lp++) { + tfd = open(tuner[lp], O_RDONLY); + if(tfd >= 0) { + /* power on LNB */ + if(ptr->type == CHTYPE_SATELLITE) { + if(ioctl(tfd, LNB_ENABLE, 0) < 0) { + close(tfd); + continue; } } - if(tfd < 0) { - fprintf(stderr, "Cannot open tuner\n"); - return 1; + + /* tune to specified channel */ + if(ioctl(tfd, SET_CHANNEL, &freq) < 0) { + close(tfd); + continue; } + + break; /* found suitable tuner */ } + close(tfd); + tfd = -1; } + /* all tuners cannot be used */ + if(tfd < 0) { + fprintf(stderr, "Could not tune to the specified channel\n"); + return 1; + } + + /* show signal strength */ + calc_cn(tfd, ptr->type); + /* get recsec */ char *recsecstr = argv[optind + 1]; if(!strcmp("-", recsecstr)) { @@ -684,7 +695,8 @@ if(!fileless) { wfd = open(argv[optind + 2], (O_RDWR | O_CREAT | O_TRUNC), 0666); if(wfd < 0) { - fprintf(stderr, "Could not open output file(%s)\n", argv[optind + 2]); + fprintf(stderr, "Could not open output file: %s\n", + argv[optind + 2]); return 1; } } @@ -729,26 +741,12 @@ } } - /* setup tuner */ - if(ptr->type == CHTYPE_SATELLITE) { - if(ioctl(tfd, LNB_ENABLE, 0) < 0) { - return 0 ; - } - } - - if(ioctl(tfd, SET_CHANNEL, &freq) < 0) { - fprintf(stderr, "Could not tune to the specified channel\n"); - calc_cn(tfd, ptr->type); - return 1; - } - calc_cn(tfd, ptr->type); - - /* init signal handler thread */ + /* spawn signal handler thread */ sdata.queue = p_queue; sdata.tfd = tfd; init_signal_handlers(&signal_thread, &sdata); - /* make reader thread */ + /* spawn reader thread */ tdata.queue = p_queue; tdata.decoder = dec; tdata.wfd = wfd;