summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/gtkui/converter.c44
1 files changed, 41 insertions, 3 deletions
diff --git a/plugins/gtkui/converter.c b/plugins/gtkui/converter.c
index 18a7fb82..d1ac7163 100644
--- a/plugins/gtkui/converter.c
+++ b/plugins/gtkui/converter.c
@@ -558,6 +558,9 @@ on_converter_ok_clicked (GtkButton *button,
combo = GTK_COMBO_BOX (lookup_widget (converter, "dsp_preset"));
int dsp_idx = gtk_combo_box_get_active (combo);
+ combo = GTK_COMBO_BOX (lookup_widget (converter, "output_format"));
+ int selected_format = gtk_combo_box_get_active (combo);
+
gtk_widget_destroy (converter);
converter = NULL;
@@ -650,6 +653,16 @@ on_converter_ok_clicked (GtkButton *button,
uint32_t outsr = fileinfo->fmt.samplerate;
uint16_t outch = fileinfo->fmt.channels;
uint16_t outbps = fileinfo->fmt.bps;
+ if (selected_format != 0) {
+ switch (selected_format) {
+ case 1 ... 4:
+ outbps = selected_format * 8;
+ break;
+ case 5:
+ outbps = 32;
+ break;
+ }
+ }
int samplesize = fileinfo->fmt.channels * fileinfo->fmt.bps / 8;
int bs = 10250 * samplesize;
@@ -669,7 +682,9 @@ on_converter_ok_clicked (GtkButton *button,
float ratio = 1;
if (dsp_preset) {
ddb_waveformat_t fmt;
+ ddb_waveformat_t outfmt;
memcpy (&fmt, &fileinfo->fmt, sizeof (fmt));
+ memcpy (&outfmt, &fileinfo->fmt, sizeof (fmt));
fmt.bps = 32;
fmt.is_float = 1;
deadbeef->pcm_convert (&fileinfo->fmt, buffer, &fmt, dspbuffer, sz);
@@ -681,15 +696,36 @@ on_converter_ok_clicked (GtkButton *button,
dsp = dsp->next;
}
- deadbeef->pcm_convert (&fmt, dspbuffer, &fileinfo->fmt, buffer, frames * sizeof (float) * fmt.channels);
outsr = fmt.samplerate;
outch = fmt.channels;
- sz = frames * samplesize;
+
+ outfmt.bps = outbps;
+ outfmt.channels = outch;
+ outfmt.samplerate = outsr;
+
+ int n = deadbeef->pcm_convert (&fmt, dspbuffer, &outfmt, buffer, frames * sizeof (float) * fmt.channels);
+ sz = n;//frames * outch * outbps / 8;
+ }
+ else if (fileinfo->fmt.bps != outbps, 1) {
+ ddb_waveformat_t outfmt;
+ memcpy (&outfmt, &fileinfo->fmt, sizeof (outfmt));
+ outfmt.bps = outbps;
+ outfmt.channels = outch;
+ outfmt.samplerate = outsr;
+
+ int frames = sz / samplesize;
+ int n = deadbeef->pcm_convert (&fileinfo->fmt, buffer, &outfmt, dspbuffer, frames * samplesize);
+ memcpy (buffer, dspbuffer, n);
+ sz = n;//frames * outch * outbps / 8;
}
outsize += sz;
if (!header_written) {
- uint32_t size = (it->endsample-it->startsample) * fileinfo->fmt.channels * fileinfo->fmt.bps / 8;
+ uint32_t size = (it->endsample-it->startsample) * outch * outbps / 8;
+ if (!size) {
+ size = deadbeef->pl_get_item_duration (it) * fileinfo->fmt.samplerate * outch * outbps / 8;
+
+ }
if (outsr != fileinfo->fmt.samplerate) {
uint64_t temp = size;
@@ -700,6 +736,8 @@ on_converter_ok_clicked (GtkButton *button,
memcpy (&wavehdr[22], &outch, 2);
memcpy (&wavehdr[24], &outsr, 4);
+ uint16_t blockalign = outch * outbps / 8;
+ memcpy (&wavehdr[32], &blockalign, 2);
memcpy (&wavehdr[34], &outbps, 2);
fwrite (wavehdr, 1, sizeof (wavehdr), temp_file);