diff mplayer.c @ 1038:b36fb1ae4b53

applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
author arpi_esp
date Tue, 05 Jun 2001 18:40:44 +0000
parents 435feedf9f89
children 881b949b6c68
line wrap: on
line diff
--- a/mplayer.c	Tue Jun 05 16:52:51 2001 +0000
+++ b/mplayer.c	Tue Jun 05 18:40:44 2001 +0000
@@ -16,15 +16,22 @@
 #include <sys/time.h>
 #include <sys/stat.h>
 #include <fcntl.h>
-#ifdef __sun
-#include <sys/audioio.h>
-#else
-#include <sys/soundcard.h>
-#endif
 
 #include "version.h"
 #include "config.h"
 
+#if defined(USE_OSS_AUDIO)
+#include <sys/soundcard.h>
+#elif defined(USE_SUN_AUDIO)
+#endif
+
+#if	defined(sun)
+#define	DEFAULT_CDROM_DEVICE	"/vol/dev/aliases/cdrom0"
+#else
+#define	DEFAULT_CDROM_DEVICE	"/dev/cdrom"
+#endif
+
+
 #ifndef MAX_OUTBURST
 #error "============================================="
 #error "Please re-run ./configure and then try again!"
@@ -65,6 +72,10 @@
 
 //extern int vo_screenwidth;
 
+int audio_fd=-1;
+
+extern int vo_screenwidth;
+
 extern char* win32_codec_name;  // must be set before calling DrvOpen() !!!
 
 extern int errno;
@@ -86,6 +97,7 @@
 static URL_t* url;
 #endif
 
+
 #define DEBUG if(0)
 #ifdef HAVE_GUI
  int nogui=1;
@@ -97,6 +109,19 @@
 static subtitle* subtitles=NULL;
 void find_sub(subtitle* subtitles,int key);
 
+static int
+usec_sleep(int usec_delay)
+{
+#if	1
+    struct timespec ts;
+    ts.tv_sec  =  usec_delay / 1000000;
+    ts.tv_nsec = (usec_delay % 1000000) * 1000;
+    return nanosleep(&ts, NULL);
+#else
+    return usleep(usec_delay);
+#endif
+}
+
 //**************************************************************************//
 //             Config file
 //**************************************************************************//
@@ -269,7 +294,7 @@
 
 #ifdef HAVE_GUI
  #include "../Gui/mplayer/psignal.h"
- #define GUI_MSG(x) if ( !nogui ) { mplSendMessage( x ); usleep( 10000 ); }
+ #define GUI_MSG(x) if ( !nogui ) { mplSendMessage( x ); usec_sleep( 10000 ); }
 #else
  #define GUI_MSG(x)
 #endif
@@ -297,6 +322,8 @@
   #endif
      getch2_disable();
   video_out->uninit();
+  audio_out->reset();
+  audio_out->uninit();
   if(encode_name) avi_fixate();
 #ifdef HAVE_LIRC
   #ifdef HAVE_GUI
@@ -403,6 +430,8 @@
 
 char *dsp=NULL;
 
+float rel_seek_secs=0;
+
 #include "mixer.h"
 #include "cfg-mplayer.h"
 
@@ -505,11 +534,7 @@
 #endif
 
 if(!filename){
-#ifdef __sun
-  if(vcd_track) filename="/vol/dev/aliases/cdrom0"; 
-#else
-  if(vcd_track) filename="/dev/cdrom"; 
-#endif
+  if(vcd_track) filename=DEFAULT_CDROM_DEVICE;
   else {
     printf("%s",help_text); exit(0);
   }
@@ -642,6 +667,7 @@
   }
   if (dvd_auth_device) {
     if (dvd_auth(dvd_auth_device,f)) {
+//    if (dvd_auth(dvd_auth_device,filename)) {
         GUI_MSG( mplErrorDVDAuth )
         exit(0);
       } 
@@ -1073,7 +1099,7 @@
       {
        mplShMem->items.videodata.format=sh_video->format;
        mplSendMessage( mplCantFindCodecForVideoFormat );
-       usleep( 10000 );
+       usec_sleep( 10000 );
       }
     #endif
     exit(1);
@@ -1137,7 +1163,7 @@
           {
            strcpy(  mplShMem->items.videodata.codecdll,sh_video->codec->dll );
            mplSendMessage( mplDSCodecNotFound );
-           usleep( 10000 );
+           usec_sleep( 10000 );
           }
         #endif
         exit(1);
@@ -1508,11 +1534,11 @@
       time_frame=0;
     } else {
         while(time_frame>0.022){
-            usleep(time_frame-0.022);
+            usec_sleep(time_frame-0.022);
             time_frame-=GetRelativeTime();
         }
         while(time_frame>0.007){
-            usleep(0);
+            usec_sleep(1000);	// sleeps 1 clock tick (10ms)!
             time_frame-=GetRelativeTime();
         }
     }
