diff libmpdemux/demux_xmms.c @ 8536:ff192e1b018f

xmp hangign I noticed too, and is fixed with this patch, seeking works now witch xmp too. patch by Balatoni Denes <pnis@coder.hu>
author arpi
date Mon, 23 Dec 2002 12:09:31 +0000
parents 9d143176d95f
children 222c0a39c977
line wrap: on
line diff
--- a/libmpdemux/demux_xmms.c	Mon Dec 23 01:54:58 2002 +0000
+++ b/libmpdemux/demux_xmms.c	Mon Dec 23 12:09:31 2002 +0000
@@ -38,6 +38,7 @@
 static int xmms_length;
 static char *xmms_title=NULL;
 static uint32_t xmms_audiopos=0;
+static int xmms_playing=0;
 
 static uint64_t written = 0;
 
@@ -140,9 +141,13 @@
 //static void input_update_vis(gint time){}
 //static gchar *input_get_info_text(void){return NULL;}
 static void input_set_info_text(char * text){}
-static void input_set_info(char* ha,int a, int b, int c, int d){};
+
 /* Dummy functions  END*/
 
+static void input_set_info(char* title,int length, int rate, int freq, int nch){
+    xmms_length=length;
+}
+
 static void init_plugins(){
     DIR *dir;
     struct dirent *ent;
@@ -226,12 +231,11 @@
   sh_audio->ds = demuxer->audio;
 
   xmms_output_plugin.init();
+  ip->output = &xmms_output_plugin;
+  ip->play_file(demuxer->stream->url);
+  xmms_playing=1;
   ip->get_song_info(demuxer->stream->url,&xmms_title,&xmms_length);
   if (xmms_length<=0) demuxer->seekable=0;
-//  printf("XMMS song title='%s' length=%d\n",xmms_title,xmms_length);
-//  input_play(demuxer->stream->url);
-  ip->output = &xmms_output_plugin;
-  ip->play_file(demuxer->stream->url);
 
   mp_msg(MSGT_DEMUX,MSGL_INFO,"Waiting for the XMMS plugin to start playback of '%s'...\n",demuxer->stream->url);
   while (xmms_channels==0) {
@@ -263,9 +267,15 @@
   sh_audio_t *sh_audio = demuxer->audio->sh;
   xmms_priv_t *priv=demuxer->priv;
   demux_packet_t*  dp;
+  
+  if (xmms_length<=0) demuxer->seekable=0;
+  else demuxer->seekable=1;
 
   while (xmms_audiopos<XMMS_PACKETSIZE/2) {
-    if(priv->ip->get_time()<0) return 0;
+    if((priv->ip->get_time()<0) || !xmms_playing) {
+	xmms_audiopos=0;  // xmp on exit waits until buffer is freed somewhat
+	return 0;
+    }
     usleep(1000);    
   }
 
@@ -307,6 +317,7 @@
 
 int demux_close_xmms(demuxer_t* demuxer) {
   xmms_priv_t *priv=demuxer->priv;
+  xmms_playing=0;
   priv->ip->stop();
   free(priv); demuxer->priv=NULL;
   cleanup_plugins();