diff options
author | waker <wakeroid@gmail.com> | 2010-12-02 22:23:43 +0100 |
---|---|---|
committer | waker <wakeroid@gmail.com> | 2010-12-02 22:23:43 +0100 |
commit | 893bbd516e7c0b7e6b7e49fe472e49284134cc1f (patch) | |
tree | 5007a1ca818541ea71ee33e79e887f0974655290 /plugins/gtkui/converter.c | |
parent | d7a0f82a4196f6f79863fe8ba839d96c44ee0fdc (diff) |
converter prototype
Diffstat (limited to 'plugins/gtkui/converter.c')
-rw-r--r-- | plugins/gtkui/converter.c | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/plugins/gtkui/converter.c b/plugins/gtkui/converter.c new file mode 100644 index 00000000..f1a5031d --- /dev/null +++ b/plugins/gtkui/converter.c @@ -0,0 +1,203 @@ +/* + DeaDBeeF - ultimate music player for GNU/Linux systems with X11 + Copyright (C) 2009-2010 Alexey Yakovenko <waker@users.sourceforge.net> + + 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. +*/ +#include <string.h> +#include <stdlib.h> +#include <assert.h> +#include "converter.h" +#include "support.h" +#include "interface.h" +#include "gtkui.h" + +static GtkWidget *converter; + +void +converter_show (void) { + if (!converter) { + converter = create_converterdlg (); + gtk_entry_set_text (GTK_ENTRY (lookup_widget (converter, "output_folder")), deadbeef->conf_get_str ("converter.output_folder", "")); + gtk_entry_set_text (GTK_ENTRY (lookup_widget (converter, "encoder_cmd_line")), deadbeef->conf_get_str ("converter.encoder", "")); + } + gtk_widget_show (converter); +} + +void +on_converter_output_browse_clicked (GtkButton *button, + gpointer user_data) +{ + GtkWidget *dlg = gtk_file_chooser_dialog_new (_("Select folder..."), GTK_WINDOW (converter), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); + + gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dlg), FALSE); + // restore folder + gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (dlg), deadbeef->conf_get_str ("filechooser.lastdir", "")); + int response = 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.lastdir", folder); + g_free (folder); + deadbeef->sendmessage (M_CONFIGCHANGED, 0, 0, 0); + } + if (response == GTK_RESPONSE_OK) { + folder = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dlg)); + gtk_widget_destroy (dlg); + if (folder) { + GtkWidget *entry = lookup_widget (converter, "output_folder"); + gtk_entry_set_text (GTK_ENTRY (entry), folder); + g_free (folder); + } + } + else { + gtk_widget_destroy (dlg); + } + converter = NULL; +} + + +void +on_converter_cancel_clicked (GtkButton *button, + gpointer user_data) +{ + gtk_widget_destroy (converter); + converter = NULL; +} + +DB_decoder_t * +plug_get_decoder_for_id (const char *id) { + DB_decoder_t **plugins = deadbeef->plug_get_decoder_list (); + for (int c = 0; plugins[c]; c++) { + if (!strcmp (id, plugins[c]->plugin.id)) { + return plugins[c]; + } + } + return NULL; +} + + +void +on_converter_ok_clicked (GtkButton *button, + gpointer user_data) +{ + char *outfolder = strdup (gtk_entry_get_text (GTK_ENTRY (lookup_widget (converter, "output_folder")))); + deadbeef->conf_set_str ("converter.output_folder", outfolder); + char *encoder = strdup (gtk_entry_get_text (GTK_ENTRY (lookup_widget (converter, "encoder_cmd_line")))); + deadbeef->conf_set_str ("converter.encoder", encoder); + deadbeef->conf_save (); + gtk_widget_destroy (converter); + converter = NULL; + + deadbeef->pl_lock (); + + // copy list + int nsel = deadbeef->pl_getselcount (); + if (0 < nsel) { + DB_playItem_t **items = malloc (sizeof (DB_playItem_t *) * nsel); + if (items) { + int n = 0; + DB_playItem_t *it = deadbeef->pl_get_first (PL_MAIN); + while (it) { + if (deadbeef->pl_is_selected (it)) { + assert (n < nsel); + deadbeef->pl_item_ref (it); + items[n++] = it; + } + DB_playItem_t *next = deadbeef->pl_get_next (it, PL_MAIN); + deadbeef->pl_item_unref (it); + it = next; + } + deadbeef->pl_unlock (); + + // ... convert ... + for (n = 0; n < nsel; n++) { + it = items[n]; + DB_decoder_t *dec = NULL; + dec = plug_get_decoder_for_id (items[n]->decoder_id); + if (dec) { + DB_fileinfo_t *fileinfo = dec->open (0); + if (fileinfo && dec->init (fileinfo, DB_PLAYITEM (it)) != 0) { + dec->free (fileinfo); + fileinfo = NULL; + } + if (fileinfo) { + char *fname = strrchr (it->fname, '/'); + if (!fname) { + fname = it->fname; + } + else { + fname++; + } + char out[1024]; + snprintf (out, sizeof (out), "%s/%s", outfolder, fname); + char enc[1024]; + snprintf (enc, sizeof (enc), encoder, out); + printf ("executing: %s\n", enc); + FILE *fp = popen (enc, "w"); + if (!fp) { + fprintf (stderr, "converter: failed to open encoder: %s\n", encoder); + } + else { + // write wave header + char wavehdr[] = { + 0x52, 0x49, 0x46, 0x46, 0x24, 0x70, 0x0d, 0x00, 0x57, 0x41, 0x56, 0x45, 0x66, 0x6d, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x44, 0xac, 0x00, 0x00, 0x10, 0xb1, 0x02, 0x00, 0x04, 0x00, 0x10, 0x00, 0x64, 0x61, 0x74, 0x61 + }; + fwrite (wavehdr, 1, sizeof (wavehdr), fp); + uint32_t size = (it->endsample-it->startsample) * fileinfo->fmt.channels * fileinfo->fmt.bps / 8; + fwrite (&size, 1, sizeof (size), fp); + + int bs = 8192; + char buffer[bs]; + for (;;) { + int sz = dec->read (fileinfo, buffer, bs); + fwrite (buffer, 1, sz, fp); + if (sz != bs) { + break; + } + } + + pclose (fp); + } + dec->free (fileinfo); + } + } + } + + for (n = 0; n < nsel; n++) { + deadbeef->pl_item_unref (items[n]); + } + free (items); + } + else { + fprintf (stderr, "converter: error allocating memory to store %d tracks\n", nsel); + deadbeef->pl_unlock (); + } + } + + + free (outfolder); + free (encoder); +} + +gboolean +on_converterdlg_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + converter = NULL; + return FALSE; +} + |