#include "audio.h" #include AUDIO_session audio_session; 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_taglib(const char *url, AUDIO_metadata *mdata){ int i; int seconds; int minutes; TagLib_File *file; TagLib_Tag *tag; const TagLib_AudioProperties *properties; /* Clear out the meta struct */ mdata->title[0]=0; mdata->artist[0]=0; mdata->album[0]=0; mdata->year[0]=0; mdata->track[0]=0; taglib_set_strings_unicode(1); file = taglib_file_new(url); if(file == NULL)return 1; tag = taglib_file_tag(file); properties = taglib_file_audioproperties(file); strcpy(mdata->title,taglib_tag_title(tag)); strcpy(mdata->artist,taglib_tag_artist(tag)); strcpy(mdata->album,taglib_tag_album(tag)); sprintf(mdata->year,"%i",taglib_tag_year(tag)); sprintf(mdata->track,"%i",taglib_tag_track(tag)); /* seconds = taglib_audioproperties_length(properties) % 60; minutes = (taglib_audioproperties_length(properties) - seconds) / 60; printf("-- AUDIO --\n"); printf("bitrate - %i\n", taglib_audioproperties_bitrate(properties)); printf("sample rate - %i\n", taglib_audioproperties_samplerate(properties)); printf("channels - %i\n", taglib_audioproperties_channels(properties)); printf("length - %i:%02i\n", minutes, seconds); */ taglib_tag_free_strings(); taglib_file_free(file); 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 */ mdata->title[0]=0; mdata->artist[0]=0; mdata->album[0]=0; mdata->year[0]=0; mdata->track[0]=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)strcpy(mdata->title,info); info =xine_get_meta_info (s->mstream,XINE_META_INFO_ARTIST ); if(info)strcpy(mdata->artist,info); info = xine_get_meta_info (s->mstream,XINE_META_INFO_ALBUM ); if(info)strcpy(mdata->album,info); info = xine_get_meta_info (s->mstream,XINE_META_INFO_YEAR ); if(info)strcpy(mdata->year,info); info = xine_get_meta_info (s->mstream,XINE_META_INFO_TRACK_NUMBER); if(info)strcpy(mdata->track,info); xine_close(s->mstream); return 0; } int AUDIO_init(AUDIO_session *s, char *audiodriver){ 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); /* 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){ xine_open(s->stream, url); xine_play(s->stream, 0, 0); sleep(10); xine_stop(s->stream); xine_close(s->stream); return 0; } int AUDIO_dinit(AUDIO_session *s){ printf("audi dinit\n"); // xine_event_dispose_queue(event_queue); xine_dispose(s->mstream); xine_dispose(s->stream); xine_close_audio_driver(s->xine, s->ao_port); xine_exit(s->xine); return 0; }