From d90cdb9cf2344a8891643bdaaeba091603889821 Mon Sep 17 00:00:00 2001 From: waker Date: Sat, 20 Nov 2010 18:10:59 +0100 Subject: added more format converters --- plugins/alsa/alsa.c | 1 + premix.c | 60 ++++++++++++++++++++++++++++++++++++++++++-- scripts/configure_minimal.sh | 0 3 files changed, 59 insertions(+), 2 deletions(-) mode change 100644 => 100755 scripts/configure_minimal.sh diff --git a/plugins/alsa/alsa.c b/plugins/alsa/alsa.c index 31e179ae..887bc205 100644 --- a/plugins/alsa/alsa.c +++ b/plugins/alsa/alsa.c @@ -165,6 +165,7 @@ palsa_set_hw_params (ddb_waveformat_t *fmt) { break; }; + //sample_fmt = SND_PCM_FORMAT_S16_LE; if ((err = snd_pcm_hw_params_set_format (audio, hw_params, sample_fmt)) < 0) { fprintf (stderr, "cannot set sample format (%s)\n", snd_strerror (err)); diff --git a/premix.c b/premix.c index da3f2b7b..89cbef11 100644 --- a/premix.c +++ b/premix.c @@ -53,6 +53,53 @@ pcm_write_samples_8_to_16 (const ddb_waveformat_t * restrict inputfmt, const cha } } +static inline void +pcm_write_samples_8_to_24 (const ddb_waveformat_t * restrict inputfmt, const char * restrict input, const ddb_waveformat_t * restrict outputfmt, char * restrict output, int nsamples, int * restrict channelmap, int outputsamplesize) { + for (int s = 0; s < nsamples; s++) { + for (int c = 0; c < inputfmt->channels; c++) { + if (channelmap[c] != -1) { + char *out = output + (outputfmt->bps >> 3) * channelmap[c]; + out[0] = 0; + out[1] = 0; + out[2] = input[0]; + } + input += 1; + } + output += outputsamplesize; + } +} + +static inline void +pcm_write_samples_8_to_32 (const ddb_waveformat_t * restrict inputfmt, const char * restrict input, const ddb_waveformat_t * restrict outputfmt, char * restrict output, int nsamples, int * restrict channelmap, int outputsamplesize) { + for (int s = 0; s < nsamples; s++) { + for (int c = 0; c < inputfmt->channels; c++) { + if (channelmap[c] != -1) { + char *out = output + (outputfmt->bps >> 3) * channelmap[c]; + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = input[0]; + } + input += 1; + } + output += outputsamplesize; + } +} + +static inline void +pcm_write_samples_8_to_float (const ddb_waveformat_t * restrict inputfmt, const char * restrict input, const ddb_waveformat_t * restrict outputfmt, char * restrict output, int nsamples, int * restrict channelmap, int outputsamplesize) { + for (int s = 0; s < nsamples; s++) { + for (int c = 0; c < inputfmt->channels; c++) { + if (channelmap[c] != -1) { + float sample = (*input) / (float)0x7f; + *((float *)(output + (outputfmt->bps >> 3) * channelmap[c])) = sample; + } + input++; + } + output += outputsamplesize; + } +} + static inline void pcm_write_samples_16_to_16 (const ddb_waveformat_t * restrict inputfmt, const char * restrict input, const ddb_waveformat_t * restrict outputfmt, char * restrict output, int nsamples, int * restrict channelmap, int outputsamplesize) { for (int s = 0; s < nsamples; s++) { @@ -205,10 +252,19 @@ pcm_convert (const ddb_waveformat_t * restrict inputfmt, const char * restrict i if (inputfmt->bps == 8 && outputfmt->bps == 8) { pcm_write_samples_8_to_8 (inputfmt, input, outputfmt, output, nsamples, channelmap, outputsamplesize); } - if (inputfmt->bps == 8 && outputfmt->bps == 16) { + else if (inputfmt->bps == 8 && outputfmt->bps == 16) { pcm_write_samples_8_to_16 (inputfmt, input, outputfmt, output, nsamples, channelmap, outputsamplesize); } - if (inputfmt->bps == 16 && outputfmt->bps == 16) { + else if (inputfmt->bps == 8 && outputfmt->bps == 24) { + pcm_write_samples_8_to_24 (inputfmt, input, outputfmt, output, nsamples, channelmap, outputsamplesize); + } + else if (inputfmt->bps == 8 && outputfmt->bps == 32 && !outputfmt->is_float) { + pcm_write_samples_8_to_32 (inputfmt, input, outputfmt, output, nsamples, channelmap, outputsamplesize); + } + else if (inputfmt->bps == 8 && outputfmt->bps == 32 && outputfmt->is_float) { + pcm_write_samples_8_to_float (inputfmt, input, outputfmt, output, nsamples, channelmap, outputsamplesize); + } + else if (inputfmt->bps == 16 && outputfmt->bps == 16) { pcm_write_samples_16_to_16 (inputfmt, input, outputfmt, output, nsamples, channelmap, outputsamplesize); } else if (inputfmt->bps == 16 && outputfmt->bps == 8) { diff --git a/scripts/configure_minimal.sh b/scripts/configure_minimal.sh old mode 100644 new mode 100755 -- cgit v1.2.3