X11Amp v0.9 Source Released 98
Max Karpiak writes
"The source to X11Amp's new (long awaited) version is
available at the main homepage,
and should hopefully propagate out the to the
US site soon as well.
Go get it. It's cool." Mine's making on the next desktop.
Skin fix (Score:1)
Crackling mp3s w/ Binary X11amp (Score:1)
great news (Score:1)
Currently, I use mpg123, and one of its frontends, GQmpeg. That combination really works well for me because of the 3DNow! support in the latest release of mpg123. The CPU is much less busy now. All things considered, there's nothing bad about this announcement.
yuk. (Score:1)
----------------- ------------ ---- --- - - - -
developers use development libs (Score:1)
it all gets to the users in the end, but developers *use* the bleeding edge stuff. most developers aren't going to give a rat's ass if you don't get the brand spanking new stuff, you can always wait until all the devel libs are into stable. there are many reasons for the developers to use the devel libs: to help guide the next versions, have their input taken, and to be prepared for the future. sure this is a release of x11amp, and you do have a point, but asking a developer to bend over backward and support the present instead of looking to the future is a pretty silly attitude, after all the developers aren't doing this just to make you happy.
my advice, don't ask to be treated like a user : )
Okay, this is annoying. (Score:1)
its all getting to the users eventually (Score:1)
Uhmm... no! (Score:1)
It does not encode MP3. What's the point? (Score:1)
Some anonymous coward wrote:
The main problem with releasing an MP3 encoder with source is, as I understand it, the fact that the mathematical formula for MP3 compression happens to be patented by Fraunhofer GmBH. :P Technically, in those parts of the world that are insane enough to allow patents on mathematical formulas (like the US :( ) one isn't even supposed to create ANY sort of encoder/decoder that can handle MP3s without paying a royalty. :P
Yes, the algorithm has been published as an ISO standard, but thanks to the patent issues it is next to impossible to put out a truly "open" MP3 encoding library, at least in the US and other places that accept US patents as valid. :P
Obvious solutions:
1) Find someone in a country that doesn't recognise software and/or algorithm patents as valid (and which also doesn't have a trade agreement that would mean they have to see US patents as valid) to put out an open library for MP3 encoding, and hope they don't get sued by Fraunhofer GmBH
2) Raise hell with Fraunhofer GmBH to release the MP3 encoder/decoders as open libraries (good luck; I don't even think they have Linux *executables* of the latest version)
3) US-based folks: Raise polite hell using snail-mail with your congress-critters stating that patent law needs reform to prevent abuses [be sure to cite examples such as IBM's recent-ish patent on the wheel]
4) US-based folk, and maybe others--support peaceful protests to get patent law changed, such as some of the ideas proposed on here in past [one of my favourites--get a patent put out that essentially describes the process of patenting, then once it gets approved point out to the patent office that it's prior art by using *THEM* as the example].
Excellent (Score:1)
Pleasantly surprised (Score:1)
Just be happy with have a choice.
tugrul
What on earth *IS* it? (Score:1)
- What the heck *is* X11amp anyway? From the screenshots I can guess that it is a sound thing of some sort, but nothing on the site gives enough information to figure out anything other than that.
Re: (Score:1)
To stop mpg123 from skipping... (Score:1)
gqmpeg has an option to do this; since the new x11amp uses mpg123, it should too.
Woo!! (Score:1)
Okay, this is annoying. (Score:1)
In addition, I suspect that X11Amp uses skins? Those are probably done with GTK+ themes (although I haven't looked at the source yet so take this with a grain of salt
Oh, and much of the stuff you listed should be on any new self-respecting linux system (linuxthreads is part of the standard C library now, imlib has stable versions out there, libpng, libgif (or libungif), and libjpeg are AFAIK optional but recommended (and again, they're stable and, IIRC, used by a bunch of stuff), zlib is pretty much universal--the latest version is 1.1.3 not 1.1.2 which you listed, and imagemagick is unrelated. Don't know what it's doing there. The only exotic and devel stuff I see is GTK+, Glib, and gettext--and I run programs using those almost continually on my system with ABSOLUTELY NO CRASHES DUE TO THE LIBRARIES. And they build quite nicely too (and I'm using the most difficult method of building them) )
Daniel
RE: Okay, this is annoying. (Score:1)
(a) download the tar and extract (www.gtk.org)
(b)
It's stabilizing enough that the recent releases are fairly interchangable.
I believe Debian 2.1 ("frozen", should be released stable RSN) has the relevant imlib, although I could be wrong. I _know_ the rest of the libs should be fine.
Daniel
RE: Okay, this is annoying. (Score:1)
I know. I'm running it.
Daniel
Look at X11Amp's version number! (Score:1)
How are they ever supposed to become stable, if they're basing all of their work on a shaky foundation? The stable versions of most of those libs are there. Use them.
Look at X11Amp's version number! (Score:1)
I think you misinterpret what I mean by "unstable". Not "unstable" as in you link against it and your app crashes and burns. "Unstable" as in it's still in development and therefore subject to change. "Unstable" as in it's still in development, and therefore you can't be assured that everyone has the latest (probably not greatest) version.
GTK 1.0 is stable. Version releases occur infrequently, and people generally have the latest version. If they don't, you can be sure they can safely upgrade to it.
Okay, this is annoying. (Score:2)
I use x11amp 0.7, because I have found nothing particularly better for X. (I'm a pretty big fan of nice GUIs, if I'm gonna have a GUI.) I was going to install 0.9a essentially for the double-size option.
But wow, check out the libraries I'd need:
See a trend? Why do people write so much software that compiles only against developmental/experimental libraries?
Not to mention the stuff that the G-crowd (and E-flock) consider standard, but nobody else has or uses....
Yeah, these new libs (especially gtk) tend to have some neato-burrito whiz-bang wowie-zowie features, but can't we wait til they're something resembling stable? Isn't that why there're separate "stable" and "development" versions?
Slower than older versions (Score:1)
This is just speculation, I haven't actually compiled any MP3 players under normal gcc and pgcc to compare.
It does not encode MP3. What's the point? (Score:1)
... cite examples such as IBM's recent-ish patent on the wheel
Please can someone point me towards this.
Alex
Okay, this is annoying. (Score:1)
Heres yer help. (Score:1)
make SHELL=sh
wont start?
rm -rf ~/.x11amp ; mkdir ~/.x11amp ; mkdir ~/.x11amp/Skins ; chmod +x ~/.x11amp/Skins
Try this test to see how much CPU is really used (Score:1)
mpg123 takes up less CPU for me. How about you?
CPU Hack? Probably...
Try this test to see how much CPU is really used (Score:1)
mpg123 takes up less CPU for me. How about you?
CPU Hack? Probably...
RE: Okay, this is annoying. (Score:1)
I can actually compile Gnome from CVS, because I know what packages have to be installed, and in what order, and even the proper phase of the moon.
However, none of this changes the fact that the new release of X11amp is *terribly* unstable, and IMHO, quite unuseable. Most of the time it won't even draw a window, but instead chooses to die and give an X error.
On the other hand, GQmpeg said very plainly in the README's that it required the 1.0.x libraries, yet it compiled without a whimper and runs beautifully with gtk+/glib-1.1.4 and imlib 1.9.2. Go figure.
Furthermore, mpg123 (it's backend) 0.59q contains 3dNow! support for people like me who have K6-2 CPUs and binutils 2.9.1.0.19a. That means that mpg123 rolls back and forth between 3% and 8% of my total CPU.
Personally, I'll wait for the X11amp guys to attempt to compile their own code before I go back to trying to use the new version.
gdk error? (Score:1)
Look at X11Amp's version number! (Score:1)
I tend to agree with the original thread of this post, but for another reason. Lots of people like to use the latest software, but having the latest version of gtk, and the stable version co-existing is a bit of a pain in the ass. Yes, its possible, but a pain. And some of us still use apps that won't work with gtk 1.1. But then, its nice to use the latest features. I guess you can't please all the people all of the time.
New X11amp is pretty cool, but (Score:1)
Microsoft products (Score:1)
To stop mpg123 from skipping... (Score:1)
Sorry, not cursing at you, but mpg123 in general. kmpg has been annoying me for the longest time with this.
Error I get while configuring (Score:1)
- export PATH=/usr/local/bin:$PATH
to make sure it would pick up the libs I wanted. It configured and compiled perfectly. Here is my ldd of the binary.export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
$ ldd
libgdk_imlib.so.1 =>
libjpeg.so.62 =>
libtiff.so.3 =>
libungif.so.3 =>
libpng.so.2 =>
libz.so.1 =>
libm.so.6 =>
libgtk-1.1.so.11 =>
libgdk-1.1.so.11 =>
libgmodule-1.1.so.12 =>
libglib-1.1.so.12 =>
libdl.so.2 =>
libXext.so.6 =>
libX11.so.6 =>
libpthread.so.0 =>
libc.so.6 =>
Hope this helps...
what's new? (first post!!) (Score:1)
Use the source, Luke! (Score:1)
As others have mentioned, use rpm --erase --nodeps to remove the 1.0.* gtk/gdk and imlib library packages installed with 5.2 (there are three).
One gotcha is that the new stuff requires a binary called libtoolize; grab the libtool SRPM and build/install it; I put it in /usr/local.
Then build and install new 1.1.* versions of the gtk/gdk and imlib libraries from the SRPMS; I install them in /usr/local. Add /usr/local/lib to your /etc/ld.so.conf file and re-run ldconfig.
Now you can build and install x11amp! Good luck.
x11amp 0.9 (Score:1)
The new version uses mpg123, and skips a little more. It seems a bit flakier, but it actually has a *lot* of new features. (feature set -- not just l&f -- reminds me of winamp on my girlfriend's computer)
cheers,
wb
RE: Okay, this is annoying. (Score:1)
cheers,
wb
Great news, real benefits (Score:1)
source before, but couldn't because of the
license. I'm glad it's now under the GNU GPL.
Shuffle? (Score:1)
I noticed shuffle isn't hooked in yet. Here's a quick fix to enable shuffle. It's not an ideal fix, but it'll work until we see another release!
My apologies if the formatting gets screwed up.
*/
//playlist.c
#include "x11amp.h"
GList *playlist=NULL;
GList *playlist_position;
void playlist_clear(void)
{
GList *node;
PlaylistEntry *entry;
if(playlist)
{
if(get_input_playing()) input_stop();
node=playlist;
while(node)
{
entry=(PlaylistEntry *)node->data;
if(entry->filename) g_free(entry->filename);
if(entry->title) g_free(entry->title);
node=node->next;
}
g_list_free(playlist);
playlist=NULL;
playlist_position=NULL;
}
}
void playlist_delete(gboolean crop)
{
gboolean restart_playing=FALSE,set_info_text=FALSE;
GList *node=playlist,*next;
PlaylistEntry *entry;
while(node)
{
entry=(PlaylistEntry *)node->data;
next=g_list_next(node);
if((entry->selected&&!crop)||(!entry->selected&&c
{
if(playlist_position==node)
{
set_info_text=TRUE;
if(get_input_playing())
{
input_stop();
restart_playing=TRUE;
}
if(g_list_next(playlist_position))
playlist_position=g_list_next(playlist_position);
else if(g_list_previous(playlist_position))
playlist_position=g_list_previous(playlist_positi
else if(node!=playlist)
playlist_position=playlist;
else
playlist_position=NULL;
}
if(entry->filename)
g_free(entry->filename);
if(entry->title)
g_free(entry->title);
playlist=g_list_remove_link(playlist,node);
g_free(entry);
g_list_free_1(node);
}
node=next;
}
playlistwin_update_list();
if(set_info_text)
mainwin_set_info_text();
if(restart_playing)
{
if(playlist_position)
playlist_play();
mainwin_set_song_info(0,0,0);
}
}
void playlist_select_all(void)
{
GList *node;
node=playlist;
while(node)
{
((PlaylistEntry *)node->data)->selected=TRUE;
node=node->next;
}
playlistwin_update_list();
}
void playlist_select_none(void)
{
GList *node;
node=playlist;
while(node)
{
((PlaylistEntry *)node->data)->selected=FALSE;
node=node->next;
}
playlistwin_update_list();
}
void playlist_inverse_selection(void)
{
GList *node;
node=playlist;
while(node)
{
((PlaylistEntry *)node->data)->selected=!((PlaylistEntry *)node->data)->selected;
node=node->next;
}
playlistwin_update_list();
}
void playlist_add(gchar *filename)
{
PlaylistEntry *entry;
gchar *ext;
entry=g_malloc0(sizeof(PlaylistEntry));
entry->length=-1;
entry->filename=g_strdup(filename);
if(!playlist)
{
playlist=g_list_append(NULL,entry);
playlist_position=playlist;
}
else
g_list_append(playlist,entry);
}
void playlist_add_dir(gchar *path)
{
DIR *dir;
struct dirent *dirent;
struct stat statbuf;
gchar *filename;
if(dir=opendir(path))
{
while(dirent=readdir(dir))
{
if(dirent->d_name[0]!='.')
{
filename=g_strconcat(path,"/",dirent->d_name,NULL
stat(filename,&statbuf);
if(S_ISDIR(statbuf.st_mode))
playlist_add_dir(filename);
else
playlist_add(filename);
g_free(filename);
}
}
}
}
/*
* I'm not sure if this is the correct way to do it but it seems to work fine
*/
void playlist_add_url_string(gchar *string)
{
gint i=0,start;
gchar *temp,*ext;
struct stat statbuf;
printf("%s\n",string);
while(*string)
{
temp=strchr(string,'\n');
if(temp)
{
if(*(temp-1)=='\r')
*(temp-1)='\0';
*temp='\0';
}
if(!strncasecmp(string,"file:",5))
{
stat(string+5,&statbuf);
if(S_ISDIR(statbuf.st_mode))
playlist_add_dir(string+5);
else
{
ext=strrchr(string+5,'.');
if(ext)
{
if(!strcasecmp(ext,".m3u")||!strcasecmp(ext,".pls
playlist_load(string+5);
else
playlist_add(string+5);
}
else
playlist_add(string+5);
}
}
else
playlist_add(string);
if(!temp)
break;
string=temp+1;
}
}
void playlist_play(void)
{
PlaylistEntry *entry;
gchar *ptr;
if(get_playlist_length()==0)
return;
entry=(PlaylistEntry *)playlist_position->data;
if(get_input_playing()) input_stop();
input_play(entry->filename);
if(input_get_time()!=-1)
input_set_eq(cfg.equalizer_active,cfg.equalizer_p
}
void playlist_set_info(gchar *title,gint length,gint rate,gint freq,gint nch)
{
PlaylistEntry *entry;
entry=(PlaylistEntry *)playlist_position->data;
if(entry->title)
g_free(entry->title);
entry->title=g_strdup(title);
entry->length=length;
mainwin_set_song_info(rate,freq,nch);
mainwin_set_info_text();
playlistwin_update_list();
}
void playlist_next(void)
{
if(!playlist) return;
if(!cfg.shuffle) {
if(g_list_next(playlist_position))
playlist_position=g_list_next(playlist_position);
}
else
playlist_position=g_list_nth(playlist,rand() % get_playlist_length());
if(get_input_playing())
{
input_stop();
playlist_play();
}
else
{
mainwin_set_info_text();
playlistwin_update_list();
}
}
void playlist_prev(void)
{
if(!playlist) return;
if(g_list_previous(playlist_position))
playlist_position=g_list_previous(playlist_positi
if(get_input_playing())
{
input_stop();
playlist_play();
}
else
{
mainwin_set_info_text();
playlistwin_update_list();
}
}
void playlist_set_position(gint pos)
{
if(!playlist) return;
playlist_position=g_list_nth(playlist,pos);
if(get_input_playing())
{
input_stop();
playlist_play();
}
else
{
mainwin_set_info_text();
playlistwin_update_list();
}
}
void playlist_eof_reached(void)
{
input_stop();
if(!cfg.shuffle) {
if(!g_list_next(playlist_position))
{
playlist_position=playlist;
if(!cfg.repeat)
{
mainwin_set_song_info(0,0,0);
mainwin_set_info_text();
return;
}
}
else
playlist_position=g_list_next(playlist_position);
}
else
playlist_position=g_list_nth(playlist,rand() % get_playlist_length());
playlist_play();
}
gint get_playlist_length(void)
{
if(!playlist)
return 0;
return g_list_length(playlist);
}
gchar *playlist_get_info_text(void)
{
PlaylistEntry *entry;
gchar *text=NULL,*title,*tmp,*tmp2;
gint i;
if(playlist)
{
entry=(PlaylistEntry *)playlist_position->data;
if(entry->title)
title=entry->title;
else
{
title=strrchr(entry->filename,'/');
if(!title)
title=entry->filename;
else
title++;
}
text=g_malloc(strlen(title)+20);
if(entry->length!=-1)
sprintf(text,"%d. %s (%d:%-2.2d)",get_playlist_position()+1,title,entr
else
sprintf(text,"%d. %s",get_playlist_position()+1,title);
if(cfg.convert_underscore)
while(tmp=strchr(text,'_'))
*tmp=' ';
if(cfg.convert_twenty)
while(tmp=strstr(text,"%20"))
{
tmp2=tmp+3;
*(tmp++)=' ';
while(*tmp2)
*(tmp++)=*(tmp2++);
*tmp='\0';
}
}
return text;
}
int playlist_get_current_length(void)
{
PlaylistEntry *entry;
if(!playlist) return 0;
entry=(PlaylistEntry *)playlist_position->data;
return entry->length;
}
gboolean playlist_save(gchar *filename)
{
PlaylistEntry *entry;
GList *node;
FILE *file;
gchar *ext;
gboolean is_pls=FALSE;
if(file=fopen(filename,"w"))
{
ext=strrchr(filename,'.');
if(ext)
if(!strcasecmp(ext,".pls"))
{
is_pls=TRUE;
fprintf(file,"[playlist]\n");
fprintf(file,"NumberOfEntries=%d\n",get_playlist_
}
node=playlist;
while(node)
{
entry=(PlaylistEntry *)node->data;
if(is_pls)
fprintf(file,"File%d=%s\n",g_list_position(playli
else
fprintf(file,"%s\n",entry->filename);
node=node->next;
}
fclose(file);
return TRUE;
}
return FALSE;
}
gboolean playlist_load(gchar *filename)
{
FILE *file;
gchar *line,*ext,key[10];
gint i,noe;
int linelen=1024;
ext=strrchr(filename,'.');
if(!ext) ext=".m3u";
if(!strcasecmp(ext,".pls"))
{
if(line=read_ini_string(filename,"playlist","Numb
{
noe=atoi(line);
g_free(line);
}
else
return FALSE;
for(i=1;i=noe;i++)
{
g_snprintf(key,10,"File%d",i);
if(line=read_ini_string(filename,"playlist",key))
{
playlist_add(line);
g_free(line);
}
}
return TRUE;
}
else
{
if(file=fopen(filename,"r"))
{
line=g_malloc(linelen);
while(fgets(line,linelen,file))
{
while(strlen(line)==linelen-1&&line[strlen(line)-
{
linelen+=1024;
line=(gchar *)g_realloc(line,linelen);
fgets(&line[strlen(line)],1024,file);
}
while(line[strlen(line)-1]=='\r'||line[strlen(lin
playlist_add(line);
}
fclose(file);
return TRUE;
}
}
return FALSE;
}
GList *get_playlist(void)
{
return playlist;
}
gint get_playlist_position(void)
{
return g_list_position(playlist,playlist_position);
}
gint playlist_sort_by_title_cmpfunc(PlaylistEntry *a,PlaylistEntry *b)
{
gchar *a_title=NULL,*b_title=NULL;
if(a->title)
a_title=a->title;
else
{
if(a->filename[0]='/')
a_title=strrchr(a->filename,'/')+1;
if(!a_title)
a_title=a->filename;
}
if(b->title)
b_title=b->title;
else
{
if(b->filename[0]='/')
b_title=strrchr(b->filename,'/')+1;
if(!b_title)
b_title=b->filename;
}
return strcasecmp(a_title,b_title);
}
void playlist_sort_by_title(void)
{
playlist=g_list_sort(playlist,(GCompareFunc)playl
}
gint playlist_sort_by_filename_cmpfunc(PlaylistEntry *a,PlaylistEntry *b)
{
gchar *a_filename=NULL,*b_filename=NULL;
if(a->filename[0]='/')
a_filename=strrchr(a->filename,'/')+1;
if(!a_filename)
a_filename=a->filename;
if(b->filename[0]='/')
b_filename=strrchr(b->filename,'/')+1;
if(!b_filename)
b_filename=b->filename;
return strcasecmp(a_filename,b_filename);
}
void playlist_sort_by_filename(void)
{
playlist=g_list_sort(playlist,(GCompareFunc)playl
}
gint playlist_sort_by_path_cmpfunc(PlaylistEntry *a,PlaylistEntry *b)
{
return strcasecmp(a->filename,b->filename);
}
void playlist_sort_by_path(void)
{
playlist=g_list_sort(playlist,(GCompareFunc)playl
}
void playlist_reverse(void)
{
playlist=g_list_reverse(playlist);
}
Winning users are annoying (Score:1)
1. x11amp is free
2. Gtk+ 1.1.14 is pretty close to Gtk+ 1.2.0
3. There are a fairly large number of differences between the two, depending on what you are doing.
4. Pursuant to #4, if your code heavily uses the heavily affected areas, it will be a lot of work to switch.
5. Seeing as how both 2 & 4 are true, it will minize your work the most to use Gtk+ 1.1 until 1.2 comes out.
6. Seeing as how 1 & 5 are true, your best course of action is to use Gtk+ 1.1 until Gtk+ 1.2 comes out.
7. Some users might complain that they don't get to use your bleeding edge program without using the bleeding edge libraries.
8. Pursuant to 7, your best course of action is to politely point out the GPL on your program, and invite them to patch their copy to work with non-development libraries, and then distribute it if they wish.
9. Some users won't do any work but sit around and complain that people aren't giving them free stuff exactly how they want it.
10. Point out that they aren't really who are meant to get the software, they are just a sideeffect of the freedom involved.
11. Also point out that a little humility and gratitude go a long way.
12. Also point out that it is improper for a non-coder to criticise the ways of a coder, or for a beginning coder to criticize the decisions of a master coder.
Look, it's one thing if you are poitning out some sort of moral issue, free versus proprietary, etc. That's everyone's duty to (a) complain about and (b) fix as best they can. Every good open source application that's written weakens the power of closed source software, and every voice that cries against proprietary software helps, too. The money that purchases open source CDs, hires open source programmers, reads open source magazines, buys computers from vendors who install open source operating systems, or purchases services and manuals from open source developers helps even more. This has absolutely nothing to do with that. Do you have something more valid to say than open source developers shouldn't develop for their target platforms, but instead for older ones? I bet, if you look at it, that X11amp will be in its stable version around the time that Gtk+ 1.2 comes out. Therefore that is probably its target platform. If there target platform is Gtk+ 1.2, it makes a hell of a lot more sense to develop on Gtk+ 1.1.x then 1.0.x. It's one thing to switch in the middle of a stable version, but you're complaining about a development version being in development?
Lastly, x11amp is an mp3 player. This isn't the kernel or libc that we're talking about. you can (a) live without it for a few months and (b) choose another one. Just learn from the closing verse to MST3K's theme song, "Repeat to yourself 'It's just a show' - I should really just relax!"
developers use development libs (Score:1)
Finally I get this for my PPC box (Score:1)
nervermind (Score:1)