# include <mmsystem.h>
#endif
-#if defined( UNDER_CE )
-# include <windows.h>
-#endif
-
#if defined(HAVE_SYS_TIME_H)
# include <sys/time.h>
#endif
}
else
{
- /* Fallback on timeGetTime() which has a milisecond resolution
+ /* Fallback on timeGetTime() which has a millisecond resolution
* (actually, best case is about 5 ms resolution)
* timeGetTime() only returns a DWORD thus will wrap after
* about 49.7 days so we try to detect the wrapping. */
return res;
}
+#undef mwait
/**
* Wait for a date
*
ts.tv_sec = d.quot; ts.tv_nsec = d.rem * 1000;
while( clock_nanosleep( CLOCK_REALTIME, 0, &ts, NULL ) == EINTR );
}
-#else
+#elif defined (WIN32)
+ mtime_t i_total;
+
+ while( (i_total = (date - mdate())) > 0 )
+ {
+ const mtime_t i_sleep = i_total / 1000;
+ DWORD i_delay = (i_sleep > 0x7fffffff) ? 0x7fffffff : i_sleep;
+ vlc_testcancel();
+ SleepEx( i_delay, TRUE );
+ }
+ vlc_testcancel();
+
+#elif defined( __APPLE__ )
+ /* Explicit hack: OSX does not cancel at nanosleep() */
+ vlc_mutex_t lock;
+ vlc_cond_t wait;
+
+ vlc_mutex_init (&lock);
+ vlc_cond_init (&wait);
+ vlc_mutex_lock (&lock);
+
+ vlc_cleanup_push (vlc_mutex_destroy, &lock);
+ vlc_cleanup_push (vlc_cond_destroy, &wait);
+ vlc_cleanup_push (vlc_mutex_unlock, &lock);
+
+ vlc_cond_timedwait (&wait, &lock, date);
+
+ vlc_cleanup_run ();
+ vlc_cleanup_run ();
+ vlc_cleanup_run ();
+
+#else
mtime_t delay = date - mdate();
if( delay > 0 )
msleep( delay );
#endif
}
+
+#include "libvlc.h" /* vlc_backtrace() */
+#undef msleep
+
+#if defined(__APPLE__) && defined( HAVE_NANOSLEEP )
+/* Mac OS X 10.5's nanosleep is not a cancellation point */
+static inline int
+semi_testcancelable_nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
+{
+ int ret;
+ pthread_testcancel();
+ ret = nanosleep(rqtp, rmtp);
+ pthread_testcancel();
+ return ret;
+}
+#define nanosleep semi_testcancelable_nanosleep
+#endif
+
/**
- * More precise sleep()
+ * Portable usleep(). Cancellation point.
*
- * Portable usleep() function.
* \param delay the amount of time to sleep
*/
void msleep( mtime_t delay )
#elif defined( HAVE_KERNEL_OS_H )
snooze( delay );
-#elif defined( WIN32 ) || defined( UNDER_CE )
- for (delay /= 1000; delay > 0x7fffffff; delay -= 0x7fffffff)
- Sleep (0x7fffffff);
- Sleep (delay);
+#elif defined( WIN32 ) || defined( UNDER_CE ) || defined( __APPLE__ )
+ mwait (mdate () + delay);
#elif defined( HAVE_NANOSLEEP )
struct timespec ts_delay;
void date_Change( date_t *p_date, uint32_t i_divider_n, uint32_t i_divider_d )
{
+ /* change time scale of remainder */
+ p_date->i_remainder = p_date->i_remainder * i_divider_n / p_date->i_divider_num;
p_date->i_divider_num = i_divider_n;
p_date->i_divider_den = i_divider_d;
}
*/
mtime_t date_Increment( date_t *p_date, uint32_t i_nb_samples )
{
- mtime_t i_dividend = (mtime_t)i_nb_samples * 1000000;
- p_date->date += i_dividend / p_date->i_divider_num * p_date->i_divider_den;
+ mtime_t i_dividend = (mtime_t)i_nb_samples * 1000000 * p_date->i_divider_den;
+ p_date->date += i_dividend / p_date->i_divider_num;
p_date->i_remainder += (int)(i_dividend % p_date->i_divider_num);
if( p_date->i_remainder >= p_date->i_divider_num )
{
/* This is Bresenham algorithm. */
- p_date->date += p_date->i_divider_den;
+ assert( p_date->i_remainder < 2*p_date->i_divider_num);
+ p_date->date += 1;
p_date->i_remainder -= p_date->i_divider_num;
}