All pastes #1752725 Raw Edit

C

public c v1 · immutable
#1752725 ·published 2010-01-15 19:40 UTC
rendered paste body
#include "audio.h"#include "xine_driver.h"int AUDIO_is_audio(AUDIO_SESSION *s,const char *url){	int rv;	const char *info;	char *cptr;	if(!s->mstream){		printf("AUDIO_get_metedata error\n");		return 1;	}	/* First Pass file filter */	cptr = strrchr(url,'.');	if(cptr){		/* In order from MOST likely to LEAST likely */		if(!strcasecmp(cptr,".jpg"))return 1;		if(!strcasecmp(cptr,".png"))return 1;		if(!strcasecmp(cptr,".gif"))return 1;		if(!strcasecmp(cptr,".jpeg"))return 1;	}			rv = xine_open(s->mstream, url);			/* Second Pass file filter */	/* FIXME: Find a better/faster way of filtering streams */	// Note: INFO_AUDIO_HANDLED is true for pictures 	if(!xine_get_stream_info(s->mstream,XINE_STREAM_INFO_AUDIO_HANDLED)){		xine_close(s->mstream);			return 1;	}	xine_close(s->mstream);		return 0;}int AUDIO_get_metadata(AUDIO_SESSION *s, const char *url, AUDIO_metadata *mdata){	int rv;	const char *info;	char *cptr;	if(!s->mstream){		printf("AUDIO_get_metedata error\n");		return 1;	}			/* Clear out the meta struct */	/* may not even be necessary */	mdata->title[0]=0;	mdata->artist[0]=0;	mdata->album[0]=0;	mdata->year=0;	mdata->track=0;	rv = AUDIO_is_audio(s,url);	if(rv)return 1;	rv = xine_open(s->mstream, url);	/* Copy metadata into meta data struct */	info=xine_get_meta_info (s->mstream,XINE_META_INFO_TITLE );	if(info)strncpy(mdata->title,info,LONG_FIELD);	info =xine_get_meta_info (s->mstream,XINE_META_INFO_ARTIST );	if(info)strncpy(mdata->artist,info,LONG_FIELD);	info = xine_get_meta_info (s->mstream,XINE_META_INFO_ALBUM );	if(info)strncpy(mdata->album,info,LONG_FIELD);	info = xine_get_meta_info (s->mstream,XINE_META_INFO_YEAR );	if(info)mdata->year = atoi(info);	info = xine_get_meta_info (s->mstream,XINE_META_INFO_TRACK_NUMBER);	if(info)mdata->track = atoi(info);        mdata->title[LONG_FIELD-1]=0;        mdata->artist[LONG_FIELD-1]=0;        mdata->album[LONG_FIELD-1]=0;	xine_close(s->mstream);		return 0;}int AUDIO_driver_init(AUDIO_SESSION *s, const char *audiodriver){	printf("XINE_driver - init\n");	s->xine = xine_new();	//sprintf(configfile, "%s%s", xine_get_homedir(), "/.xine/config");	xine_config_load(s->xine, "/home/vikky/.xine/config");	xine_init(s->xine);	/* Open playback stream */	s->ao_port = xine_open_audio_driver(s->xine , audiodriver, NULL);	s->stream = xine_stream_new(s->xine, s->ao_port,NULL);	/* Register stream with event callback */	s->event_queue = xine_event_new_queue(s->stream);	xine_event_create_listener_thread(s->event_queue, 		XINE_DRIVER_event_listener,s);		/* Open a stream with no drivers for meta data collection */	s->mstream = xine_stream_new(s->xine, NULL,NULL);	printf("Status: %i\n",xine_get_error(s->mstream));	if(!s->mstream){		printf("AUDIO init error\n");		return 1;	}	return 0;}int AUDIO_play(AUDIO_SESSION *s,char *url, int seek){	int rv=0;	/* XINE uses negative logic, 1=OK, 0=BAD */	if(url== NULL)goto just_play;	rv = xine_open(s->stream, url);	if(!rv){		fprintf(stderr,"ERROR: AUDIO_play: Cannot open stream: %s\n",url);		fprintf(stderr,"ERROR: AUDIO_play: Xine Error %i\n",			xine_get_error(s->stream));		fprintf(stderr,"ERROR: AUDIO_play: Xine Status %i\n",			xine_get_status(s->stream));		return 1;	}	/* Get the stream length for our audio session */	int blah;	xine_get_pos_length(s->stream,&blah,&blah,&s->length);	s->length = (s->length+500)/1000; // Xine returns in milliseconds 	just_play:	/* NULL position */	rv = xine_play(s->stream, 0, seek*1000);	if(!rv){		fprintf(stderr,"ERROR: AUDIO_play: Cannot play stream: %s\n",url);		return 1;	}		s->playing = 1;	s->AUDIO_UI_caller(AUDIO_START,s->cdata);	return 0;}int AUDIO_stop(AUDIO_SESSION *s){	xine_stop(s->stream);	s->playing =0;	s->AUDIO_UI_caller(AUDIO_STOP,s->cdata);	return 0;}	int AUDIO_driver_dinit(AUDIO_SESSION *s){	printf("audi dinit\n");	//  xine_event_dispose_queue(event_queue);	if(s==NULL)return 0;	if(s->mstream)xine_dispose(s->mstream);	if(s->stream)xine_dispose(s->stream);	if(s->xine && s->ao_port){		xine_close_audio_driver(s->xine, s->ao_port);		xine_exit(s->xine);	}	return 0;}int AUDIO_get_position(AUDIO_SESSION *s,int *pos_time){	int bl,ah;	int rv;	rv = xine_get_pos_length(s->stream,&bl,pos_time,&ah);	/* Xine returns the time in milliseconds, so divide and round off*/	// 1 000  = 1s,  1 555 = 2s	*pos_time = (*pos_time+500)/1000;	return !rv;}static void XINE_DRIVER_event_listener(void *user_data, const xine_event_t *event) {	AUDIO_SESSION *s;	s = (AUDIO_SESSION*)user_data;	switch(event->type) {	case XINE_EVENT_UI_PLAYBACK_FINISHED:		s->playing = 0;		xine_close(s->stream);		s->AUDIO_UI_caller(AUDIO_END,s->cdata);		break;	}}