diff -Naur main/libmenu/menu_dvbin.c main2/libmenu/menu_dvbin.c --- main/libmenu/menu_dvbin.c 2003-08-16 11:50:45.000000000 +0200 +++ main2/libmenu/menu_dvbin.c 2003-09-06 21:20:37.000000000 +0200 @@ -111,7 +111,9 @@ elem->p.next = NULL; elem->p.txt = name; elem->num = n; - + + if(n == 0) + elem->p.prev=NULL; menu_list_add_entry(menu, elem); } diff -Naur main/libmpdemux/dvbin.c main2/libmpdemux/dvbin.c --- main/libmpdemux/dvbin.c 2003-08-27 19:08:58.000000000 +0200 +++ main2/libmpdemux/dvbin.c 2003-09-06 21:14:46.000000000 +0200 @@ -290,16 +290,15 @@ static int dvb_streaming_read(stream_t *stream, char *buffer, int size) { struct pollfd pfds[1]; - int pos=0, tries, rk; + int pos, tries, rk; int fd = stream->fd; dvb_priv_t *priv = (dvb_priv_t *) stream->priv; mp_msg(MSGT_DEMUX, MSGL_V, "dvb_streaming_read(%d)\n", size); - if(priv->retry) - tries = 5; - else - tries = 1; + tries = priv->retry; + + pos = 0; while(pos < size) { pfds[0].fd = fd; @@ -374,11 +373,12 @@ { dvb_demux_stop(priv->demux_fd[0]); dvb_demux_stop(priv->demux_fd[1]); - priv->retry = 0; - while(stream_read(stream, buf, 4096)); //empty both the stream's and driver's buffer + priv->retry = 1; + while(dvb_streaming_read(stream, buf, 4096) > 0); //empty both the stream's and driver's buffers + cache_uninit(stream); } - priv->retry = 1; + priv->retry = 6; mp_msg(MSGT_DEMUX, MSGL_V, "DVB_SET_CHANNEL: channel %d\n", n); list = priv->list; if(list == NULL) @@ -418,20 +418,22 @@ if(strcmp(priv->prev_tuning, priv->new_tuning)) { - mp_msg(MSGT_DEMUX, MSGL_V, "DIFFERENT TUNING THAN THE PREVIOUS: %s -> %s\n", priv->prev_tuning, priv->new_tuning); + mp_msg(MSGT_DEMUX, MSGL_INFO, "DIFFERENT TUNING THAN THE PREVIOUS: %s -> %s\n", priv->prev_tuning, priv->new_tuning); strcpy(priv->prev_tuning, priv->new_tuning); do_tuning = 1; } else { - mp_msg(MSGT_DEMUX, MSGL_V, "SAME TUNING, NO TUNING\n"); + mp_msg(MSGT_DEMUX, MSGL_INFO, "SAME TUNING PARAMETERS, NO TUNING\n"); do_tuning = 0; } + stream->eof=1; stream_reset(stream); + if(do_tuning) if (! dvb_tune(priv, channel->freq, channel->pol, channel->srate, channel->diseqc, channel->tone, channel->inv, channel->mod, channel->gi, channel->trans, channel->bw, channel->cr)) @@ -638,7 +640,7 @@ struct stream_priv_s* p = (struct stream_priv_s*)opts; char *name = NULL, *filename; dvb_priv_t *priv; - int tuner_type; + int tuner_type = 0; @@ -684,6 +686,12 @@ } } + if(tuner_type == 0) + { + mp_msg(MSGT_DEMUX, MSGL_V, "OPEN_DVB: UNKNOWN OR UNDETECTABLE TUNER TYPE, EXIT\n"); + return STREAM_ERROR; + } + priv->tuner_type = tuner_type; mp_msg(MSGT_DEMUX, MSGL_V, "OPEN_DVB: prog=%s, card=%d, type=%d, vid=%d, aid=%d, file=%s\n", @@ -696,14 +704,12 @@ { if((dvb_list_ptr = dvb_get_channels(filename, tuner_type)) == NULL) mp_msg(MSGT_DEMUX, MSGL_ERR, "EMPTY CHANNELS LIST FROM FILE %s!\n", filename); - else - { - priv->list = dvb_list_ptr; - } + + priv->list = dvb_list_ptr; } else { - dvb_list_ptr = NULL; + priv->list = dvb_list_ptr = NULL; mp_msg(MSGT_DEMUX, MSGL_WARN, "NO CHANNELS FILE FOUND!\n"); } } @@ -711,6 +717,13 @@ priv->list = dvb_list_ptr; + if(priv->list == NULL) + { + mp_msg(MSGT_DEMUX, MSGL_ERR, "NO CHANNELS AVAILABLE, EXIT!\n"); + return STREAM_ERROR; + } + + if(! strcmp(p->prog, "")) { if(dvb_list_ptr != NULL) @@ -735,7 +748,7 @@ stream->close = dvbin_close; m_struct_free(&stream_opts, opts); - return STREAM_OK; + return STREAM_OK; } @@ -745,7 +758,7 @@ "dvbin", "Nico", "based on the code from ??? (probably Arpi)", - dvb_open, + dvb_open, { "dvb", NULL }, &stream_opts, 1 // Urls are an option string diff -Naur main/libmpdemux/dvb_tune.c main2/libmpdemux/dvb_tune.c --- main/libmpdemux/dvb_tune.c 2003-08-14 03:05:49.000000000 +0200 +++ main2/libmpdemux/dvb_tune.c 2003-09-06 21:06:33.000000000 +0200 @@ -61,14 +61,14 @@ #endif int res, fe_fd = -1; - + fe_fd = open(dvb_frontenddev[priv->card], O_RDWR); if(fe_fd < 0) { - mp_msg(MSGT_DEMUX, MSGL_ERR, "get_tuner_type(%d, %s), ERROR IN OPENING FRONTEND DEVICE %s: %d\n", priv->card, dvb_frontenddev[priv->card], errno); + mp_msg(MSGT_DEMUX, MSGL_ERR, "get_tuner_type(card %d), COULDN'T OPEN FRONTEND DEVICE %s, ERRNO: %d\n", priv->card, dvb_frontenddev[priv->card], errno); return 0; } - + res = ioctl(fe_fd, FE_GET_INFO, &fe_info); if(res < 0) { @@ -86,17 +86,17 @@ case FE_QPSK: mp_msg(MSGT_DEMUX, MSGL_INFO, "TUNER TYPE SEEMS TO BE DVB-S\n"); return TUNER_SAT; - + case FE_QAM: mp_msg(MSGT_DEMUX, MSGL_INFO, "TUNER TYPE SEEMS TO BE DVB-C\n"); return TUNER_CBL; - + default: mp_msg(MSGT_DEMUX, MSGL_ERR, "UNKNOWN TUNER TYPE\n"); - return 0; + return 0; } - -} + +} static int open_fe(dvb_priv_t *priv) @@ -206,7 +206,7 @@ { return 0; } - + if(freq > 100000000) { tune_it(priv->fe_fd, 0, freq, 0, 0, tone, specInv, diseqc, modulation, HP_CodeRate, TransmissionMode, guardInterval, bandWidth); diff -Naur main/mplayer.c main2/mplayer.c --- main/mplayer.c 2003-08-29 23:41:03.000000000 +0200 +++ main2/mplayer.c 2003-09-06 20:50:23.000000000 +0200 @@ -1354,6 +1354,7 @@ if (stream->type==STREAMTYPE_DVDNAV) stream_cache_size=0; // must disable caching... #endif +goto_enable_cache: // CACHE2: initial prefill: 20% later: 5% (should be set by -cacheopts) if(stream_cache_size>0){ current_module="enable_cache"; @@ -1549,7 +1550,7 @@ if(dvb_step_channel(priv, dir)) { uninit_player(INITED_ALL-(INITED_STREAM|INITED_INPUT)); - goto goto_open_demuxer; + goto goto_enable_cache; } } } @@ -2902,7 +2903,7 @@ { uninit_player(INITED_ALL-(INITED_STREAM|INITED_INPUT)); printf("UNINIT COMPLETE\n"); - goto goto_open_demuxer; + goto goto_enable_cache; } } } @@ -2935,7 +2936,7 @@ if(dvb_set_channel(priv, cmd->args[0].v.i)) { uninit_player(INITED_ALL-(INITED_STREAM|INITED_INPUT)); - goto goto_open_demuxer; + goto goto_enable_cache; } } }