/* Analog VU meter plugin for xmms * * Copyright (C) 2002 Pekka Harjamäki * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #if HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include #include "vumeter.h" extern struct vumeter_skin_info vumeter_skin; extern struct vumeter_cfg_info vumeter_cfg; extern float left_needle_power[max_avarage_samples], right_needle_power[max_avarage_samples]; extern GdkPixbuf *background, *titlebar_on,*titlebar_off, *skin_pic, *vumeterwin, *overlayimg, *led_on_img, *led_off_img; extern GdkGC *linestyle; extern GtkWidget *clist_skinlist; extern gint skinlist_cnt; /***************************************************************** Load list of skins in directory *****************************************************************/ void vumeter_skin_parse_dvu(char channel,char *var_value,char *skindir) { gchar **temppi; struct stat statbuf; char tmp[1024]; int x_pos,y_pos; // channel must be either 0 (left) or 1 (right) if(channel<0 || channel>1) return; // Parse values from var_value temppi=g_strsplit(var_value,",",2); if(temppi[2]==NULL) { g_strfreev(temppi); return; } if(temppi[1]==NULL) { g_strfreev(temppi); return; } if(temppi[0]==NULL) { g_strfreev(temppi); return; } g_strstrip(temppi[0]); g_strstrip(temppi[1]); g_strstrip(temppi[2]); // Are the coordinate values correct (larger than 0) x_pos=atoi(temppi[0]); y_pos=atoi(temppi[1]); if(x_pos<0 || y_pos<0) { g_strfreev(temppi); return; } // See if image exists sprintf(tmp,"%s/%s",skindir,temppi[2]); if(lstat(tmp,&statbuf)==-1) { g_strfreev(temppi); return; } // Most likely we have valid line, so store it g_strfreev(temppi); } int vumeter_test_skin(char *name,char *directory) { char dir[1024]; struct stat statbuf; /* Let's try to load skin defined in name variable, or fall back to default images */ if(name=="" || name==NULL || strcmp(name,".")==0 || strcmp(name,"..")==0 || strlen(name)>150) return(0); if(directory==NULL) { sprintf(dir,"%s/.xmms/VU_Meter_skins/%s",g_get_home_dir(),name); if(lstat(dir,&statbuf) || !S_ISDIR(statbuf.st_mode)) { sprintf(dir,"%s/%s",global_skin_dir,name); if(lstat(dir,&statbuf) || !S_ISDIR(statbuf.st_mode)) { printf("[VUmeter plugin error]: No skins found matching name %s!\n",name); return(0); } } } else { sprintf(dir,"%s/%s",directory,name); if(lstat(dir,&statbuf) || !S_ISDIR(statbuf.st_mode)) { return(0); } } return(1); } void scan_skin_dir(char *dir_path) { DIR *dir; struct dirent *dir_ent; struct stat statbuf; char file[1024],directory[1024]; char *skin_data[2]; if(strcmp(dir_path,"home")==0) { sprintf(directory,"%s/.xmms/VU_Meter_skins",g_get_home_dir()); } else if(strcmp(dir_path,"global")==0) { sprintf(directory,global_skin_dir); } else { strncpy(directory,dir_path,1020); } if( (dir=opendir(directory)) ) { while( (dir_ent=readdir(dir)) ) if( strcmp(dir_ent->d_name,"..")!=0 && strcmp(dir_ent->d_name,".")!=0 ) { sprintf(file,"%s/%s",directory,dir_ent->d_name); if(!lstat(file,&statbuf) && S_ISDIR(statbuf.st_mode)) { skin_data[0]=dir_ent->d_name; skin_data[1]=file; gtk_clist_append(GTK_CLIST(clist_skinlist),skin_data); // Select row, if it is the same as loaded skin if(strcmp(dir_ent->d_name,vumeter_skin.name)==0) { gtk_clist_select_row(GTK_CLIST(clist_skinlist),skinlist_cnt,1); } // Increase skin count skinlist_cnt++; } } closedir(dir); } } /******************************************************* Split string from delim and place results to dstX *******************************************************/ void splitstr(char *dst1, char *dst2, char *src, char delim) { int i=0, j=0, srclen=0; srclen=strlen(src); for (i=0; i3 ) { splitstr(var_name,var_value,line,'='); g_strstrip(var_name); g_strstrip(var_value); g_strup(var_name); memset(line,0,1020); if (strcmp(var_name, "EXIT_X1")==0) vumeter_skin.exit_x1=atoi(var_value); else if(strcmp(var_name, "EXIT_X2")==0) vumeter_skin.exit_x2=atoi(var_value); else if(strcmp(var_name, "EXIT_Y1")==0) vumeter_skin.exit_y1=atoi(var_value); else if(strcmp(var_name, "EXIT_Y2")==0) vumeter_skin.exit_y2=atoi(var_value); else if(strcmp(var_name, "ENABLE_LEFT_MIRROR")==0) vumeter_skin.left_mirror=atoi(var_value); else if(strcmp(var_name, "ENABLE_RIGHT_MIRROR")==0) vumeter_skin.right_mirror=atoi(var_value); else if(strcmp(var_name, "ENABLE_OVERLAY_IMG")==0) vumeter_skin.overlay_enabled=atoi(var_value); else if(strcmp(var_name, "ENABLE_DIGITAL_VU")==0) vumeter_skin.digitalvu_enabled=atoi(var_value); else if(strcmp(var_name, "ENABLE_ANALOG_VU")==0) vumeter_skin.analogvu_enabled=atoi(var_value); else if(strcmp(var_name, "ENABLE_CLIPPING_LED")==0) vumeter_skin.clipping_led=atoi(var_value); else if(strcmp(var_name, "CONFIG_X1")==0) vumeter_skin.config_x1=atoi(var_value); else if(strcmp(var_name, "CONFIG_X2")==0) vumeter_skin.config_x2=atoi(var_value); else if(strcmp(var_name, "CONFIG_Y1")==0) vumeter_skin.config_y1=atoi(var_value); else if(strcmp(var_name, "CONFIG_Y2")==0) vumeter_skin.config_y2=atoi(var_value); else if(strcmp(var_name, "LEFT_RADIUS")==0) vumeter_skin.left_rad=atof(var_value); else if(strcmp(var_name, "LEFT_XSTART")==0) vumeter_skin.left_x=atoi(var_value); else if(strcmp(var_name, "LEFT_YSTART")==0) vumeter_skin.left_y=atoi(var_value); else if(strcmp(var_name, "RIGHT_RADIUS")==0) vumeter_skin.right_rad=atof(var_value); else if(strcmp(var_name, "RIGHT_XSTART")==0) vumeter_skin.right_x=atoi(var_value); else if(strcmp(var_name, "RIGHT_YSTART")==0) vumeter_skin.right_y=atoi(var_value); else if(strcmp(var_name, "OVERLAY_X")==0) vumeter_skin.overlay_x=atoi(var_value); else if(strcmp(var_name, "OVERLAY_Y")==0) vumeter_skin.overlay_y=atoi(var_value); else if(strcmp(var_name, "LED_LEFT_X")==0) vumeter_skin.led_left_x=atoi(var_value); else if(strcmp(var_name, "LED_LEFT_Y")==0) vumeter_skin.led_left_y=atoi(var_value); else if(strcmp(var_name, "LED_RIGHT_X")==0) vumeter_skin.led_right_x=atoi(var_value); else if(strcmp(var_name, "LED_RIGHT_Y")==0) vumeter_skin.led_right_y=atoi(var_value); else if(strcmp(var_name, "TITLEBAR_HEIGHT")==0) vumeter_skin.titlebar_ymax=atoi(var_value); else if(strcmp(var_name, "NEEDLE_WIDTH")==0) vumeter_skin.line_width=atoi(var_value); else if(strcmp(var_name, "NEEDLE_COLOR")==0) vumeter_skin.line_color=convert_linecolor(var_value); else if(strcmp(var_name, "NEEDLE_MIN_ANGLE")==0) vumeter_skin.needle_min_angle=atoi(var_value); else if(strcmp(var_name, "NEEDLE_MAX_ANGLE")==0) vumeter_skin.needle_max_angle=atoi(var_value); else if(strcmp(var_name, "LED_ON_IMG")==0) strncpy(led_on_iname,var_value,200); else if(strcmp(var_name, "LED_OFF_IMG")==0) strncpy(led_off_iname,var_value,200); else if(strcmp(var_name, "BACKGROUND_IMG")==0) strncpy(back_img,var_value,200); else if(strcmp(var_name, "OVERLAY_IMG")==0) strncpy(overlay_img,var_value,200); else if(strcmp(var_name, "TITLEBAR_ON_IMG")==0) strncpy(titleon_img,var_value,200); else if(strcmp(var_name, "TITLEBAR_OFF_IMG")==0) strncpy(titleoff_img,var_value,200); else if(strcmp(var_name, "DB_RANGE")==0) vumeter_skin.db_min_range=atoi(var_value); else if(strncmp(var_name, "LEFT_DVU",8)==0) vumeter_skin_parse_dvu(0,var_value,dir); else if(strncmp(var_name, "RIGHT_DVU",9)==0) vumeter_skin_parse_dvu(1,var_value,dir); } } fclose(fp); } else { printf("[VUmeter plugin error]: Directory %s found, but no skin.cfg so loading aborted!\n",dir); return(0); } /* Make sure, that DB_RANGE has sensible values */ if(vumeter_skin.db_min_range>-5) vumeter_skin.db_min_range=-5; if(vumeter_skin.db_min_range<-91) vumeter_skin.db_min_range=-91; for(loop=0; loop4 && back_img[0]!=0) { sprintf(file,"%s/%s",dir,back_img); skin_pic=gdk_pixbuf_new_from_file(file); if(!skin_pic) { printf("[VUmeter plugin error]: Error loading Skin (background) (%s)!\n",file); } } if(strlen(titleon_img)>4 && titleon_img[0]!=0) { sprintf(file,"%s/%s",dir,titleon_img); titlebar_on=gdk_pixbuf_new_from_file(file); if(!titlebar_on) { printf("[VUmeter plugin error]: Error loading Skin (titlebar_on) (%s)!\n",file); } } if(strlen(titleoff_img)>4 && titleoff_img[0]!=0) { sprintf(file,"%s/%s",dir,titleoff_img); titlebar_off=gdk_pixbuf_new_from_file(file); if(!titlebar_off) { printf("[VUmeter plugin error]: Error loading Skin (titlebar_off) (%s)!\n",file); } } // If either titleoff or titleon image is missing, we can replace the missing // one, with the image we managed to load if(titlebar_off==NULL && titlebar_on!=NULL) titlebar_off=gdk_pixbuf_copy(titlebar_on); if(titlebar_on==NULL && titlebar_off!=NULL) titlebar_on=gdk_pixbuf_copy(titlebar_off); if(titlebar_on==NULL && titlebar_off==NULL) { printf("[VUmeter plugin error]: Both titlebar images are missing from skin!"); } // Load overlay image if(strlen(overlay_img)>4 && overlay_img[0]!=0 && vumeter_skin.overlay_enabled==1) { sprintf(file,"%s/%s",dir,overlay_img); overlayimg=gdk_pixbuf_new_from_file(file); if(!overlayimg) { printf("[VUmeter plugin error]: Error loading Skin (overlay image) (%s)!\n",file); vumeter_skin.overlay_enabled=0; } else { vumeter_skin.overlay_enabled=1; } } else { vumeter_skin.overlay_enabled=0; } if(strlen(led_on_iname)>4 && vumeter_skin.clipping_led==1 && led_on_iname[0]!=0) { sprintf(file,"%s/%s",dir,led_on_iname); led_on_img=gdk_pixbuf_new_from_file(file); if(!led_on_img) { printf("[VUmeter plugin error]: Error loading Skin (led on image) (%s)!\n",file); vumeter_skin.clipping_led=0; } } if(strlen(led_off_iname)>4 && vumeter_skin.clipping_led==1 && led_off_iname[0]!=0) { sprintf(file,"%s/%s",dir,led_off_iname); led_off_img=gdk_pixbuf_new_from_file(file); if(!led_off_img) { printf("[VUmeter plugin error]: Error loading Skin (led off image) (%s)!\n",file); vumeter_skin.clipping_led=0; } } if(background==NULL) { background=gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8,vumeter_skin.width , vumeter_skin.height); if(!background) { printf("[VUmeter plugin error]: Allocation of background buffer failed\n"); } } /* Set Draw style */ gdk_rgb_gc_set_foreground (linestyle,vumeter_skin.line_color); gdk_gc_set_line_attributes(linestyle, vumeter_skin.line_width , GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER); /* Create basic skin */ gdk_pixbuf_copy_area( titlebar_on,0,0,vumeter_skin.width,gdk_pixbuf_get_height(titlebar_on), background,0,0); gdk_pixbuf_copy_area( skin_pic,0,0,vumeter_skin.width,gdk_pixbuf_get_height(skin_pic), background,0,gdk_pixbuf_get_height(titlebar_on)); return(1); }