summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2010-11-20 18:10:59 +0100
committerGravatar waker <wakeroid@gmail.com>2010-11-20 18:10:59 +0100
commitd90cdb9cf2344a8891643bdaaeba091603889821 (patch)
treeb16b98d751f42e85b68b163a675b7c4956613daf
parent553c7dde58674a9846452fbf06c9645fc1174d4e (diff)
added more format converters
-rw-r--r--plugins/alsa/alsa.c1
-rw-r--r--premix.c60
-rwxr-xr-x[-rw-r--r--]scripts/configure_minimal.sh0
3 files changed, 59 insertions, 2 deletions
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
@@ -54,6 +54,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++) {
for (int c = 0; c < inputfmt->channels; c++) {
@@ -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
index 7ec8607d..7ec8607d 100644..100755
--- a/scripts/configure_minimal.sh
+++ b/scripts/configure_minimal.sh