diff -ru mp3blaster-3.1.1/mpegsound/mpegsound.h mp3blaster-3.1.1+pasky/mpegsound/mpegsound.h
--- mp3blaster-3.1.1/mpegsound/mpegsound.h	Sat Mar  9 20:31:17 2002
+++ mp3blaster-3.1.1+pasky/mpegsound/mpegsound.h	Mon Jun 24 21:47:20 2002
@@ -356,6 +356,9 @@
   virtual int  putblock_nt(void *buffer, int size)		=0;
   virtual int  getblocksize(void);
 
+  virtual int  closedsp(void)=0;
+  virtual int  opendsp(void)=0;
+
   int geterrorcode(void) {return __errorcode;};
   int audiohandle;  
   virtual int fix_samplesize(void *buffer, int size);
@@ -378,6 +381,8 @@
   bool setfiletype(enum soundtype);
   bool putblock(void *buffer,int size);
   int putblock_nt(void *buffer,int size);
+  int  closedsp(void) {return true;};
+  int  opendsp(void) {return true;};
 private:
   Rawtofile(int filehandle);
   int init_putblock;
@@ -403,6 +408,8 @@
   bool putblock(void *buffer,int size);
   int  putblock_nt(void *buffer,int size);
   int  getblocksize(void);
+  int  closedsp(void);
+  int  opendsp(void);
 
   void setquota(int q){quota=q;};
   int  getquota(void) {return quota;};
@@ -489,6 +496,8 @@
   int  getcurrentpoint(void) const {return currentpoint/pcmsize;};
   void setcurrentpoint(int p);
 
+  int  getpcmsize(void)	     const {return pcmsize;};
+
 private:
   int  __errorcode;
   bool seterrorcode(int errorcode) {__errorcode=errorcode; return false; };
@@ -894,6 +903,9 @@
 	virtual bool ready()                               =0;
 	virtual int elapsed_time()                         =0;
 	virtual int remaining_time()                       =0;
+	virtual int total_time()			   =0;
+	virtual int current_frame()=0;
+	virtual int total_frames()=0;
   
 protected:
   bool opendevice(char *device, soundtype write2file=NONE);
@@ -936,6 +948,9 @@
 	bool stop() { return true; }
 	int elapsed_time();
 	int remaining_time();
+	int total_time() { return server->gettotallength(); }
+	int current_frame() { return server->getcurrentpoint()*server->getpcmsize(); }
+	int total_frames() { return server->gettotallength()*server->getpcmsize(); }
 	void skip(int);
   
 private:
@@ -965,19 +980,22 @@
 	bool forward(int);
 	bool rewind(int);
 #ifdef NEWTHREAD
-	bool pause() { server->pauseplaying(); return true; }
-	bool unpause() { server->continueplaying(); return true; }
+	bool pause() { server->pauseplaying(); player->closedsp(); return true; }
+	bool unpause() { server->continueplaying(); player->opendsp(); return true; }
 #elif defined(PTHREADEDMPEG)
-	bool pause() { if (use_threads) server->pausethreadedplayer(); return true;}
-	bool unpause() { if (use_threads) server->unpausethreadedplayer(); return true;}
+	bool pause() { if (use_threads) server->pausethreadedplayer(); player->closedsp(); return true;}
+	bool unpause() { if (use_threads) server->unpausethreadedplayer(); player->opendsp(); return true;}
 #else
-	bool pause() { return true;}
-	bool unpause() { return true;}
+	bool pause() { player->closedsp(); return true;}
+	bool unpause() { player->opendsp(); return true;}
 #endif
 	bool stop();
 	bool ready();
 	int elapsed_time();
 	int remaining_time();
+	int total_time() { return server->gettotaltime(); }
+	int current_frame() { return server->getcurrentframe(); }
+	int total_frames() { return server->gettotalframe(); }
 #ifndef NEWTHREAD
 #if PTHREADEDMPEG
   bool playingwiththread(int framenumbers);
@@ -1018,6 +1036,9 @@
 	bool ready();
 	int elapsed_time();
 	int remaining_time();
+	int total_time() { return elapsed_time()+remaining_time(); }
+	int current_frame() { return 0; }
+	int total_frames() { return 0; }
 
 private:
 	short wordsize;
