summaryrefslogtreecommitdiff
path: root/plugins/converter
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2011-05-05 21:34:36 +0200
committerGravatar waker <wakeroid@gmail.com>2011-05-05 21:34:49 +0200
commit56bdc640301c557a32689747d7fc5e9dc28dc05f (patch)
tree64a4a42bf20e4cdb27ecd7f3c89e8d5f75caf1d5 /plugins/converter
parent3ae2505e90a4b9f81930e1cb8c0bae11e3d30932 (diff)
added installation of standard encoder presets
Diffstat (limited to 'plugins/converter')
-rw-r--r--plugins/converter/Makefile.am15
-rw-r--r--plugins/converter/converter.c95
2 files changed, 110 insertions, 0 deletions
diff --git a/plugins/converter/Makefile.am b/plugins/converter/Makefile.am
index b0c56d32..507a18f0 100644
--- a/plugins/converter/Makefile.am
+++ b/plugins/converter/Makefile.am
@@ -4,6 +4,21 @@ if STATICLINK
pkglib_LTLIBRARIES = converter.la converter_gtkui.la converter_gtkui.fallback.la
else
pkglib_LTLIBRARIES = converter.la converter_gtkui.la
+
+convdatadir = $(libdir)/deadbeef/convpresets
+convdata_DATA = \
+ presets/AAC_(Nero_FAAC).txt\
+ presets/FLAC_(compression_level_5).txt\
+ presets/MP3_CBR_320_Kbps_(Lame).txt\
+ presets/MP3_VBR_192Kbps_(Lame).txt\
+ presets/MS_RIFF_WAV.txt\
+ presets/MusePack.txt\
+ presets/Ogg_Vorbis_(-q_5).txt\
+ presets/TTA.txt\
+ presets/WavPack.txt
+
+EXTRA_DIST = $(convdata_DATA)
+
endif
AM_CFLAGS = $(CFLAGS) -std=c99 -fPIC
diff --git a/plugins/converter/converter.c b/plugins/converter/converter.c
index 6216258f..c16fb2b4 100644
--- a/plugins/converter/converter.c
+++ b/plugins/converter/converter.c
@@ -27,6 +27,7 @@
#ifndef PATH_MAX
#define PATH_MAX 1024 /* max # of characters in a path name */
#endif
+#define min(x,y) ((x)<(y)?(x):(y))
#define trace(...) { fprintf(stderr, __VA_ARGS__); }
//#define trace(fmt,...)
@@ -386,8 +387,102 @@ scandir_preset_filter (const struct dirent *ent) {
return 0;
}
+static int
+copy_file (const char *in, const char *out) {
+ int BUFFER_SIZE = 1000;
+ FILE *fin = fopen (in, "rb");
+ if (!fin) {
+ trace ("converter: failed to open file %s for reading\n", in);
+ return -1;
+ }
+ FILE *fout = fopen (out, "w+b");
+ if (!fout) {
+ fclose (fin);
+ trace ("converter: failed to open file %s for writing\n", out);
+ return -1;
+ }
+ char *buf = malloc (BUFFER_SIZE);
+ if (!buf) {
+ trace ("converter: failed to alloc %d bytes\n", BUFFER_SIZE);
+ fclose (fin);
+ fclose (fout);
+ return -1;
+ }
+
+ fseek (fin, 0, SEEK_END);
+ size_t sz = ftell (fin);
+ rewind (fin);
+
+ while (sz > 0) {
+ int rs = min (sz, BUFFER_SIZE);
+ if (fread (buf, rs, 1, fin) != 1) {
+ trace ("converter: failed to read file %s\n", in);
+ break;
+ }
+ if (fwrite (buf, rs, 1, fout) != 1) {
+ trace ("converter: failed to write file %s\n", out);
+ break;
+ }
+ sz -= rs;
+ }
+ free (buf);
+ fclose (fin);
+ fclose (fout);
+ if (sz > 0) {
+ unlink (out);
+ }
+ return 0;
+}
+
int
load_encoder_presets (void) {
+ // check if we need to install presets
+ char ppath[1024];
+ char epath[1024];
+ char fpath[1024];
+ snprintf (ppath, sizeof (ppath), "%s/presets", deadbeef->get_config_dir ());
+ snprintf (epath, sizeof (epath), "%s/encoders", ppath);
+ snprintf (fpath, sizeof (fpath), "%s/.installed", epath);
+ struct stat stat_buf;
+ if (0 != stat (fpath, &stat_buf)) {
+ // file not found, install all presets from plugin_dir/convpresets/
+ mkdir (ppath, 0755);
+ mkdir (epath, 0755);
+ char preset_src_dir[1024];
+ snprintf (preset_src_dir, sizeof (preset_src_dir), "%s/convpresets", deadbeef->get_plugin_dir ());
+ struct dirent **namelist = NULL;
+ int n = scandir (preset_src_dir, &namelist, NULL, dirent_alphasort);
+ for (int i = 0; i < n; i++) {
+ // replace _ with spaces
+ char new_name[1024];
+ char *o = new_name;
+ char *in = namelist[i]->d_name;
+ while (*in) {
+ if (*in == '_') {
+ *o++ = ' ';
+ in++;
+ }
+ else {
+ *o++ = *in++;
+ }
+ }
+ *o = 0;
+ char in_name[1024];
+ char out_name[1024];
+ snprintf (in_name, sizeof (in_name), "%s/%s", preset_src_dir, namelist[i]->d_name);
+ snprintf (out_name, sizeof (out_name), "%s/%s", epath, new_name);
+ copy_file (in_name, out_name);
+ free (namelist[i]);
+ }
+ if (namelist) {
+ free (namelist);
+ }
+ FILE *fp = fopen (fpath, "w+b");
+ if (fp) {
+ fclose (fp);
+ }
+ }
+
ddb_encoder_preset_t *tail = NULL;
char path[1024];
if (snprintf (path, sizeof (path), "%s/presets/encoders", deadbeef->get_config_dir ()) < 0) {