@@ -1744,7 +1770,14 @@
           if(verbose>1)printf("delay=%d\n",delay);
           time_frame=v_frame;
           time_frame-=a_frame-(float)delay/(float)sh_audio->o_bps;
-	  if(time_frame>-2*frame_time) drop_frame=0; // stop dropping frames
+	  if(time_frame>-2*frame_time) {
+	    drop_frame=0; // stop dropping frames
+	    if (verbose>0) printf("\nstop frame drop %.2f\n", time_frame);
+	  }else{
+	    ++drop_frame_cnt;
+	    if (verbose > 0 && drop_frame_cnt%10 == 0)
+	      printf("\nstill dropping, %.2f\n", time_frame);
+	  }
       }
 
     } else {
@@ -1762,6 +1795,7 @@
 	  if(time_frame<-2*frame_time){
 	      drop_frame=frame_dropping; // tricky!
 	      ++drop_frame_cnt;
+	      if (verbose>0) printf("\nframe drop %d, %.2f\n", drop_frame, time_frame);
 	  }
       } else {
           if(time_frame<-3*frame_time || time_frame>3*frame_time) time_frame=0;
@@ -1771,15 +1805,15 @@
       
       while(time_frame>0.005){
           if(time_frame<=0.020)
-             usleep(0); // sleep 10ms
+             usec_sleep(10000); // sleeps 1 clock tick (10ms)!
           else
-             usleep(1000000*(time_frame-0.002));
+             usec_sleep(1000000*(time_frame-0.002));
           time_frame-=GetRelativeTime();
       }
 
         current_module="flip_page";
         video_out->flip_page();
-//        usleep(50000); // test only!
+//        usec_sleep(50000); // test only!
 
     }
 
@@ -1845,7 +1879,7 @@
         else
           max_pts_correction=sh_video->frametime*0.10; // +-10% of time
         a_frame+=x; c_total+=x;
-        printf(" ct:%7.3f  %3d  %2d%% %2d%% %3.1f%% %d\r",c_total,
+        printf(" ct:%7.3f  %3d  %2d%% %2d%% %4.1f%% %d\r",c_total,
         (int)num_frames,
         (v_frame>0.5)?(int)(100.0*video_time_usage/(double)v_frame):0,
         (v_frame>0.5)?(int)(100.0*vout_time_usage/(double)v_frame):0,
@@ -1886,7 +1920,7 @@
 
   if(osd_function==OSD_PAUSE){
       printf("\n------ PAUSED -------\r");fflush(stdout);
-      audio_out->reset(); // stop audio
+      audio_out->pause();	// pause audio, keep data if possible
 #ifdef HAVE_GUI
       if ( nogui )
         {
@@ -1897,12 +1931,13 @@
 #endif
              (!f || getch2(20)<=0) && mplayer_get_key()<=0){
 	     video_out->check_events();
-             if(!f) usleep(1000); // do not eat the CPU
+             if(!f) usec_sleep(1000); // do not eat the CPU
          }
          osd_function=OSD_PLAY;
 #ifdef HAVE_GUI
-        } else while( osd_function != OSD_PLAY ) usleep( 1000 );
+        } else while( osd_function != OSD_PLAY ) usec_sleep( 1000 );
 #endif
+      audio_out->resume();	// resume audio
   }
 
 
@@ -1967,14 +2002,14 @@
       break;
     case '*':
     case '/': {
-        int mixer_l=0; int mixer_r=0;
+        float mixer_l, mixer_r;
         mixer_getvolume( &mixer_l,&mixer_r );
         if(c=='*'){
-            if ( mixer_l < 100 ) mixer_l++;
-            if ( mixer_r < 100 ) mixer_r++;
+            mixer_l++; if ( mixer_l > 100 ) mixer_l = 100;
+            mixer_r++; if ( mixer_r > 100 ) mixer_r = 100;
         } else {
-            if ( mixer_l > 0 ) mixer_l--;
-            if ( mixer_r > 0 ) mixer_r--;
+            mixer_l--; if ( mixer_l < 0 ) mixer_l = 0;
+            mixer_r--; if ( mixer_r < 0 ) mixer_r = 0;
         }
         mixer_setvolume( mixer_l,mixer_r );
 
@@ -2258,7 +2293,7 @@
 
         current_module=NULL;
 
-        audio_out->reset(); // stop audio
+        audio_out->reset(); // stop audio, throwing away buffered data
 
         c_total=0; // kell ez?
         printf("A:%6.1f  V:%6.1f  A-V:%7.3f",d_audio->pts,d_video->pts,0.0f);