diff -ru mp3blaster-3.1.1/mpegsound/rawplayer.cc mp3blaster-3.1.1+pasky/mpegsound/rawplayer.cc
--- mp3blaster-3.1.1/mpegsound/rawplayer.cc	Sat Mar 16 19:30:37 2002
+++ mp3blaster-3.1.1+pasky/mpegsound/rawplayer.cc	Mon Jun 24 21:50:10 2002
@@ -179,8 +179,8 @@
 	if (!first_init)
 	{
 		debug("Resetting soundcard!\n");
-return seterrorcode(SOUND_ERROR_DEVCTRLERROR);
-#if 0
+//return seterrorcode(SOUND_ERROR_DEVCTRLERROR);
+#if 1
 		/* flush all data in soundcard's buffer first. */
 		if(ioctl(audiohandle,SNDCTL_DSP_SYNC,NULL)<0)
 			return seterrorcode(SOUND_ERROR_DEVCTRLERROR);
@@ -425,4 +425,32 @@
 int Rawplayer::getblocksize(void)
 {
 	return audiobuffersize;
+}
+
+int Rawplayer::closedsp(void)
+{
+		/* flush all data in soundcard's buffer first. */
+		if(ioctl(audiohandle,SNDCTL_DSP_SYNC,NULL)<0)
+			return seterrorcode(SOUND_ERROR_DEVCTRLERROR);
+                if (close(audiohandle) == -1)
+                {
+                        debug("Couldn't close audiohandle\n");
+                        return seterrorcode(SOUND_ERROR_DEVCTRLERROR);
+                }
+	return true;
+}
+
+int Rawplayer::opendsp(void)
+{
+        #if defined(AUDIO_NONBLOCKING) || defined(NEWTHREAD)
+                if((audiohandle=open(filename,O_WRONLY|O_NDELAY,0))==-1)
+        #else
+                if((audiohandle=open(filename,O_WRONLY,0))==-1)
+        #endif
+                {
+                        debug("Couldn't reopen audiohandle\n");
+                        return seterrorcode(SOUND_ERROR_DEVCTRLERROR);
+                }
+	first_init = 1; resetsoundtype();
+	return true;
 }
diff -ru mp3blaster-3.1.1/src/splay.cc mp3blaster-3.1.1+pasky/src/splay.cc
--- mp3blaster-3.1.1/src/splay.cc	Thu Aug 30 23:14:05 2001
+++ mp3blaster-3.1.1+pasky/src/splay.cc	Tue Jun 25 12:39:24 2002
@@ -1,6 +1,9 @@
 /* Sound Player
 
-   Copyright (C) 1997 by Woo-jae Jung */
+   Copyright (C) 1997 by Woo-jae Jung
+
+   Hacked interactive version (c) 2002 Petr Baudis and mpg123 authors
+   (stolen terminal routines) */
 
 // It's an example of using MPEG/WAVE Sound library
 
@@ -10,7 +13,15 @@
 #include "config.h"
 #endif
 
+#include <ctype.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
+#include <signal.h>
+#include <sys/signal.h>
+#include <sys/poll.h>
+#include <termios.h>
 #include <unistd.h>
 
 #include <mpegsound.h>
@@ -35,6 +46,68 @@
 "\n"
 "For detail, see man pages.\n";
 
+
+
+
+static struct termios old_tio;
+static void term_init(void);
+static void term_restore(void);
+static int term_enable;
+void term_init(void);
+
+void term_siginit(int foo)
+{
+  foo=foo;
+    term_init();
+}
+
+/* initialze terminal */
+void term_init(void)
+{
+  struct termios tio;
+
+  if (! term_enable)
+    atexit(term_restore);
+  if(tcgetattr(0,&tio) < 0) {
+    fprintf(stderr,"Can't get terminal attributes\n");
+    return;
+  }
+  if (! term_enable)
+    old_tio=tio;
+  tio.c_lflag &= ~(ICANON|ECHO);
+  tio.c_cc[VMIN] = 1;
+  tio.c_cc[VTIME] = 0;
+
+  if(tcsetattr(0,TCSANOW,&tio) < 0) {
+    fprintf(stderr,"Can't set terminal attributes\n");
+    return;
+  }
+
+  term_enable = 1;
+  signal(SIGCONT, term_siginit);
+}
+
+void term_restore(void)
+{
+
+  if (!term_enable)
+    return;
+
+  term_enable = 0;
+  tcsetattr(0,TCSAFLUSH,&old_tio);
+  puts("");
+}
+
+
+
+
+
+
+
+
+
+
+
 /***********************/
 /* Command line player */
 /***********************/
@@ -67,7 +140,66 @@
   else
   {
     player->setforcetomono(splay_forcetomonoflag);
+#if 0
     player->playing();
+#else
+    /* This is fucking hugly hackish code to gain us some interactivity. Not
+     * really done properly, sure. Quick hack (tm). --pasky */
+    while (1) {
+      static int paused;
+
+      if (!paused) player->run(5); /* quick shot to the player */
+      {
+	struct pollfd pf = { 0, POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL, 0 };
+	int pr;
+
+	/* Print status */
+	{
+          int tim1 = player->elapsed_time(), tim2 = player->remaining_time(), cf = player->current_frame();
+
+	  fprintf(stderr, "\rFrame# %5d [%5d], ", cf, player->total_frames() - cf);
+
+	  fprintf(stderr, "Time: %02u:%02u [%02u:%02u] %s",
+	      (unsigned int) tim1 / 60,
+	      (unsigned int) tim1 % 60,
+	      (unsigned int) tim2 / 60,
+	      (unsigned int) tim2 % 60,
+	      paused? "Paused ": "Playing");
+	  fflush(stderr);
+	}
+	
+	/* Read command */
+
+	pr = poll(&pf, 1, 1);
+	if (pr > 0) {
+	  /* incoming event */
+	  char ch;
+
+	  if (pf.revents & POLLERR || pf.revents & POLLHUP || pf.revents & POLLNVAL) {
+	    fprintf(stderr, "Error on control device.\n");
+	    break;
+	  }
+
+	  read(0, (void *) &ch, 1);
+	  switch (toupper(ch)) {
+	    case 'Q': goto bailout;
+	    case 'P': if (paused) player->unpause(); else player->pause(); paused = !paused; break;
+	    case '>': player->forward(10); break;
+	    case '<': player->rewind(10); break;
+	  }
+
+	} else if (pr < 0 && errno != EINTR /* i.e. suspend and then resume */) {
+	  /* fuckup */
+	  perror("poll()");
+	  break;
+
+	} else {
+	  /* nothing */
+	}
+      }
+    }
+bailout:
+#endif
     if(player->geterrorcode()>0)error(player->geterrorcode());
   }
 }
