summaryrefslogtreecommitdiffstats
path: root/mplayer.c
diff options
context:
space:
mode:
Diffstat (limited to 'mplayer.c')
-rw-r--r--mplayer.c93
1 files changed, 64 insertions, 29 deletions
diff --git a/mplayer.c b/mplayer.c
index 8e5237e4b1..a1c4f6157b 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -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 @@ extern int errno;
static URL_t* url;
#endif
+
#define DEBUG if(0)
#ifdef HAVE_GUI
int nogui=1;
@@ -97,6 +109,19 @@ int verbose=0;
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 @@ extern void avi_fixate();
#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 @@ void exit_player(char* how){
#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 @@ int sub_auto = 1;
char *dsp=NULL;
+float rel_seek_secs=0;
+
#include "mixer.h"
#include "cfg-mplayer.h"
@@ -505,11 +534,7 @@ int f; // filedes
#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(vcd_track){
}
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 @@ while(1){
{
mplShMem->items.videodata.format=sh_video->format;
mplSendMessage( mplCantFindCodecForVideoFormat );
- usleep( 10000 );
+ usec_sleep( 10000 );
}
#endif
exit(1);
@@ -1137,7 +1163,7 @@ switch(sh_video->codec->driver){
{
strcpy( mplShMem->items.videodata.codecdll,sh_video->codec->dll );
mplSendMessage( mplDSCodecNotFound );
- usleep( 10000 );
+ usec_sleep( 10000 );
}
#endif
exit(1);
@@ -1508,11 +1534,11 @@ while(has_audio){
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 @@ switch(sh_video->codec->driver){
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 @@ switch(sh_video->codec->driver){
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 @@ switch(sh_video->codec->driver){
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 @@ switch(sh_video->codec->driver){
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 @@ switch(sh_video->codec->driver){
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 @@ switch(sh_video->codec->driver){
#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 @@ switch(sh_video->codec->driver){
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 @@ switch(file_format){
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);