summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Viktor Semykin <thesame.ml@gmail.com>2010-05-28 19:30:38 +0300
committerGravatar Viktor Semykin <thesame.ml@gmail.com>2010-05-28 19:30:38 +0300
commit9e389b88fa239d43a9b64f88e61d42df1774cdaa (patch)
tree07824e976cd3e12cfab2c93956f8416abd729152
parent748736d307de33c1ffab45fdc05dc0bcbaa5de89 (diff)
parentad71971955594ada4a0b14d176a192d050c9ee36 (diff)
Merge branch 'master' of git://deadbeef.git.sourceforge.net/gitroot/deadbeef/deadbeef into tmp
-rw-r--r--ChangeLog22
-rw-r--r--playlist.c4
-rw-r--r--plugins/artwork/artwork.c12
-rw-r--r--plugins/gtkui/ddblistview.c50
-rw-r--r--plugins/gtkui/trkproperties.c4
-rw-r--r--plugins/vfs_curl/vfs_curl.c33
-rw-r--r--streamer.c32
7 files changed, 95 insertions, 62 deletions
diff --git a/ChangeLog b/ChangeLog
index 42808364..f1154435 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,26 +1,36 @@
version 0.4.1
- fixed search window size
- better tag reader in ffmpeg plugin + reload metadata support
+ better default/minimal search window size
+ improved 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 alsa and oss plugins writing zero samples at start of tracks (TheMaister)
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
+ added experimental support for gtk3 (2.90), enabled with --enable-gtk3
+ improved oss plugin responsiveness on pause (TheMaister)
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
+ added cd text support (Viktor Semykin)
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
+ fixed FLAC bitrate calculation
+ fixed ID3v2 "extra size" field parser
+ fixed memory leaks in vorbis plugin
+ fixed several crash-bugs in mp3 plugin
+ fixed known bugs in album artwork code
+ added automatic backtrace printing on SIGSEGV
+ added multi-track vorbis files support
+ added %C(composer) expansion to title formatting
+ fixed few theming/colors issues
+ fixed replaygain field parsing when reading cuesheets and r.g. peak scale handling (David Bryant)
version 0.4.0
multiple tabbed playlists
diff --git a/playlist.c b/playlist.c
index 6621a9dd..f200622c 100644
--- a/playlist.c
+++ b/playlist.c
@@ -819,13 +819,13 @@ pl_process_cue_track (playItem_t *after, const char *fname, playItem_t **prev, c
pl_add_meta (it, "year", date);
}
if (replaygain_album_gain[0]) {
- it->replaygain_album_gain = db_to_amp (atof (replaygain_album_gain));
+ it->replaygain_album_gain = atof (replaygain_album_gain);
}
if (replaygain_album_peak[0]) {
it->replaygain_album_peak = atof (replaygain_album_peak);
}
if (replaygain_track_gain[0]) {
- it->replaygain_track_gain = db_to_amp (atof (replaygain_track_gain));
+ it->replaygain_track_gain = atof (replaygain_track_gain);
}
if (replaygain_track_peak[0]) {
it->replaygain_track_peak = atof (replaygain_track_peak);
diff --git a/plugins/artwork/artwork.c b/plugins/artwork/artwork.c
index 4af9658b..88052e6e 100644
--- a/plugins/artwork/artwork.c
+++ b/plugins/artwork/artwork.c
@@ -159,11 +159,6 @@ check_dir (const char *dir, mode_t mode)
static int
copy_file (const char *in, const char *out) {
trace ("copying %s to %s\n", in, out);
- char *buf = malloc (BUFFER_SIZE);
- if (!buf) {
- trace ("artwork: failed to alloc %d bytes\n", BUFFER_SIZE);
- return -1;
- }
FILE *fin = fopen (in, "rb");
if (!fin) {
trace ("artwork: failed to open file %s for reading\n", in);
@@ -175,6 +170,13 @@ copy_file (const char *in, const char *out) {
trace ("artwork: failed to open file %s for writing\n", out);
return -1;
}
+ char *buf = malloc (BUFFER_SIZE);
+ if (!buf) {
+ trace ("artwork: failed to alloc %d bytes\n", BUFFER_SIZE);
+ fclose (fin);
+ fclose (fout);
+ return -1;
+ }
fseek (fin, 0, SEEK_END);
size_t sz = ftell (fin);
diff --git a/plugins/gtkui/ddblistview.c b/plugins/gtkui/ddblistview.c
index 0412581b..7156f147 100644
--- a/plugins/gtkui/ddblistview.c
+++ b/plugins/gtkui/ddblistview.c
@@ -72,8 +72,8 @@ typedef struct _DdbListviewColumn DdbListviewColumn;
struct _DdbListviewGroup {
DdbListviewIter head;
- uint32_t height;
- uint32_t num_items;
+ int32_t height;
+ int32_t num_items;
struct _DdbListviewGroup *next;
};
typedef struct _DdbListviewGroup DdbListviewGroup;
@@ -302,6 +302,7 @@ ddb_listview_init(DdbListview *listview)
// listview->areaselect_dx = -1;
// listview->areaselect_dy = -1;
listview->dragwait = 0;
+ listview->drag_source_playlist = -1;
listview->shift_sel_anchor = -1;
listview->header_dragging = -1;
@@ -718,13 +719,34 @@ ddb_listview_list_expose_event (GtkWidget *widget,
return FALSE;
}
+static void
+ddb_listview_draw_dnd_marker (DdbListview *ps) {
+ if (ps->drag_motion_y < 0) {
+ return;
+ }
+ int drag_motion_y = ps->drag_motion_y - ps->scrollpos;
+
+ GtkWidget *widget = ps->list;
+ GdkColor clr;
+ gtkui_get_listview_cursor_color (&clr);
+ GdkGC *gc = gdk_gc_new (widget->window);
+ gdk_gc_set_rgb_fg_color (gc, &clr);
+ gdk_draw_rectangle (widget->window, gc, TRUE, 0, drag_motion_y-1, widget->allocation.width, 3);
+ gdk_draw_rectangle (widget->window, gc, TRUE, 0, drag_motion_y-3, 3, 7);
+ gdk_draw_rectangle (widget->window, gc, TRUE, widget->allocation.width-3, drag_motion_y-3, 3, 7);
+ g_object_unref (gc);
+
+}
+
void
ddb_listview_list_expose (DdbListview *listview, int x, int y, int w, int h) {
-// printf ("listview height: %d\n", listview->list->allocation.height);
GtkWidget *widget = listview->list;
if (widget->window && listview->backbuf) {
draw_drawable (widget->window, widget->style->black_gc, listview->backbuf, x, y, x, y, w, h);
}
+ if (listview->drag_motion_y >= 0 && listview->drag_motion_y-listview->scrollpos-3 < y+h && listview->drag_motion_y-listview->scrollpos+3 >= y) {
+ ddb_listview_draw_dnd_marker (listview);
+ }
}
gboolean
@@ -1952,31 +1974,29 @@ ddb_listview_list_track_dragdrop (DdbListview *ps, int y) {
GtkWidget *widget = ps->list;
if (ps->drag_motion_y != -1) {
// erase previous track
- draw_drawable (widget->window, widget->style->black_gc, ps->backbuf, 0, ps->drag_motion_y-3, 0, ps->drag_motion_y-3, widget->allocation.width, 7);
+ draw_drawable (widget->window, widget->style->black_gc, ps->backbuf, 0, ps->drag_motion_y-3-ps->scrollpos, 0, ps->drag_motion_y-ps->scrollpos-3, widget->allocation.width, 7);
}
+ if (y == -1) {
+ ps->drag_motion_y = -1;
+ return;
+ }
int sel = ddb_listview_dragdrop_get_row_from_coord (ps, y);
if (sel == -1) {
if (ps->binding->count () == 0) {
ps->drag_motion_y = 0;
}
else {
- ps->drag_motion_y = ddb_listview_get_row_pos (ps, ps->binding->count ()-1) - ps->scrollpos + ps->rowheight;
+ // after last row
+ ps->drag_motion_y = ddb_listview_get_row_pos (ps, ps->binding->count ()-1) + ps->rowheight;
}
}
else {
- ps->drag_motion_y = ddb_listview_get_row_pos (ps, sel) - ps->scrollpos;
+ ps->drag_motion_y = ddb_listview_get_row_pos (ps, sel);
}
- GdkColor clr;
- gtkui_get_listview_cursor_color (&clr);
- GdkGC *gc = gdk_gc_new (widget->window);
- gdk_gc_set_rgb_fg_color (gc, &clr);
- gdk_draw_rectangle (widget->window, gc, TRUE, 0, ps->drag_motion_y-1, widget->allocation.width, 3);
- gdk_draw_rectangle (widget->window, gc, TRUE, 0, ps->drag_motion_y-3, 3, 7);
- gdk_draw_rectangle (widget->window, gc, TRUE, widget->allocation.width-3, ps->drag_motion_y-3, 3, 7);
- g_object_unref (gc);
-
+ ddb_listview_draw_dnd_marker (ps);
+
if (y < 10) {
ps->scroll_pointer_y = y;
ps->scroll_mode = 1;
diff --git a/plugins/gtkui/trkproperties.c b/plugins/gtkui/trkproperties.c
index 80e343d6..3dca1718 100644
--- a/plugins/gtkui/trkproperties.c
+++ b/plugins/gtkui/trkproperties.c
@@ -176,14 +176,14 @@ trkproperties_fill_metadata (void) {
gtk_list_store_set (propstore, &iter, 0, "Embedded Cuesheet", 1, (deadbeef->pl_get_item_flags (track) & DDB_HAS_EMBEDDED_CUESHEET) ? "Yes" : "No", -1);
gtk_list_store_append (propstore, &iter);
- snprintf (temp, sizeof (temp), "%0.2f dB", amp_to_db (track->replaygain_album_gain));
+ snprintf (temp, sizeof (temp), "%0.2f dB", track->replaygain_album_gain);
gtk_list_store_set (propstore, &iter, 0, "REPLAYGAIN_ALBUM_GAIN", 1, temp, -1);
gtk_list_store_append (propstore, &iter);
snprintf (temp, sizeof (temp), "%0.6f", track->replaygain_album_peak);
gtk_list_store_set (propstore, &iter, 0, "REPLAYGAIN_ALBUM_PEAK", 1, temp, -1);
gtk_list_store_append (propstore, &iter);
- snprintf (temp, sizeof (temp), "%0.2f dB", amp_to_db (track->replaygain_track_gain));
+ snprintf (temp, sizeof (temp), "%0.2f dB", track->replaygain_track_gain);
gtk_list_store_set (propstore, &iter, 0, "REPLAYGAIN_TRACK_GAIN", 1, temp, -1);
gtk_list_store_append (propstore, &iter);
snprintf (temp, sizeof (temp), "%0.6f", track->replaygain_track_peak);
diff --git a/plugins/vfs_curl/vfs_curl.c b/plugins/vfs_curl/vfs_curl.c
index eb64b17d..6f65f4e6 100644
--- a/plugins/vfs_curl/vfs_curl.c
+++ b/plugins/vfs_curl/vfs_curl.c
@@ -25,10 +25,8 @@
#include <time.h>
#include "../../deadbeef.h"
-#pragma GCC optimize("O0")
-
-#define trace(...) { fprintf(stderr, __VA_ARGS__); }
-//#define trace(fmt,...)
+//#define trace(...) { fprintf(stderr, __VA_ARGS__); }
+#define trace(fmt,...)
#define min(x,y) ((x)<(y)?(x):(y))
#define max(x,y) ((x)>(y)?(x):(y))
@@ -556,18 +554,18 @@ http_thread_func (void *ctx) {
deadbeef->mutex_lock (fp->mutex);
if (status == 0 && fp->length < 0 && fp->status != STATUS_ABORTED && fp->status != STATUS_SEEK) {
trace ("vfs_curl: restarting stream\n");
+ // NOTE: don't do http_stream_reset here - we don't want to cut the ending
fp->status = STATUS_INITIAL;
- fp->skipbytes = 0;
- if (fp->content_type) {
- free (fp->content_type);
- fp->content_type = NULL;
- }
- fp->seektoend = 0;
fp->gotheader = 0;
fp->icyheader = 0;
fp->gotsomeheader = 0;
- fp->wait_meta = 0;
+ fp->metadata_size = 0;
+ fp->metadata_have_size = 0;
+ fp->skipbytes = 0;
+ fp->nheaderpackets = 0;
+ fp->seektoend = 0;
fp->icy_metaint = 0;
+ fp->wait_meta = 0;
deadbeef->mutex_unlock (fp->mutex);
continue;
}
@@ -636,15 +634,16 @@ http_set_track (DB_FILE *f, DB_playItem_t *it) {
static void
http_close (DB_FILE *stream) {
- trace ("http_close\n");
+ trace ("http_close %p\n", stream);
assert (stream);
HTTP_FILE *fp = (HTTP_FILE *)stream;
+
+ deadbeef->mutex_lock (fp->mutex);
if (fp->tid) {
- deadbeef->mutex_lock (fp->mutex);
fp->status = STATUS_ABORTED;
+ trace ("http_close thread_join\n");
deadbeef->mutex_unlock (fp->mutex);
deadbeef->thread_join (fp->tid);
- deadbeef->mutex_free (fp->mutex);
}
if (fp->content_type) {
free (fp->content_type);
@@ -655,7 +654,9 @@ http_close (DB_FILE *stream) {
if (fp->url) {
free (fp->url);
}
+ deadbeef->mutex_free (fp->mutex);
free (stream);
+ trace ("http_close done\n");
}
static size_t
@@ -851,14 +852,14 @@ http_get_content_type (DB_FILE *stream) {
void
http_abort (DB_FILE *fp) {
- trace ("http_abort\n");
+ trace ("http_abort %p\n", fp);
HTTP_FILE *f = (HTTP_FILE *)fp;
if (f->tid) {
deadbeef->mutex_lock (f->mutex);
f->status = STATUS_ABORTED;
deadbeef->mutex_unlock (f->mutex);
- deadbeef->thread_join (f->tid);
}
+ trace ("http_abort done\n");
}
static int
diff --git a/streamer.c b/streamer.c
index 1d4b11d1..082ccb19 100644
--- a/streamer.c
+++ b/streamer.c
@@ -1140,22 +1140,22 @@ apply_replay_gain_int16 (playItem_t *it, char *bytes, int size) {
if (it->replaygain_track_gain == 0) {
return;
}
+ vol = db_to_amp (streaming_track->replaygain_track_gain) * 1000;
if (conf_replaygain_scale && replaygain_scale) {
- vol = db_to_amp (streaming_track->replaygain_track_gain)/streaming_track->replaygain_track_peak * 1000;
- }
- else {
- vol = db_to_amp (streaming_track->replaygain_track_gain) * 1000;
+ if (vol * streaming_track->replaygain_track_peak > 1000) {
+ vol = 1000 / streaming_track->replaygain_track_peak;
+ }
}
}
else if (conf_replaygain_mode == 2) {
if (it->replaygain_album_gain == 0) {
return;
}
+ vol = db_to_amp (streaming_track->replaygain_album_gain) * 1000;
if (conf_replaygain_scale && replaygain_scale) {
- vol = db_to_amp (streaming_track->replaygain_album_gain)/streaming_track->replaygain_album_peak * 1000;
- }
- else {
- vol = db_to_amp (streaming_track->replaygain_album_gain) * 1000;
+ if (vol * streaming_track->replaygain_album_peak > 1000) {
+ vol = 1000 / streaming_track->replaygain_album_peak;
+ }
}
}
int16_t *s = (int16_t*)bytes;
@@ -1182,22 +1182,22 @@ apply_replay_gain_float32 (playItem_t *it, char *bytes, int size) {
if (it->replaygain_track_gain == 0) {
return;
}
+ vol = db_to_amp (it->replaygain_track_gain);
if (conf_replaygain_scale && replaygain_scale) {
- vol = db_to_amp (it->replaygain_track_gain)/it->replaygain_track_peak;
- }
- else {
- vol = db_to_amp (it->replaygain_track_gain);
+ if (vol * it->replaygain_track_peak > 1.f) {
+ vol = 1.f / it->replaygain_track_peak;
+ }
}
}
else if (conf_replaygain_mode == 2) {
if (it->replaygain_album_gain == 0) {
return;
}
+ vol = db_to_amp (it->replaygain_album_gain);
if (conf_replaygain_scale && replaygain_scale) {
- vol = db_to_amp (it->replaygain_album_gain)/it->replaygain_album_peak;
- }
- else {
- vol = db_to_amp (it->replaygain_album_gain);
+ if (vol * it->replaygain_album_peak > 1.f) {
+ vol = 1.f / it->replaygain_album_peak;
+ }
}
}
float *s = (float*)bytes;