comparison 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
comparison
equal deleted inserted replaced
8535:bc7bd163fff9 8536:ff192e1b018f
36 static uint32_t xmms_samplerate; 36 static uint32_t xmms_samplerate;
37 static uint32_t xmms_afmt; 37 static uint32_t xmms_afmt;
38 static int xmms_length; 38 static int xmms_length;
39 static char *xmms_title=NULL; 39 static char *xmms_title=NULL;
40 static uint32_t xmms_audiopos=0; 40 static uint32_t xmms_audiopos=0;
41 static int xmms_playing=0;
41 42
42 static uint64_t written = 0; 43 static uint64_t written = 0;
43 44
44 static void disk_close(void) {} 45 static void disk_close(void) {}
45 static void disk_flush(int time) {} 46 static void disk_flush(int time) {}
138 //static void input_add_vis(int time, unsigned char *s, InputVisType type){} 139 //static void input_add_vis(int time, unsigned char *s, InputVisType type){}
139 static void input_add_vis_pcm(int time, AFormat fmt, int nch, int length, void *ptr){} 140 static void input_add_vis_pcm(int time, AFormat fmt, int nch, int length, void *ptr){}
140 //static void input_update_vis(gint time){} 141 //static void input_update_vis(gint time){}
141 //static gchar *input_get_info_text(void){return NULL;} 142 //static gchar *input_get_info_text(void){return NULL;}
142 static void input_set_info_text(char * text){} 143 static void input_set_info_text(char * text){}
143 static void input_set_info(char* ha,int a, int b, int c, int d){}; 144
144 /* Dummy functions END*/ 145 /* Dummy functions END*/
146
147 static void input_set_info(char* title,int length, int rate, int freq, int nch){
148 xmms_length=length;
149 }
145 150
146 static void init_plugins(){ 151 static void init_plugins(){
147 DIR *dir; 152 DIR *dir;
148 struct dirent *ent; 153 struct dirent *ent;
149 154
224 demuxer->audio->sh = sh_audio; 229 demuxer->audio->sh = sh_audio;
225 demuxer->priv=priv; 230 demuxer->priv=priv;
226 sh_audio->ds = demuxer->audio; 231 sh_audio->ds = demuxer->audio;
227 232
228 xmms_output_plugin.init(); 233 xmms_output_plugin.init();
234 ip->output = &xmms_output_plugin;
235 ip->play_file(demuxer->stream->url);
236 xmms_playing=1;
229 ip->get_song_info(demuxer->stream->url,&xmms_title,&xmms_length); 237 ip->get_song_info(demuxer->stream->url,&xmms_title,&xmms_length);
230 if (xmms_length<=0) demuxer->seekable=0; 238 if (xmms_length<=0) demuxer->seekable=0;
231 // printf("XMMS song title='%s' length=%d\n",xmms_title,xmms_length);
232 // input_play(demuxer->stream->url);
233 ip->output = &xmms_output_plugin;
234 ip->play_file(demuxer->stream->url);
235 239
236 mp_msg(MSGT_DEMUX,MSGL_INFO,"Waiting for the XMMS plugin to start playback of '%s'...\n",demuxer->stream->url); 240 mp_msg(MSGT_DEMUX,MSGL_INFO,"Waiting for the XMMS plugin to start playback of '%s'...\n",demuxer->stream->url);
237 while (xmms_channels==0) { 241 while (xmms_channels==0) {
238 usleep(10000); 242 usleep(10000);
239 if(ip->get_time()<0) return 0; 243 if(ip->get_time()<0) return 0;
261 265
262 int demux_xmms_fill_buffer(demuxer_t* demuxer, demux_stream_t *ds) { 266 int demux_xmms_fill_buffer(demuxer_t* demuxer, demux_stream_t *ds) {
263 sh_audio_t *sh_audio = demuxer->audio->sh; 267 sh_audio_t *sh_audio = demuxer->audio->sh;
264 xmms_priv_t *priv=demuxer->priv; 268 xmms_priv_t *priv=demuxer->priv;
265 demux_packet_t* dp; 269 demux_packet_t* dp;
270
271 if (xmms_length<=0) demuxer->seekable=0;
272 else demuxer->seekable=1;
266 273
267 while (xmms_audiopos<XMMS_PACKETSIZE/2) { 274 while (xmms_audiopos<XMMS_PACKETSIZE/2) {
268 if(priv->ip->get_time()<0) return 0; 275 if((priv->ip->get_time()<0) || !xmms_playing) {
276 xmms_audiopos=0; // xmp on exit waits until buffer is freed somewhat
277 return 0;
278 }
269 usleep(1000); 279 usleep(1000);
270 } 280 }
271 281
272 pthread_mutex_lock(&xmms_mutex); 282 pthread_mutex_lock(&xmms_mutex);
273 dp = new_demux_packet(XMMS_PACKETSIZE/2); 283 dp = new_demux_packet(XMMS_PACKETSIZE/2);
305 priv->spos=pos * (float)(sh_audio->wf->nAvgBytesPerSec);; 315 priv->spos=pos * (float)(sh_audio->wf->nAvgBytesPerSec);;
306 } 316 }
307 317
308 int demux_close_xmms(demuxer_t* demuxer) { 318 int demux_close_xmms(demuxer_t* demuxer) {
309 xmms_priv_t *priv=demuxer->priv; 319 xmms_priv_t *priv=demuxer->priv;
320 xmms_playing=0;
310 priv->ip->stop(); 321 priv->ip->stop();
311 free(priv); demuxer->priv=NULL; 322 free(priv); demuxer->priv=NULL;
312 cleanup_plugins(); 323 cleanup_plugins();
313 return 1; 324 return 1;
314 } 325 }