summaryrefslogtreecommitdiff
path: root/streamer.c
diff options
context:
space:
mode:
Diffstat (limited to 'streamer.c')
-rw-r--r--streamer.c96
1 files changed, 47 insertions, 49 deletions
diff --git a/streamer.c b/streamer.c
index ca1b6b22..16e9150c 100644
--- a/streamer.c
+++ b/streamer.c
@@ -1317,75 +1317,73 @@ streamer_read_async (char *bytes, int size) {
if (fileinfo->fmt.samplerate != -1) {
DB_dsp_t **dsp = deadbeef->plug_get_dsp_list ();
+ int outputsamplesize = (output->fmt.bps>>3)*output->fmt.channels;
+ int inputsamplesize = (fileinfo->fmt.bps>>3)*fileinfo->fmt.channels;
if (!memcmp (&fileinfo->fmt, &output->fmt, sizeof (ddb_waveformat_t))) {
+ // pass through from input to output
bytesread = fileinfo->plugin->read (fileinfo, bytes, size);
if (bytesread != size) {
is_eof = 1;
}
}
- else {
- if (output->fmt.samplerate != fileinfo->fmt.samplerate) {
- // convert to float, pass through streamer DSP chain
- int outputsamplesize = (output->fmt.bps>>3)*output->fmt.channels;
- int inputsamplesize = (fileinfo->fmt.bps>>3)*fileinfo->fmt.channels;
- int dspsamplesize = output->fmt.channels * sizeof (float);
-
- float ratio = output->fmt.samplerate/(float)fileinfo->fmt.samplerate;
+ else if (output->fmt.samplerate != fileinfo->fmt.samplerate) {
+ // convert to float, pass through streamer DSP chain
+ int dspsamplesize = output->fmt.channels * sizeof (float);
- int max_out_frames = size / (output->fmt.channels * (output->fmt.bps>>3));
- int dsp_num_frames = max_out_frames;
+ float ratio = output->fmt.samplerate/(float)fileinfo->fmt.samplerate;
- char outbuf[dsp_num_frames * dspsamplesize];
+ int max_out_frames = size / (output->fmt.channels * (output->fmt.bps>>3));
+ int dsp_num_frames = max_out_frames;
- bytesread = 0;
+ char outbuf[dsp_num_frames * dspsamplesize];
- ddb_waveformat_t dspfmt;
- memcpy (&dspfmt, &output->fmt, sizeof (dspfmt));
- dspfmt.bps = 32;
- dspfmt.is_float = 1;
+ bytesread = 0;
- int inputsize = dsp_num_frames * inputsamplesize;
- char input[inputsize];
+ ddb_waveformat_t dspfmt;
+ memcpy (&dspfmt, &output->fmt, sizeof (dspfmt));
+ dspfmt.bps = 32;
+ dspfmt.is_float = 1;
- // decode pcm
- int nb = fileinfo->plugin->read (fileinfo, input, inputsize);
- if (nb != inputsize) {
- is_eof = 1;
- }
- inputsize = nb;
+ int inputsize = dsp_num_frames * inputsamplesize;
+ char input[inputsize];
- if (inputsize > 0) {
- // make 2x size buffer for float data
- char tempbuf[inputsize/inputsamplesize * dspsamplesize * 2];
+ // decode pcm
+ int nb = fileinfo->plugin->read (fileinfo, input, inputsize);
+ if (nb != inputsize) {
+ is_eof = 1;
+ }
+ inputsize = nb;
- // convert to float
- int tempsize = pcm_convert (&fileinfo->fmt, input, &dspfmt, tempbuf, inputsize);
+ if (inputsize > 0) {
+ // make 2x size buffer for float data
+ char tempbuf[inputsize/inputsamplesize * dspsamplesize * 2];
- srcplug->set_ratio (src, ratio);
+ // convert to float
+ int tempsize = pcm_convert (&fileinfo->fmt, input, &dspfmt, tempbuf, inputsize);
- int nframes = inputsize / inputsamplesize;
- DB_dsp_instance_t *dsp = src;
- while (dsp) {
- nframes = srcplug->dsp.process (dsp, (float *)tempbuf, nframes, dspfmt.channels);
- dsp = dsp->next;
- }
- int n = pcm_convert (&dspfmt, tempbuf, &output->fmt, bytes, nframes * dspsamplesize);
+ srcplug->set_ratio (src, ratio);
- bytesread += n;
+ int nframes = inputsize / inputsamplesize;
+ DB_dsp_instance_t *dsp = src;
+ while (dsp) {
+ nframes = dsp->plugin->process (dsp, (float *)tempbuf, nframes, dspfmt.channels);
+ dsp = dsp->next;
}
+ int n = pcm_convert (&dspfmt, tempbuf, &output->fmt, bytes, nframes * dspsamplesize);
+
+ bytesread += n;
}
- else {
- int outputsamplesize = (output->fmt.bps>>3)*output->fmt.channels;
- int inputsamplesize = (fileinfo->fmt.bps>>3)*fileinfo->fmt.channels;
- int inputsize = size/outputsamplesize*inputsamplesize;
- char input[inputsize];
- int nb = fileinfo->plugin->read (fileinfo, input, inputsize);
- if (nb != inputsize) {
- is_eof = 1;
- }
- inputsize = nb;
- bytesread = pcm_convert (&fileinfo->fmt, input, &output->fmt, bytes, inputsize);
+ }
+ else {
+ // convert from input fmt to output fmt
+ int inputsize = size/outputsamplesize*inputsamplesize;
+ char input[inputsize];
+ int nb = fileinfo->plugin->read (fileinfo, input, inputsize);
+ if (nb != inputsize) {
+ is_eof = 1;
}
+ inputsize = nb;
+ bytesread = pcm_convert (&fileinfo->fmt, input, &output->fmt, bytes, inputsize);
}
#if WRITE_DUMP
if (bytesread) {