diff options
Diffstat (limited to 'plugins/wavpack/wavpack.c')
-rw-r--r-- | plugins/wavpack/wavpack.c | 94 |
1 files changed, 81 insertions, 13 deletions
diff --git a/plugins/wavpack/wavpack.c b/plugins/wavpack/wavpack.c index 5a9b9501..876fc0d3 100644 --- a/plugins/wavpack/wavpack.c +++ b/plugins/wavpack/wavpack.c @@ -19,6 +19,7 @@ #include <string.h> #include <wavpack/wavpack.h> +#include <stdio.h> #include "../../deadbeef.h" #define min(x,y) ((x)<(y)?(x):(y)) @@ -31,6 +32,7 @@ static DB_decoder_t plugin; static DB_functions_t *deadbeef; typedef struct { + DB_FILE *file; WavpackContext *ctx; int startsample; int endsample; @@ -38,11 +40,68 @@ typedef struct { static wvctx_t wvctx; +int32_t wv_read_bytes(void *id, void *data, int32_t bcount) { + trace ("wv_read_bytes\n"); + return deadbeef->fread (data, 1, bcount, id); +} + +uint32_t wv_get_pos(void *id) { + trace ("wv_get_pos\n"); + return deadbeef->ftell (id); +} + +int wv_set_pos_abs(void *id, uint32_t pos) { + trace ("wv_set_pos_abs\n"); + return deadbeef->fseek (id, pos, SEEK_SET); +} +int wv_set_pos_rel(void *id, int32_t delta, int mode) { + trace ("wv_set_pos_rel\n"); + return deadbeef->fseek (id, delta, SEEK_CUR); +} +int wv_push_back_byte(void *id, int c) { + trace ("wv_push_back_byte\n"); + deadbeef->fseek (id, -1, SEEK_CUR); + return deadbeef->ftell (id); +} +uint32_t wv_get_length(void *id) { + trace ("wv_get_length\n"); + size_t pos = deadbeef->ftell (id); + deadbeef->fseek (id, 0, SEEK_END); + size_t sz = deadbeef->ftell (id); + deadbeef->fseek (id, pos, SEEK_SET); + return sz; +} +int wv_can_seek(void *id) { + trace ("wv_can_seek\n"); + return 1; +} + +int32_t wv_write_bytes (void *id, void *data, int32_t bcount) { + return 0; +} + +static WavpackStreamReader wsr = { + .read_bytes = wv_read_bytes, + .get_pos = wv_get_pos, + .set_pos_abs = wv_set_pos_abs, + .set_pos_rel = wv_set_pos_rel, + .push_back_byte = wv_push_back_byte, + .get_length = wv_get_length, + .can_seek = wv_can_seek, + .write_bytes = wv_write_bytes +}; + static int wv_init (DB_playItem_t *it) { memset (&wvctx, 0, sizeof (wvctx)); - wvctx.ctx = WavpackOpenFileInput (it->fname, NULL, OPEN_2CH_MAX|OPEN_WVC, 0); + + wvctx.file = deadbeef->fopen (it->fname); + if (!wvctx.file) { + return -1; + } + wvctx.ctx = WavpackOpenFileInputEx (&wsr, wvctx.file, NULL, NULL, OPEN_2CH_MAX/*|OPEN_WVC*/, 0); if (!wvctx.ctx) { + plugin.free (); return -1; } plugin.info.bps = WavpackGetBitsPerSample (wvctx.ctx); @@ -66,8 +125,13 @@ wv_init (DB_playItem_t *it) { static void wv_free (void) { + if (wvctx.file) { + deadbeef->fclose (wvctx.file); + wvctx.file = NULL; + } if (wvctx.ctx) { WavpackCloseFile (wvctx.ctx); + wvctx.ctx = NULL; } memset (&wvctx, 0, sizeof (wvctx)); } @@ -141,9 +205,15 @@ wv_seek (float sec) { static DB_playItem_t * wv_insert (DB_playItem_t *after, const char *fname) { - WavpackContext *ctx = WavpackOpenFileInput (fname, NULL, 0, 0); + + DB_FILE *fp = deadbeef->fopen (fname); + if (!fp) { + return NULL; + } + WavpackContext *ctx = WavpackOpenFileInputEx (&wsr, fp, NULL, NULL, 0, 0); if (!ctx) { trace ("WavpackOpenFileInput failed"); + deadbeef->fclose (fp); return NULL; } int totalsamples = WavpackGetNumSamples (ctx); @@ -152,6 +222,7 @@ wv_insert (DB_playItem_t *after, const char *fname) { float duration = (float)totalsamples / samplerate; DB_playItem_t *cue_after = deadbeef->pl_insert_cue (after, fname, &plugin, "wv", totalsamples, samplerate); if (cue_after) { + deadbeef->fclose (fp); return cue_after; } @@ -163,18 +234,15 @@ wv_insert (DB_playItem_t *after, const char *fname) { trace ("wv: totalsamples=%d, samplerate=%d, duration=%f\n", totalsamples, samplerate, duration); - FILE *fp = fopen (fname, "rb"); - if (fp) { - int apeerr = deadbeef->junk_read_ape (it, fp); - if (!apeerr) { - trace ("wv: ape tag found\n"); - } - int v1err = deadbeef->junk_read_id3v1 (it, fp); - if (!v1err) { - trace ("wv: id3v1 tag found\n"); - } - fclose (fp); + int apeerr = deadbeef->junk_read_ape (it, fp); + if (!apeerr) { + trace ("wv: ape tag found\n"); + } + int v1err = deadbeef->junk_read_id3v1 (it, fp); + if (!v1err) { + trace ("wv: id3v1 tag found\n"); } + deadbeef->fclose (fp); deadbeef->pl_add_meta (it, "title", NULL); after = deadbeef->pl_insert_item (after, it); |