@@ -86,7 +218,7 @@
 		if (!strcmp(splay_devicename, "-"))
 			didopen = player->openfile(filename, "/dev/stdout", WAV);
 		else
-			didopen = player->openfile(filename, splay_devicename);
+			didopen = player->openfile(filename, NULL/*splay_devicename*/);
 
 		if (didopen)
 			player->initialize(NULL);
@@ -98,7 +230,7 @@
       return;
     }
     player->setdownfrequency(splay_downfrequency);
-#ifdef PTHREADEDMPEG
+#if 0//def PTHREADEDMPEG
     playingthread(player);
 #else
     playing(player);
@@ -216,6 +348,7 @@
   if(splay_listsize==0)    // Make list by arguments
     arglist(argc,argv,optind);
 
+  term_init();
   do
   {
     if(splay_shuffleflag)shufflelist();
diff -ru mp3blaster-3.1.1/src/splay_common.cc mp3blaster-3.1.1+pasky/src/splay_common.cc
--- mp3blaster-3.1.1/src/splay_common.cc	Tue Feb 12 16:19:00 2002
+++ mp3blaster-3.1.1+pasky/src/splay_common.cc	Mon Jun 24 21:07:47 2002
@@ -196,8 +196,8 @@
 debug(const char *fmt, ... )
 {
 	va_list ap;
+return;
 	va_start(ap, fmt);
 	vfprintf(stderr,fmt,ap);
 	va_end(ap);
 }
-
