Commit cdabd50c authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

dvb: fix polling, do not wake up 10x per seconds

parent 025e3052
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include <vlc_plugin.h> #include <vlc_plugin.h>
#include <vlc_access.h> #include <vlc_access.h>
#include <vlc_input.h> #include <vlc_input.h>
#include <vlc_interrupt.h>
#include <sys/types.h> #include <sys/types.h>
#include <poll.h> #include <poll.h>
...@@ -251,54 +252,60 @@ static block_t *BlockScan( access_t *p_access ) ...@@ -251,54 +252,60 @@ static block_t *BlockScan( access_t *p_access )
bool b_has_lock = false; bool b_has_lock = false;
int i_best_snr = -1; int i_best_snr = -1;
/* Initialize file descriptor sets */
struct pollfd ufds[2];
ufds[0].fd = p_sys->i_handle;
ufds[0].events = POLLIN;
ufds[1].fd = p_sys->i_frontend_handle;
ufds[1].events = POLLPRI;
for ( ; ; ) for ( ; ; )
{ {
struct pollfd ufds[2]; frontend_status_t status;
int i_ret;
/* Initialize file descriptor sets */ FrontendGetStatus( p_access, &status );
memset (ufds, 0, sizeof (ufds)); b_has_dvb_signal |= status.b_has_carrier;
ufds[0].fd = p_sys->i_handle; b_has_lock |= status.b_has_lock;
ufds[0].events = POLLIN;
ufds[1].fd = p_sys->i_frontend_handle;
ufds[1].events = POLLPRI;
/* We'll wait 0.1 second if nothing happens */ int64_t i_scan_end = i_scan_start;
/* Find if some data is available */ if( !b_has_dvb_signal )
i_ret = poll( ufds, 2, 100 ); i_scan_end += DVB_SCAN_MAX_SIGNAL_TIME;
else if( !b_has_lock )
i_scan_end += DVB_SCAN_MAX_LOCK_TIME;
else
i_scan_end += DVB_SCAN_MAX_PROBE_TIME;
if( !vlc_object_alive (p_access) || scan_IsCancelled( p_scan ) ) /* Find if some data is available */
break; int i_ret;
if( i_ret <= 0 ) do
{ {
const mtime_t i_scan_time = mdate() - i_scan_start; int64_t timeout = i_scan_end - mdate();
frontend_status_t status;
FrontendGetStatus( p_access, &status ); i_ret = 0;
b_has_dvb_signal |= status.b_has_carrier; if( !vlc_object_alive (p_access) || scan_IsCancelled( p_scan ) )
b_has_lock |= status.b_has_lock;
if( ( !b_has_dvb_signal && i_scan_time > DVB_SCAN_MAX_SIGNAL_TIME ) ||
( !b_has_lock && i_scan_time > DVB_SCAN_MAX_LOCK_TIME ) ||
( i_scan_time > DVB_SCAN_MAX_PROBE_TIME ) )
{
msg_Dbg( p_access, "timed out scanning current frequency (s=%d l=%d)", b_has_dvb_signal, b_has_lock );
break; break;
}
if( timeout >= 0 )
i_ret = vlc_poll_i11e( ufds, 2, timeout / 1000 );
} }
while( i_ret < 0 && errno == EINTR );
if( i_ret < 0 ) if( i_ret < 0 )
{ {
if( errno == EINTR )
continue;
msg_Err( p_access, "poll error: %s", vlc_strerror_c(errno) ); msg_Err( p_access, "poll error: %s", vlc_strerror_c(errno) );
scan_session_Destroy( p_scan, session );
p_access->info.b_eof = true; p_access->info.b_eof = true;
return NULL; break;
}
if( i_ret == 0 )
{
msg_Dbg( p_access,
"timed out scanning current frequency (s=%d l=%d)",
b_has_dvb_signal, b_has_lock );
break;
} }
if( ufds[1].revents ) if( ufds[1].revents )
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment