summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-05-17 21:25:22 +0200
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-05-17 21:25:22 +0200
commitcafa41031499e9dff3a0c4f9f30d822c981d0ce2 (patch)
tree58f37717c06a9d98e3b5c01d3b6240954598781f
parent229606b402f71bfe6c0ccd68b355f9f4172ba3d6 (diff)
parentd5eeb44a9d05a1b8072fc090fe07d7a13a8bfb06 (diff)
Merge branch 'master' into i18n
Conflicts: plugins/gtkui/callbacks.c plugins/gtkui/prefwin.c
-rw-r--r--ChangeLog24
-rw-r--r--playlist.c1
-rw-r--r--plugins/flac/flac.c33
-rw-r--r--plugins/gtkui/callbacks.c54
-rw-r--r--plugins/gtkui/ddblistview.c2
-rw-r--r--plugins/gtkui/fileman.c2
-rw-r--r--plugins/gtkui/gtkui.c84
-rw-r--r--plugins/gtkui/gtkui.h3
-rw-r--r--plugins/gtkui/prefwin.c79
-rw-r--r--plugins/vorbis/vorbis.c8
-rw-r--r--plugins/wavpack/wavpack.c9
-rw-r--r--streamer.c31
-rw-r--r--web/faq.txt73
-rw-r--r--web/index.html254
-rw-r--r--web/oldnews.html308
15 files changed, 191 insertions, 774 deletions
diff --git a/ChangeLog b/ChangeLog
index d07f6235..42808364 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,27 @@
+version 0.4.1
+ fixed search window size
+ better tag reader in ffmpeg plugin + reload metadata support
+ fixed EQ drawing unwanted current value at initialization
+ allow editing previous custom grouping value
+ increased sort speed
+ fixed alsa and oss plugins writing zero samples at start of tracks
+ fixed recover from suspend in alsa plugin
+ fixed md5 structure buffer overflow
+ added support for gtk3 (2.90), enabled with --enable-gtk3
+ improved oss plugin responsiveness on pause
+ fixed vfs_curl crashing randomly when loading album art
+ ignore currently paused song when opening new file(s) from commandline
+ fixed playlist moving bugs
+ fixed memory leaks in id3v2 parser
+ increased maximum limit on id3v2 APIC frame size to 2MiB
+ added cd text support
+ fixed wavpack crash on corrupted files
+ fixed random crash when using File -> Open
+ added remember/restore current folder in playlist save/load dialogs
+ fixed reversing track order after drag-n-drop
+ fixed "Loop single file" mode after track was moved or deleted
+ removed apply button from Global Hotkeys preferences window
+
version 0.4.0
multiple tabbed playlists
added grouping of tracks using title-formatting strings
diff --git a/playlist.c b/playlist.c
index 47054e7e..04993d9d 100644
--- a/playlist.c
+++ b/playlist.c
@@ -2813,6 +2813,7 @@ pl_move_items (int iter, int plt_from, playItem_t *drop_before, uint32_t *indexe
plt_remove_item (playlist, it);
plt_insert_item (to, drop_after, it);
pl_item_unref (it);
+ drop_after = it;
processed++;
}
}
diff --git a/plugins/flac/flac.c b/plugins/flac/flac.c
index cc4a52f0..43b1b1c0 100644
--- a/plugins/flac/flac.c
+++ b/plugins/flac/flac.c
@@ -44,7 +44,6 @@ typedef struct {
int totalsamples;
int flac_critical_error;
int init_stop_decoding;
- int bytesread;
DB_FILE *file;
// used only on insert
@@ -52,13 +51,13 @@ typedef struct {
DB_playItem_t *last;
DB_playItem_t *it;
const char *fname;
+ int bitrate;
} flac_info_t;
// callbacks
FLAC__StreamDecoderReadStatus flac_read_cb (const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) {
flac_info_t *info = (flac_info_t *)client_data;
size_t r = deadbeef->fread (buffer, 1, *bytes, info->file);
- info->bytesread += r;
*bytes = r;
if (r == 0) {
return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
@@ -102,16 +101,8 @@ cflac_write_callback (const FLAC__StreamDecoder *decoder, const FLAC__Frame *fra
if (frame->header.blocksize == 0) {
return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
}
- //DB_fileinfo_t *_info = info->info;
- //flac_info_t *info = (flac_info_t *)_info;
- int bitrate = -1;
- float sec = ((float)frame->header.blocksize / frame->header.sample_rate);
- if (info->bytesread != 0 && sec > 0) {
- bitrate = info->bytesread / sec * 8;
- }
- info->bytesread = 0;
- if (bitrate > 0) {
- deadbeef->streamer_set_bitrate (bitrate/1000);
+ if (info->bitrate > 0) {
+ deadbeef->streamer_set_bitrate (info->bitrate);
}
int bufsize = BUFFERSIZE - info->remaining;
int bufsamples = bufsize / (_info->channels * _info->bps / 8);
@@ -148,6 +139,7 @@ cflac_metadata_callback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMe
_info->samplerate = metadata->data.stream_info.sample_rate;
_info->channels = metadata->data.stream_info.channels;
_info->bps = metadata->data.stream_info.bits_per_sample;
+
}
static void
@@ -258,6 +250,23 @@ cflac_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
trace ("cflac_init not a flac stream\n");
return -1;
}
+
+ // bitrate
+ size_t fsize = deadbeef->fgetlength (info->file);
+ FLAC__uint64 position;
+ FLAC__bool res = FLAC__stream_decoder_get_decode_position (info->decoder, &position);
+ if (res) {
+ fsize -= position;
+ }
+ FLAC__uint64 flac_totalsamples = FLAC__stream_decoder_get_total_samples (info->decoder);
+ float sec = flac_totalsamples / _info->samplerate;
+ if (sec > 0) {
+ info->bitrate = fsize / sec * 8 / 1000;
+ }
+ else {
+ info->bitrate = -1;
+ }
+
info->buffer = malloc (BUFFERSIZE);
info->remaining = 0;
if (it->endsample > 0) {
diff --git a/plugins/gtkui/callbacks.c b/plugins/gtkui/callbacks.c
index 7298cdd5..4d967bc7 100644
--- a/plugins/gtkui/callbacks.c
+++ b/plugins/gtkui/callbacks.c
@@ -357,60 +357,6 @@ on_searchlist_realize (GtkWidget *widget,
{
}
-char last_playlist_save_name[1024] = "";
-
-void
-save_playlist_as (void) {
- GtkWidget *dlg = gtk_file_chooser_dialog_new (_("Save Playlist As"), GTK_WINDOW (mainwin), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL);
-
- gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dlg), TRUE);
- gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dlg), "untitled.dbpl");
-
- GtkFileFilter* flt;
- flt = gtk_file_filter_new ();
- gtk_file_filter_set_name (flt, _("DeaDBeeF playlist files (*.dbpl)"));
- gtk_file_filter_add_pattern (flt, "*.dbpl");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dlg), flt);
-
- if (gtk_dialog_run (GTK_DIALOG (dlg)) == GTK_RESPONSE_OK)
- {
- gchar *fname = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dlg));
- gtk_widget_destroy (dlg);
-
- if (fname) {
- int res = deadbeef->pl_save (fname);
- if (res >= 0 && strlen (fname) < 1024) {
- strcpy (last_playlist_save_name, fname);
- }
- g_free (fname);
- }
- }
- else {
- gtk_widget_destroy (dlg);
- }
-}
-
-void
-on_playlist_save_activate (GtkMenuItem *menuitem,
- gpointer user_data)
-{
- if (!last_playlist_save_name[0]) {
- save_playlist_as ();
- }
- else {
- /*int res = */deadbeef->pl_save (last_playlist_save_name);
- }
-}
-
-
-void
-on_playlist_save_as_activate (GtkMenuItem *menuitem,
- gpointer user_data)
-{
- save_playlist_as ();
-}
-
-
//static GdkPixmap *seekbar_backbuf;
enum
diff --git a/plugins/gtkui/ddblistview.c b/plugins/gtkui/ddblistview.c
index df349159..c9f4c6da 100644
--- a/plugins/gtkui/ddblistview.c
+++ b/plugins/gtkui/ddblistview.c
@@ -613,6 +613,7 @@ ddb_listview_list_render (DdbListview *listview, int x, int y, int w, int h) {
}
int idx = 0;
int abs_idx = 0;
+ deadbeef->pl_lock ();
// find 1st group
DdbListviewGroup *grp = listview->groups;
int grp_y = 0;
@@ -690,6 +691,7 @@ ddb_listview_list_render (DdbListview *listview, int x, int y, int w, int h) {
g_object_unref (gc);
}
}
+ deadbeef->pl_unlock ();
draw_end ();
}
diff --git a/plugins/gtkui/fileman.c b/plugins/gtkui/fileman.c
index 0a5fb851..23a037cb 100644
--- a/plugins/gtkui/fileman.c
+++ b/plugins/gtkui/fileman.c
@@ -99,6 +99,7 @@ static void
open_files_worker (void *data) {
GSList *lst = (GSList *)data;
gtkpl_add_files (lst);
+ gtkui_playlist_changed ();
extern GtkWidget *mainwin;
DdbListview *pl = DDB_LISTVIEW (lookup_widget (mainwin, "playlist"));
ddb_listview_set_cursor (pl, 0);
@@ -108,6 +109,7 @@ open_files_worker (void *data) {
void
gtkui_open_files (struct _GSList *lst) {
deadbeef->pl_clear ();
+ playlist_refresh ();
deadbeef->thread_start (open_files_worker, lst);
}
diff --git a/plugins/gtkui/gtkui.c b/plugins/gtkui/gtkui.c
index abdf1237..3857a7bd 100644
--- a/plugins/gtkui/gtkui.c
+++ b/plugins/gtkui/gtkui.c
@@ -438,9 +438,14 @@ playlistchanged_cb (gpointer none) {
return FALSE;
}
+void
+gtkui_playlist_changed (void) {
+ g_idle_add (playlistchanged_cb, NULL);
+}
+
static int
gtkui_on_playlistchanged (DB_event_t *ev, uintptr_t data) {
- g_idle_add (playlistchanged_cb, NULL);
+ gtkui_playlist_changed ();
return 0;
}
@@ -521,19 +526,92 @@ gtkui_on_outputchanged (DB_event_t *ev, uintptr_t nothing) {
return 0;
}
+char last_playlist_save_name[1024] = "";
+
+void
+save_playlist_as (void) {
+ GtkWidget *dlg = gtk_file_chooser_dialog_new ("Save Playlist As", GTK_WINDOW (mainwin), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL);
+
+ gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dlg), TRUE);
+ gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dlg), "untitled.dbpl");
+ // restore folder
+ gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (dlg), deadbeef->conf_get_str ("filechooser.playlist.lastdir", ""));
+
+ GtkFileFilter* flt;
+ flt = gtk_file_filter_new ();
+ gtk_file_filter_set_name (flt, "DeaDBeeF playlist files (*.dbpl)");
+ gtk_file_filter_add_pattern (flt, "*.dbpl");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dlg), flt);
+
+ int res = gtk_dialog_run (GTK_DIALOG (dlg));
+ // store folder
+ gchar *folder = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (dlg));
+ if (folder) {
+ deadbeef->conf_set_str ("filechooser.playlist.lastdir", folder);
+ g_free (folder);
+ }
+ if (res == GTK_RESPONSE_OK)
+ {
+ gchar *fname = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dlg));
+ gtk_widget_destroy (dlg);
+
+ if (fname) {
+ int res = deadbeef->pl_save (fname);
+ if (res >= 0 && strlen (fname) < 1024) {
+ strcpy (last_playlist_save_name, fname);
+ }
+ g_free (fname);
+ }
+ }
+ else {
+ gtk_widget_destroy (dlg);
+ }
+}
+
+void
+on_playlist_save_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ if (!last_playlist_save_name[0]) {
+ save_playlist_as ();
+ }
+ else {
+ /*int res = */deadbeef->pl_save (last_playlist_save_name);
+ }
+}
+
+
+void
+on_playlist_save_as_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ save_playlist_as ();
+}
+
+
void
on_playlist_load_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
GtkWidget *dlg = gtk_file_chooser_dialog_new (_("Load Playlist"), GTK_WINDOW (mainwin), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL);
+ // restore folder
+ gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (dlg), deadbeef->conf_get_str ("filechooser.playlist.lastdir", ""));
+
GtkFileFilter* flt;
flt = gtk_file_filter_new ();
gtk_file_filter_set_name (flt, _("DeaDBeeF playlist files (*.dbpl)"));
gtk_file_filter_add_pattern (flt, "*.dbpl");
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dlg), flt);
-
- if (gtk_dialog_run (GTK_DIALOG (dlg)) == GTK_RESPONSE_OK)
+
+ int res = gtk_dialog_run (GTK_DIALOG (dlg));
+ // store folder
+ gchar *folder = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (dlg));
+ if (folder) {
+ deadbeef->conf_set_str ("filechooser.playlist.lastdir", folder);
+ g_free (folder);
+ }
+ if (res == GTK_RESPONSE_OK)
{
gchar *fname = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dlg));
gtk_widget_destroy (dlg);
diff --git a/plugins/gtkui/gtkui.h b/plugins/gtkui/gtkui.h
index c0c1d39a..091331a1 100644
--- a/plugins/gtkui/gtkui.h
+++ b/plugins/gtkui/gtkui.h
@@ -132,4 +132,7 @@ volumebar_redraw (void);
void
tabstrip_redraw (void);
+void
+gtkui_playlist_changed (void);
+
#endif
diff --git a/plugins/gtkui/prefwin.c b/plugins/gtkui/prefwin.c
index 03a2b6b1..e7ae8476 100644
--- a/plugins/gtkui/prefwin.c
+++ b/plugins/gtkui/prefwin.c
@@ -123,6 +123,37 @@ on_hk_slot_edited (GtkCellRendererText *renderer, gchar *path, gchar *new_text,
gtk_list_store_set (store, &iter, 0, new_text, -1);
}
+static gboolean
+add_hotkey_to_config (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) {
+ int *counter = (int *)data;
+ GValue key = {0,}, value = {0,};
+ gtk_tree_model_get_value (model, iter, 0, &key);
+ gtk_tree_model_get_value (model, iter, 1, &value);
+ const char *skey = g_value_get_string (&key);
+ const char *svalue = g_value_get_string (&value);
+
+ char conf_name[100];
+ char conf_value[100];
+ snprintf (conf_name, sizeof (conf_name), "hotkeys.key%d", *counter);
+ (*counter)++;
+ snprintf (conf_value, sizeof (conf_value), "%s: %s", svalue, skey);
+ deadbeef->conf_set_str (conf_name, conf_value);
+ return FALSE;
+}
+
+void
+hotkeys_apply (GtkTreeModel *model) {
+ DB_plugin_t *hotkeys = deadbeef->plug_get_for_id ("hotkeys");
+ if (hotkeys) {
+ // rebuild config
+ deadbeef->conf_remove_items ("hotkeys.key");
+ int counter = 1;
+ gtk_tree_model_foreach (model, add_hotkey_to_config, &counter);
+
+ ((DB_hotkeys_plugin_t *)hotkeys)->reset ();
+ }
+}
+
void
on_hk_binding_edited (GtkCellRendererAccel *accel, gchar *path, guint accel_key, GdkModifierType accel_mods, guint hardware_keycode, gpointer user_data) {
GtkListStore *store = GTK_LIST_STORE (user_data);
@@ -152,10 +183,9 @@ on_hk_binding_edited (GtkCellRendererAccel *accel, gchar *path, guint accel_key,
const char *name = ((DB_hotkeys_plugin_t *)hotkeys)->get_name_for_keycode (accel_key);
strcat (new_value, name);
gtk_list_store_set (store, &iter, 1, new_value, -1);
+
+ hotkeys_apply (GTK_TREE_MODEL (store));
}
-// if (!plugs[i]) {
-// return;
-// }
}
void
@@ -179,42 +209,7 @@ on_removehotkey_clicked (GtkButton *button, gpointer user_da
}
}
}
-}
-
-static gboolean
-add_hotkey_to_config (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) {
- int *counter = (int *)data;
- GValue key = {0,}, value = {0,};
- gtk_tree_model_get_value (model, iter, 0, &key);
- gtk_tree_model_get_value (model, iter, 1, &value);
- const char *skey = g_value_get_string (&key);
- const char *svalue = g_value_get_string (&value);
-
- char conf_name[100];
- char conf_value[100];
- snprintf (conf_name, sizeof (conf_name), "hotkeys.key%d", *counter);
- (*counter)++;
- snprintf (conf_value, sizeof (conf_value), "%s: %s", svalue, skey);
- deadbeef->conf_set_str (conf_name, conf_value);
- return FALSE;
-}
-
-void
-on_applyhotkeys_clicked (GtkButton *button, gpointer user_data) {
- DB_plugin_t **plugs = deadbeef->plug_get_list ();
- int i;
- for (i = 0; plugs[i]; i++) {
- if (plugs[i]->id && !strcmp (plugs[i]->id, "hotkeys")) {
- // rebuild config
- deadbeef->conf_remove_items ("hotkeys.key");
- int counter = 1;
- GtkTreeModel *model = GTK_TREE_MODEL (user_data);
- gtk_tree_model_foreach (model, add_hotkey_to_config, &counter);
-
- ((DB_hotkeys_plugin_t *)plugs[i])->reset ();
- break;
- }
- }
+ hotkeys_apply (model);
}
void
@@ -280,11 +275,6 @@ prefwin_add_hotkeys_tab (GtkWidget *prefwin) {
gtk_container_add (GTK_CONTAINER (hbuttonbox3), removehotkey);
GTK_WIDGET_SET_FLAGS (removehotkey, GTK_CAN_DEFAULT);
- applyhotkeys = gtk_button_new_with_mnemonic (_("Apply"));
- gtk_widget_show (applyhotkeys);
- gtk_container_add (GTK_CONTAINER (hbuttonbox3), applyhotkeys);
- GTK_WIDGET_SET_FLAGS (applyhotkeys, GTK_CAN_DEFAULT);
-
label66 = gtk_label_new (_("Global Hotkeys"));
gtk_widget_show (label66);
int npages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook2));
@@ -302,7 +292,6 @@ prefwin_add_hotkeys_tab (GtkWidget *prefwin) {
g_signal_connect ((gpointer)addhotkey, "clicked", G_CALLBACK (on_addhotkey_clicked), hkstore);
g_signal_connect ((gpointer)removehotkey, "clicked", G_CALLBACK (on_removehotkey_clicked), hktree);
- g_signal_connect ((gpointer)applyhotkeys, "clicked", G_CALLBACK (on_applyhotkeys_clicked), hkstore);
// model for hotkey slots
const char *slots[] = {
diff --git a/plugins/vorbis/vorbis.c b/plugins/vorbis/vorbis.c
index 2b73415e..37ca2263 100644
--- a/plugins/vorbis/vorbis.c
+++ b/plugins/vorbis/vorbis.c
@@ -581,8 +581,8 @@ cvorbis_write_metadata (DB_playItem_t *it) {
snprintf (outname, sizeof (outname), "%s.temp.ogg", it->fname);
out = fopen (outname, "w+b");
- if (!fp) {
- trace ("cvorbis_write_metadata: failed to open %s for writing\n", it->fname);
+ if (!out) {
+ trace ("cvorbis_write_metadata: failed to open %s for writing\n", outname);
goto error;
}
@@ -594,7 +594,7 @@ cvorbis_write_metadata (DB_playItem_t *it) {
err = 0;
error:
if (out) {
- fclose (fp);
+ fclose (out);
}
if (state) {
vcedit_clear (state);
@@ -609,7 +609,7 @@ error:
if (!err) {
rename (outname, it->fname);
}
- else if (*outname) {
+ else if (out) {
unlink (outname);
}
diff --git a/plugins/wavpack/wavpack.c b/plugins/wavpack/wavpack.c
index 9e3abd68..e2f9e43b 100644
--- a/plugins/wavpack/wavpack.c
+++ b/plugins/wavpack/wavpack.c
@@ -105,8 +105,10 @@ wv_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
if (!info->file) {
return -1;
}
- info->ctx = WavpackOpenFileInputEx (&wsr, info->file, NULL, NULL, OPEN_2CH_MAX/*|OPEN_WVC*/, 0);
+ char error[80];
+ info->ctx = WavpackOpenFileInputEx (&wsr, info->file, NULL, error, OPEN_2CH_MAX/*|OPEN_WVC*/, 0);
if (!info->ctx) {
+ fprintf (stderr, "wavpack error: %s\n", error);
return -1;
}
_info->plugin = &plugin;
@@ -226,9 +228,10 @@ wv_insert (DB_playItem_t *after, const char *fname) {
if (!fp) {
return NULL;
}
- WavpackContext *ctx = WavpackOpenFileInputEx (&wsr, fp, NULL, NULL, 0, 0);
+ char error[80];
+ WavpackContext *ctx = WavpackOpenFileInputEx (&wsr, fp, NULL, error, 0, 0);
if (!ctx) {
- trace ("WavpackOpenFileInput failed");
+ fprintf (stderr, "wavpack error: %s\n", error);
deadbeef->fclose (fp);
return NULL;
}
diff --git a/streamer.c b/streamer.c
index 4f11a66f..8349c7d9 100644
--- a/streamer.c
+++ b/streamer.c
@@ -280,6 +280,19 @@ streamer_move_to_nextsong (int reason) {
}
int pl_order = conf_get_int ("playback.order", 0);
int pl_loop_mode = conf_get_int ("playback.loop", 0);
+
+ if (reason == 0 && pl_loop_mode == PLAYBACK_MODE_LOOP_SINGLE) { // song finished, loop mode is "loop 1 track"
+ int r = str_get_idx_of (playing_track);
+ if (r == -1) {
+ streamer_set_nextsong (-2, 1);
+ }
+ else {
+ streamer_set_nextsong (r, 1);
+ }
+ pl_global_unlock ();
+ return 0;
+ }
+
if (pl_order == PLAYBACK_ORDER_SHUFFLE) { // shuffle
if (!curr) {
// find minimal notplayed
@@ -310,12 +323,6 @@ streamer_move_to_nextsong (int reason) {
}
else {
trace ("pl_next_song: reason=%d, loop=%d\n", reason, pl_loop_mode);
- if (reason == 0 && pl_loop_mode == PLAYBACK_MODE_LOOP_SINGLE) { // song finished, loop mode is "loop 1 track"
- int r = str_get_idx_of (curr);
- streamer_set_nextsong (r, 1);
- pl_global_unlock ();
- return 0;
- }
// find minimal notplayed above current
int rating = curr->shufflerating;
playItem_t *pmin = NULL; // notplayed minimum
@@ -351,12 +358,6 @@ streamer_move_to_nextsong (int reason) {
else if (pl_order == PLAYBACK_ORDER_LINEAR) { // linear
playItem_t *it = NULL;
if (curr) {
- if (reason == 0 && pl_loop_mode == PLAYBACK_MODE_LOOP_SINGLE) { // loop same track
- int r = str_get_idx_of (curr);
- streamer_set_nextsong (r, 1);
- pl_global_unlock ();
- return 0;
- }
it = curr->next[PL_MAIN];
}
if (!it) {
@@ -380,12 +381,6 @@ streamer_move_to_nextsong (int reason) {
return 0;
}
else if (pl_order == PLAYBACK_ORDER_RANDOM) { // random
- if (reason == 0 && pl_loop_mode == PLAYBACK_MODE_LOOP_SINGLE && curr) {
- int r = str_get_idx_of (curr);
- streamer_set_nextsong (r, 1);
- pl_global_unlock ();
- return 0;
- }
int res = streamer_move_to_randomsong ();
if (res == -1) {
trace ("streamer_move_to_randomsong error\n");
diff --git a/web/faq.txt b/web/faq.txt
deleted file mode 100644
index 1ec25b3b..00000000
--- a/web/faq.txt
+++ /dev/null
@@ -1,73 +0,0 @@
-Q: I have PulseAudio, and I have playback problems (noise, distortion, wrong speed, no sound, etc)
-
-A: Disable PulseAudio
-A: Try to use OSS as pulseaudio backend
-
---
-
-Q: I don't get it. Yes, indeed I have PulseAudio, but in Deadbeef I select ALSA output, and I get playback problems.
-
-A: PulseAudio tricks applications by providing ALSA-plugin that routes sound from application to PulseAudio via ALSA API.
-
---
-
-Q: Is it planned to support PulseAudio natively?
-
-A: Yes.
-
---
-
-Q: Occasionally I get following error: "alsa: snd_pcm_writei error=-32, Broken pipe". Is it bad?
-
-A: Ignore it.
-
---
-
-Q: Is it planned to support multiple playlists and EQ?
-
-A: Yes
-
---
-
-Q: Is it planned to make Windows and/or OSX ports?
-
-A: No
-
---
-
-Q: Playlist, settings, etc are not saved if I kill X session, shut down or restart computer, etc
-
-A: That is not fixed yet. But it is work in progress. Please don't bother me with that unless you have a patch that fixes it.
-
---
-
-Q: Deadbeef takes too much CPU% when playing mp3/ogg/flac.
-
-A: Try to reduce SRC quality in preferences window
-A: Try to check "Use software ALSA resampling" box
-A: See the PulseAudio questions above
-
---
-
-Q: Deadbeef takes too much CPU% when playing APE files.
-
-A: That's normal. Consider switching to wavpack or flac.
-
---
-
-Q: I have 50 ideas about what features must be added to the player!!!111oneone. Can i become idea-generator of the project, so that I tell, and developers do what I ask for?
-
-A: No
-
---
-
-Q: How do I make GDB backtrace after crash or hang?
-
-A: Ensure that you have unstripped binary. Most packages are stripped. So you'll have to build yourself in most cases, if you haven't done so already.
-Simply doing "./configure && make && sudo make install" is sufficient, but it's better to add export CFLAGS="-O0 -g".
-1. install GDB
-2. run "gdb deadbeef", and execute "r" command in GDB shell
-3. reproduce a crash, or press ctrl+c in GDB after hang occurs
-4. execute "thread 1" command, followed by "bt" command in GDB
-5. repeat for at least 5 threads: thread 2<enter> bt<enter>, and so on
-6. now, you can copy the output starting after 1st "bt" command into email/pastebin/textfile, etc.
diff --git a/web/index.html b/web/index.html
deleted file mode 100644
index 812921b6..00000000
--- a/web/index.html
+++ /dev/null
@@ -1,254 +0,0 @@
-<html>
-<head>
-<title>DeaDBeeF - Ultimate Music Player For GNU/Linux</title>
-</head>
-<style>
- body {
- background-color: #eeeeee;
- }
- #header {
- margin: 0;
- padding: 0;
- }
- #header li {
- display: inline;
- margin-left: 1em;
- }
- h1 {
- font-variant: small-caps;
- }
- .post {
- margin-left: 2em;
- background-color: #d7d7d7;
- padding: 1em;
- -moz-border-radius: 3;
- border-radius: 3;
- border-width: 1;
- border-color: #cccccc;
- }
- .post p {
- padding: 0;
- margin: 0;
- }
- p.date {
- font-size: 80%;
- margin-bottom: 0.5em;
- }
- #faq {
- color: #ff0000;
- font-size: 120%;
- font-weight: bold;
- }
-</style>
-<body>
-<div style="float:right;margin:0em 0.5em;"><script type="text/javascript" src="http://www.ohloh.net/p/380374/widgets/project_users.js?style=blue"></script></div>
-<div style="float:right;margin:0em 0.5em;"><a href="http://sourceforge.net/"><img src="http://sflogo.sourceforge.net/sflogo.php?group_id=272657&amp;type=3" alt="SourceForge.net"/></a></div>
-<br/>
-<ul id='header'>
- <li><a href="#about">About</a></li>
- <li><a href="#news">News</a></li>
- <!--li><a id='faq' href="faq.txt">F.A.Q.</a></li-->
- <li><a href="http://sourceforge.net/apps/mediawiki/deadbeef">Wiki</a></li>
- <li><a href="#license">Copying</a></li>
- <li><a href="#download">Download</a></li>
- <li><a href="#bugs">Reporting Bugs</a></li>
- <li><a href="#developers">Developer Information</a></li>
- <li><a href="#contacts">Contacts</a></li>
- <li><a href="screenshots.html">Screenshots</a></li>
-</ul>
-
-<h1 id='about'>About</h1>
-<p>DeaDBeeF (as in 0xDEADBEEF) is an audio player for GNU/Linux systems with X11 (though now it also runs in plain console without X, in FreeBSD, and in OpenSolaris).</p>
-<p>Main features:</p>
-<ul>
- <li>mp3, ogg vorbis, flac, ape, wv, wav, m4a, mpc, cd audio (and many more)</li>
- <li>sid, nsf and lots of other popular chiptune formats</li>
- <li>ID3v1, ID3v2.2, ID3v2.3, ID3v2.4, APEv2, xing/info tags support</li>
- <li>character set detection for non-unicode id3 tags - supports cp1251 and iso8859-1</li>
- <li>unicode tags are fully supported as well (both utf8 and ucs2)</li>
- <li>cuesheet (.cue files) support, with charset detection (utf8/cp1251/iso8859-1)</li>
- <li>tracker modules like mod, s3m, it, xm, etc</li>
- <li>HVSC song length database support for sid</li>
- <li>gtk2 interface with efficient custom widgets</li>
- <li>no GNOME or KDE dependencies</li>
- <li>minimize to tray, with scrollwheel volume control</li>
- <li>drag and drop, both inside of playlist, and from filemanagers and such</li>
- <li>control playback from command line</li>
- <li>global hotkeys</li>
- <li>multiple playlists</li>
- <li>album artwork display</li>
- <li>18-band graphical equalizer</li>
- <li>metadata editor</li>
- <li>user-customizable groups in playlists</li>
- <li>user-customizable columns with flexible title formatting</li>
- <li>radio and podcast support for ogg vorbis, mp3 and aac streams</li>
- <li>gapless playback</li>
- <li>plugin support; bundled with lots of plugins, such as global hotkeys and last.fm scrobbler; sdk is included</li>
- <li>duration calculation is as precise as possible for vbr mp3 files (with and without xing/info tags)</li>
- <li>was tested and works on x86, x86_64 and ppc64 architectures. should work on most modern platforms</li>
-</ul>
-
-<h1 id="news">News</h1>
-
-<h2>release 0.4 is out</h2>
-<div class="post">
- <p class="date">2010/05/09</p>
- <p><a href="#download">get it!</a></p>
- <p>Changelog since 0.3.3</p>
- <ul>
- <li>multiple tabbed playlists</li>
- <li>added grouping of tracks using title-formatting strings</li>
- <li>added Album Cover Art plugin</li>
- <li>added EQ plugin (SuperEQ library by Naoki Shibata)</li>
- <li>added basic PulseAudio support</li>
- <li>added metadata editing support</li>
- <li>improved global hotkeys plugin, with GUI configurator</li>
- <li>colors for custom widgets are taken from GTK theme, and user-customizable</li>
- <li>fixed FreeBSD compatibility problems</li>
- <li>improved resampling/streaming code</li>
- <li>enabled .TTA support in ffmpeg plugin</li>
- <li>improved metadata readers (id3v1, id3v2, apev2)</li>
- <li>improved Icy (shoutcast) protocol support</li>
- <li>moved built-in decoders to their own dynamic libraries</li>
- <li>now it's possible to exclude any plugin from build</li>
- <li>player remembers scroll positions in playlists between sessions</li>
- <li>added ability to delete selected files from disk (playlist context menu)</li>
- <li>added ability to reload metadata (playlist context menu)</li>
- <li>added AAC 'net streaming support (ffmpeg plugin)</li>
- <li>faster search and sorting</li>
- <li>added support for proxy username/password authentication</li>
- <li>better recognizer of remote pls/m3u files for online radio</li>
- <li>improved/fixed last.fm plugin</li>
- <li>OSD notifications about track changes though any notification daemon</li>
- <li>fixed gapless playback errors</li>
- </ul>
-</div>
-
-<h2>release 0.3.3 is out</h2>
-<div class="post">
- <p class="date">2010/02/07</p>
- <p><a href="#download">get it!</a></p>
- <p>Changelog since 0.3.2</p>
- <ul>
- <li>fixed "unknown response" in command line</li>
- <li>fixed winkey in global hotkeys plugin</li>
- <li>fixed crash in id3v1 parser</li>
- <li>fixed crash in mp3 plugin</li>
- <li>fixed few bugs/problems in ALSA plugin (now works on wider range of soundcards)</li>
- <li>fixed playback of multichannel FLAC files</li>
- <li>fixed 24 bit wavpack playback</li>
- <li>fixed duration calculation and seeking bugs in mp3 plugin</li>
- <li>added support for older versions of ffmpeg</li>
- <li>added OSS(3,4) support</li>
- <li>experimental FreeBSD support</li>
- <li>experimental OpenSolaris support</li>
- <li>improved GUI dialogs</li>
- <li>added new "File Number" column type</li>
- <li>added new "File Name" custom column conversion</li>
- <li>added option to disable nowplaying notifications in lastfm plugin</li>
- <li>added support for icy metadata (title in shoutcast streams)</li>
- <li>added experimental (optional) support for notifications using libnotify</li>
- </ul>
- <p><a href="screenshot03.png">Screenshot</a></p>
-</div>
-
-<h2>release 0.3.2 is out</h2>
-<div class="post">
- <p class="date">2010/01/12</p>
- <p><a href="#download">get it!</a></p>
- <p>Changelog since 0.3.1</p>
- <ul>
- <li>all GTK+ UI code is now in plugin</li>
- <li>improved main menu layout in GTK UI</li>
- <li>numerous memory and cpu optimizations</li>
- <li>fully editable/scriptable columns with sorting</li>
- <li>native look and feel of playlist widget</li>
- <li>selection is synchronized between main window and search window</li>
- <li>keyboard navigation in search window</li>
- <li>plugins got basic GUI configuration</li>
- <li>much smoother seekbar</li>
- <li>compatible with more GTK theme engines</li>
- <li>improved restore window geometry after minimizing to system tray</li>
- <li>search window geometry is now saved and restored between sessions</li>
- <li>flexible nowplaying querying support via command line</li>
- <li>ALSA code moved to plugin</li>
- <li>new "nullout" output plugin - good for testing, and as basis for new plugins</li>
- <li>added template .c file (with comments) for making new decoder plugins</li>
- <li>updated id3v2 and apev2 parsers to support more metadata types</li>
- <li>id3v2.2 parser now supports unsynchronization</li>
- <li>metadata viewer accessible from context menu</li>
- <li>flac plugin now plays "oga" files (flac in ogg container)</li>
- <li>ffmpeg plugin, adds formats: m4a (aac,alac), mpc/mp+/mpp, wma, shn, oma, ac3, vqf</li>
- <li>vtx plugin using libayemu</li>
- <li>adplug plugin - cmf, rol, hsc, etc (including adlib S3Ms)</li>
- <li>fixed cuesheet support in mp3 and ogg plugins</li>
- <li>fixed sse2 issues on i686 architecture</li>
- <li>added 24-bit ape support (thanks to Rockbox project)</li>
- <li>added support for custom scrobbler url to last.fm plugin (e.g. libre.fm)</li>
- <li>added Play Queue funtionality to playlist (context menu)</li>
- <li>added average/approximate bitrate display to statusbar</li>
- <li>new "cursor follows playback" feature</li>
- <li>new "stop after current track" feature</li>
- <li>.dbpl extension is auto-added when saving playlist</li>
- <li>improved robustness in http code (handling connection problems, etc)</li>
- </ul>
-</div>
-
-<a href="oldnews.html">News archive</a><br/>
-
-<h1 id="license">Copying</h1>
-<pre>
- Copyright (C) 2009 Alexey Yakovenko
-
- 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-</pre>
-
-<h1 id="download">Download</h1>
-<h2>Latest version 0.4.0:</h2>
-<p>source code for version 0.4.0 <a href="http://sourceforge.net/projects/deadbeef/files/deadbeef-0.4.0.tar.bz2/download">deadbeef-0.4.0.tar.bz2</a></p>
-<p>or <a href="http://sourceforge.net/projects/deadbeef/files/">browse all files</a></p>
-<h3>Arch Linux PKGBUILD</h3>
-<p>Download from <a href="http://aur.archlinux.org/packages.php?ID=29497">AUR website</a>,</p>
-<p>or if you have <a href="http://archlinux.fr/yaourt-en">Yaourt</a>, simply do &laquo;yaourt -S deadbeef&raquo;</p>
-<h3>Debian and Ubuntu packages</h3>
-<p>Debian Stable packages: <a href="http://sourceforge.net/projects/deadbeef/files/debian/deadbeef_0.4.0-1_i386.deb/download">i386</a>, <a href="http://sourceforge.net/projects/deadbeef/files/debian/deadbeef_0.4.0-1_amd64.deb/download">x86_64</a>, <a href="http://sourceforge.net/projects/deadbeef/files/debian/deadbeef-plugins-dev_0.4.0-1_all.deb/download">plugin sdk</a></p>
-<p>Ubuntu <a href="http://launchpad.net/~alexey-smirnov/+archive/deadbeef">PPA repository</a></p>
-<p>Provided by <a href="mailto:alexey.smirnov@gmx.com">Alexey Smirnov</a></p>
-<h3>OpenSuse packages</h3>
-<p>Download from <a href="http://software.opensuse.org/search?baseproject=ALL&p=1&q=deadbeef">openSUSE Build Service</a></p>
-<p>Provided by <a href="mailto:aya.home.nsk@gmail.com">Arseny</a></p>
-<p><strong><em>NOTE</em>: I have nothing to do with these packages, nor can i test them. use at your own risk</strong</p>
-
-<h1 id='bugs'>Reporting Bugs And Requesting Features</h1>
-<p>Trackers for reporting bugs, requesting features, etc are <a href="https://sourceforge.net/projects/deadbeef/support">here</a></p>
-<h1 id="developers">Developer Information</h1>
-<p>How to contribute: <a href="http://contributing.appspot.com/deadbeef">http://contributing.appspot.com/deadbeef</a></p>
-<p>Also, see <a href="http://sourceforge.net/projects/deadbeef">project site</a>.</p>
-<h1 id='contacts'>Contacts</h1>
-<p>official IRC channel (for english speaking people) is: #deadbeefplayer @ freenode</p>
-<p>official jabber conference for russian speaking users is here: deadbeef-ru@conference.jabber.ru</p>
-<p>email: <a href="mailto:waker@users.sourceforge.net">Alexey Yakovenko</a></p>
-
-<hr/>
-<script type="text/javascript">
-var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
-document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
-</script>
-<script type="text/javascript">
-try {
-var pageTracker = _gat._getTracker("UA-3180744-2");
-pageTracker._trackPageview();
-} catch(err) {}</script>
-</body>
diff --git a/web/oldnews.html b/web/oldnews.html
deleted file mode 100644
index e57bffa3..00000000
--- a/web/oldnews.html
+++ /dev/null
@@ -1,308 +0,0 @@
-<html>
-<head>
-<title>DeaDBeeF - Ultimate Music Player For GNU/Linux</title>
-</head>
-<style>
- body {
- background-color: #eeeeee;
- }
- #header {
- margin: 0;
- padding: 0;
- }
- #header li {
- display: inline;
- margin-left: 1em;
- }
- h1 {
- font-variant: small-caps;
- }
- .post {
- margin-left: 2em;
- background-color: #d7d7d7;
- padding: 1em;
- -moz-border-radius: 3;
- border-radius: 3;
- border-width: 1;
- border-color: #cccccc;
- }
- .post p {
- padding: 0;
- margin: 0;
- }
- p.date {
- font-size: 80%;
- margin-bottom: 0.5em;
- }
- #faq {
- color: #ff0000;
- font-size: 120%;
- font-weight: bold;
- }
-</style>
-<body>
-<h2>release 0.3.1 is out</h2>
-<div class="post">
- <p class="date">2009/11/29</p>
- <p><a href="#download">get it!</a></p>
- <p>Changelog since 0.3.0</p>
- <ul>
- <li>improved header widget drawing and gtkengines compatibility</li>
- <li>fixed vfs_curl to fetch content size properly again</li>
- <li>fixed rare memory leak bug in seekbar drawing</li>
- <li>fixed total playtime display</li>
- <li>changed buttons to use stock icons</li>
- <li>implemented reading of embedded cuesheets from ape and wavpack files</li>
- <li>fixed bug in filename resolving when starting from commandline</li>
- <li>added possibility to open multiple files from filemanagers</li>
- <li>fixed random locking/hanging in alsa module</li>
- <li>loading plugins from $XDG_CONFIG_HOME/.local/lib/deadbeef/ (by <a href="mailto:alexey.smirnov@gmx.com">Alexey A. Smirnov</a>)</li>
- <li>middle click on tray icon toggles pause on current track (by <a href="mailto:rotmer@gmail.com">Alex Dedul</a>)</li>
- </ul>
-</div>
-
-
-<h2>release 0.3.0 is out</h2>
-<div class="post">
- <p class="date">2009/11/08</p>
- <p><a href="#download">get it!</a></p>
- <p>Changelog since 0.2.3.2</p>
- <ul>
- <li>vfs plugins - for implementing http/ftp streaming, etc</li>
- <li>improved mpeg (libmad) plugin - eats less memory, works faster</li>
- <li>added support for icecast and shoutcast streams (mp3, ogg)</li>
- <li>added support for podcasts (basically, for any files residing on http/ftp)</li>
- <li>added support for opening pls and m3u files</li>
- <li>improved about dialog</li>
- <li>added support for Super (winkey) modifier and multimedia keys in global hotkeys plugin</li>
- <li>fixed random crash in global hotkeys plugin if key combination was used elsewhere</li>
- <li>improved cuesheet reader</li>
- <li>added cd audio support, including cddb/freedb</li>
- <li>added preferences window</li>
- <li>new unified config file for everything</li>
- <li>added total playtime display in statusbar</li>
- <li>improved plugin build system, displays list of plugins to be built</li>
- <li>custom columns (through manual config editing yet)</li>
- <li>column header drag-and-drop</li>
- <li>improved alsa compatibility</li>
- <li>player can release sound device while not playing</li>
- <li>better alsa resume after suspend support</li>
- <li>support for hardware samplerate conversion (when supported by hardware)</li>
- <li>support for alsa software resampling</li>
- <li>improved skipping through bad files</li>
- <li>fixed replaygain bugs</li>
- <li>added full file path display via tooltip (optional, disabled by default)</li>
- <li>statusbar shows info while paused</li>
- <li>added new buffering icon while streamer loads data</li>
- <li>added scrolling in playlist while dragging/selecting tracks</li>
- <li>case-insensitive file filter in gtkfilechooser dialogs</li>
- <li>added cursor sync between playlist and search windows</li>
- <li>player saves playlist/config on SIGTERM (should improve things on shutdown)</li>
- </ul>
-</div>
-
-<h2>release 0.2.3.2 is out</h2>
-<div class="post">
- <p class="date">2009/10/07</p>
- <p>0.2.3 bugfix release</p>
- <p><a href="#download">get it!</a></p>
- <p>Changelog since 0.2.3.1</p>
- <ul>
- <li>added winkey (Super) modifier support to hotkeys plugin</li>
- <li>added multimedia keys support to hotkeys plugin</li>
- <li>added hex keycodes (as reported by xev) support to hotkeys plugin</li>
- <li>fixed crashbug in playlist loader when loading playlist files from older releases</li>
- <li>fixed bug in flac decoder attempting to read past end of file</li>
- <li>added new workarounds for malformed cusheet files</li>
- </ul>
-</div>
-<h2>release 0.2.3.1 is out</h2>
-<div class="post">
- <p class="date">2009/10/03</p>
- <p>0.2.3 bugfix release</p>
- <p><a href="#download">get it!</a></p>
- <p>Changelog since 0.2.3</p>
- <ul>
- <li>disabled debug tracing in most modules, to prevent slow-downs</li>
- <li>fixed streaming bug introduced last moment before 0.2.3</li>
- <li>fixed redrawing of playing status after resume from pause</li>
- </ul>
-</div>
-<h2>release 0.2.3 is out</h2>
-<div class="post">
- <p class="date">2009/10/03</p>
- <p><a href="#download">get it!</a></p>
- <p>Changelog since 0.2.2.2</p>
- <ul>
- <li>added native gapless playback which works with most decoders</li>
- <li>added replaygain support</li>
- <li>added wavpack plugin</li>
- <li>added libsndfile plugin</li>
- <li>fixed seeking in paused and stopped states</li>
- <li>fixed reading of some id3v2 tags</li>
- <li>changed tag reading order to APEv2-&gt;ID3v2-&gt;ID3v1</li>
- <li>improved cuesheet reader</li>
- <li>fixed interlocking bug in streamer (should reduce skips)</li>
- </ul>
-</div>
-<h2>release 0.2.2.2 is out</h2>
-<div class="post">
- <p class="date">2009/09/20</p>
- <p>another 0.2.2 bugfix release</p>
- <p><a href="#download">get it!</a></p>
- <p>Changelog since 0.2.2.1</p>
- <ul>
- <li>fixed resume after suspend/hibernate</li>
- <li>fixed cue reader regression</li>
- <li>fixed another playlist drawing regression</li>
- <li>fixed stutter at the start of ape tracks</li>
- </ul>
-</div>
-
-<h2>release 0.2.2.1 is out</h2>
-<div class="post">
- <p class="date">2009/09/13</p>
- <p>there was very unfortunate regression bug in 0.2.2, so here's quick fix</p>
- <p><a href="#download">get it!</a></p>
- <p>Changelog since 0.2.2</p>
- <ul>
- <li>fixed playlist drawing regressions encountered in 0.2.2</li>
- </ul>
-</div>
-
-
-<h2>release 0.2.2 is out</h2>
-<div class="post">
- <p class="date">2009/09/13</p>
- <p><a href="#download">get it!</a></p>
- <p>Changelog since 0.2.1</p>
- <ul>
- <li>fixed several build problems reported by users</li>
- <li>added app icons, updated launcher script</li>
- <li>proper sse2 detection and usage in ape plugin</li>
- <li>reduced volumebar range to -50dB</li>
- <li>horizontal scrolling in playlist</li>
- <li>pango is now used for ellipsizing</li>
- <li>case-insensitive search using russian, danish, french and other alphabets</li>
- <li>vertical scroll is much faster now</li>
- </ul>
-</div>
-
-<h2>release 0.2.1 is out</h2>
-<div class="post">
- <p class="date">2009/09/12</p>
- <p><a href="#download">get it!</a></p>
- <p>Changelog since 0.2.0</p>
- <ul>
- <li>new ape decoder - faster, doesn't crash</li>
- <li>fixed APEv2 tag reader</li>
- <li>fixed id3 tag reader on big-endian systems</li>
- <li>player now builds without errors on big-endian systems</li>
- <li>memory for HVSC song length database is now allocated on demand</li>
- <li>fixed icons in system tray menu</li>
- <li>fixed color detection for column header text</li>
- <li>improved cuesheet reader (pregap support and better bounds checking)</li>
- </ul>
-</div>
-
-<h2>deadbeef-0.2.0 is out!</h2>
-<div class='post'>
-<p class='date'>2009/09/08</p>
-<p><a href="#download">get it!</a></p>
-<p>Changelog since 0.1.1:</p>
-<p><i>please note this changelog is what most users would notice. actual changelog is 10 times bigger, and is not worth reading. i don't want to count each of 1000 bugfixes here.</i></p>
-<ul>
- <li>plugin API - decoder and misc plugins working, other types are work in progress</li>
- <li>most decoders are in plugins now, which means that most dependencies are optional (libmad, libFLAC, etc)</li>
- <li>global hotkeys plugin</li>
- <li>last.fm scrobbler plugin</li>
- <li>added help page (under help menu)</li>
- <li>huge amount of performance tweaks (including power consumption tweaks)</li>
- <li>cuesheets embedded into FLAC's vorbis comments</li>
- <li>24 bit flac support</li>
- <li>$XDG_CONFIG_HOME env variable support</li>
- <li>APE format support through libdemac</li>
- <li>launcher (.desktop) file</li>
- <li>scroll follows playback (optional)</li>
- <li>no more "?" when no track number in tags</li>
- <li>fixed seekbar accuracy bug</li>
- <li>improved cuesheet reader</li>
- <li>cuesheet text charset detection (utf8, iso8859-1, cp1251)</li>
- <li>improved mp3 parser (better vbr duration calc, more accurate seeking, etc)</li>
- <li>fixed bug when starting files from command line using relative paths</li>
- <li>fixed order/loopmode session saving</li>
- <li>fixed id3v2.2 reader</li>
- <li>focus/deiconify window on trayicon click</li>
- <li>X button no longer minimizes to tray by default (configurable)</li>
- <li>search is now accessible from menu</li>
- <li>column sizes are now saved between sessions</li>
- <li>select multiple folders in "add folder(s)" dialog</li>
-</ul>
-</div>
-
-<h2>tag loading/recoding policy</h2>
-<div class='post'>
-<p class='date'>2009/09/06</p>
-<ul>
- <li>id3v1 loader will always try to detect cp1251.</li>
- <li>id3v2 loader will only try to detect cp1251 if encoding is not specified.</li>
- <li>vorbis comment tags (both in ogg vorbis and flac files) and APE tags
- (both in ape and mp3 files) must always be utf8, so no detection will be
- done here.</li>
- <li>id3v2 tags with encoding explicitly set to iso8859-1 will always be
- loaded as iso8859-1. period.</li>
- <li>id3v2 tags inserted into flac files will be ignored.</li>
- <li>8bit charsets other than cp1251 and iso8859-1 (like koi8-r) are not
- supported now, but might be added in the future.</li>
-</ul>
-</div>
-
-<h2>release 0.1.1 is out!</h2>
-<div class='post'>
-<p class='date'>2009/08/23</p>
-<p>changelog:</p>
-<pre>
-volume control now works on dB scale
-fixed bug in ogg vorbis decoder that was skipping songs
-flac decoder can now ignore corrupted files to some extent
-added shuffle playback mode
-removed some of the unused code from build scripts
-player no longer hangs if song change happened near the end of current song
-playlist redraw fixed for pause/unpause
-speed optimizations on playlist drawing
-changed scrollwheel step to 2 rows
-changed playlist drawing from cairo to gdk, to improve speed and use proper fonts
-fixed server part to be started earlier, to prevent multiple instances bug
-fixed several things preventing player to work on ppc64 architecture
-fixed id3v2 unsynchronized frames reading
-implemented basic session management, window size/position, volume, playmode are remembered across sessions
-</pre>
-<p><a href="#download">download</a> now!</p>
-</div>
-
-<h2>GIT repository</h2>
-<div class='post'>
-<p>i pushed my git repository to sf.net on Thu Aug 20 2009</p>
-<p>git version has several bugfixes/improvements over alpha release, so feel free to use it.</p>
-<p><pre>git clone git://deadbeef.git.sourceforge.net/gitroot/deadbeef/deadbeef</pre></p>
-</div>
-
-<h2>Alpha released</h2>
-<div class='post'>
-<p>first alpha release 0.1.0 just happened on Wed Aug 19 21:59:27 CEST 2009!</p>
-<p>there was a report from a happy user that deadbeef won't compile with gtk&lt;=2.16.</p>
-<p>fix is very easy, and will be available in next release, and in git head when i have time to prepare and push it</p>
-<p>thanks for understanding and happy hacking!</p>
-</div>
-<hr/>
-<p><a href="http://sourceforge.net/">Project Web Hosted by<img src="http://sflogo.sourceforge.net/sflogo.php?group_id=272657&amp;type=3" alt="SourceForge.net"/></a></p>
-<script type="text/javascript">
-var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
-document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
-</script>
-<script type="text/javascript">
-try {
-var pageTracker = _gat._getTracker("UA-3180744-2");
-pageTracker._trackPageview();
-} catch(err) {}</script>
-</body>