From eb2e31af661b9d1d81891f88b6fa8faf648d60d1 Mon Sep 17 00:00:00 2001 From: Eduard Hasenleithner Date: Sun, 22 Jul 2001 11:22:00 +0000 Subject: Fixed missing case for 5.1 output. Added resample bypass (do_resample). Replaced package drop printf with xprintf. CVS patchset: 321 CVS date: 2001/07/22 11:22:00 --- src/audio_out/audio_oss_out.c | 18 +++++++++-- src/audio_out/resample.c | 70 ++++++++++++++++++++++++++++++++++++++++++- src/audio_out/resample.h | 5 +++- 3 files changed, 88 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/audio_out/audio_oss_out.c b/src/audio_out/audio_oss_out.c index 8d36ae818..84d8dc134 100644 --- a/src/audio_out/audio_oss_out.c +++ b/src/audio_out/audio_oss_out.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: audio_oss_out.c,v 1.21 2001/07/20 22:37:56 guenter Exp $ + * $Id: audio_oss_out.c,v 1.22 2001/07/22 11:22:00 ehasenle Exp $ */ /* required for swab() */ @@ -108,6 +108,7 @@ typedef struct oss_functions_s { int audio_started; uint32_t last_audio_vpts; + int do_resample; } oss_functions_t; /* @@ -243,6 +244,8 @@ static int ao_open(ao_functions_t *this_gen, ioctl(this->audio_fd,SNDCTL_DSP_SETFRAGMENT,&tmp); */ + this->do_resample = this->output_sample_rate != this->input_sample_rate; + return 1; } @@ -348,7 +351,10 @@ static int ao_write_audio_data(ao_functions_t *this_gen, if (!bDropPackage) { int num_output_samples = num_samples * (this->output_sample_rate) / this->input_sample_rate; - switch (this->mode) { + if (!this->do_resample) { + write(this->audio_fd, output_samples, + num_output_samples * this->num_channels * 2); + } else switch (this->mode) { case AO_CAP_MODE_MONO: audio_out_resample_mono (output_samples, num_samples, this->sample_buffer, num_output_samples); @@ -369,6 +375,11 @@ static int ao_write_audio_data(ao_functions_t *this_gen, this->sample_buffer, num_output_samples); write(this->audio_fd, this->sample_buffer, num_output_samples * 10); break; + case AO_CAP_MODE_5_1CHANNEL: + audio_out_resample_6channel (output_samples, num_samples, + this->sample_buffer, num_output_samples); + write(this->audio_fd, this->sample_buffer, num_output_samples * 12); + break; case AO_CAP_MODE_AC3: num_output_samples = num_samples+8; this->sample_buffer[0] = 0xf872; //spdif syncword @@ -394,7 +405,8 @@ static int ao_write_audio_data(ao_functions_t *this_gen, this->bytes_in_buffer += num_output_samples * 2 * this->num_channels; this->audio_started = 1; } else { - printf ("audio_oss_out: audio package (vpts = %d) dropped\n", vpts); + xprintf (VERBOSE|AUDIO, "audio_oss_out: audio package (vpts = %d %d)" + "dropped\n", vpts, gap); } return 1; diff --git a/src/audio_out/resample.c b/src/audio_out/resample.c index 158b17c59..8a5419d24 100644 --- a/src/audio_out/resample.c +++ b/src/audio_out/resample.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: resample.c,v 1.2 2001/05/27 23:48:12 guenter Exp $ + * $Id: resample.c,v 1.3 2001/07/22 11:22:00 ehasenle Exp $ */ #ifdef HAVE_CONFIG_H @@ -212,3 +212,71 @@ void audio_out_resample_5channel(int16_t* input_samples, uint32_t in_samples, } +void audio_out_resample_6channel(int16_t* input_samples, uint32_t in_samples, + int16_t* output_samples, uint32_t out_samples) +{ + int osample; + /* 16+16 fixed point math */ + uint32_t isample = 0; + uint32_t istep = (in_samples << 16)/out_samples; + +#ifdef VERBOSE + printf ("Audio : resample %d samples to %d\n", + in_samples, out_samples); +#endif + + for (osample = 0; osample < out_samples - 1; osample++) { + int s1; + int s2; + int16_t os; + uint32_t t = isample&0xffff; + + /* don't "optimize" the (isample >> 16)*2 to (isample >> 15) */ + s1 = input_samples[(isample >> 16)*6]; + s2 = input_samples[(isample >> 16)*6+6]; + + os = (s1 * (0x10000-t)+ s2 * t) >> 16; + output_samples[osample * 6] = os; + + s1 = input_samples[(isample >> 16)*6+1]; + s2 = input_samples[(isample >> 16)*6+7]; + + os = (s1 * (0x10000-t)+ s2 * t) >> 16; + output_samples[(osample * 6 )+1] = os; + + s1 = input_samples[(isample >> 16)*6+2]; + s2 = input_samples[(isample >> 16)*6+8]; + + os = (s1 * (0x10000-t)+ s2 * t) >> 16; + output_samples[(osample * 6 )+2] = os; + + s1 = input_samples[(isample >> 16)*6+3]; + s2 = input_samples[(isample >> 16)*6+9]; + + os = (s1 * (0x10000-t)+ s2 * t) >> 16; + output_samples[(osample * 6 )+3] = os; + + s1 = input_samples[(isample >> 16)*6+4]; + s2 = input_samples[(isample >> 16)*6+10]; + + os = (s1 * (0x10000-t)+ s2 * t) >> 16; + output_samples[(osample * 6 )+4] = os; + + s1 = input_samples[(isample >> 16)*6+5]; + s2 = input_samples[(isample >> 16)*6+11]; + + os = (s1 * (0x10000-t)+ s2 * t) >> 16; + output_samples[(osample * 6 )+5] = os; + + isample += istep; + } + + output_samples[out_samples*6-6] = input_samples[in_samples*6-6]; + output_samples[out_samples*6-5] = input_samples[in_samples*6-5]; + output_samples[out_samples*6-4] = input_samples[in_samples*6-4]; + output_samples[out_samples*6-3] = input_samples[in_samples*6-3]; + output_samples[out_samples*6-2] = input_samples[in_samples*6-2]; + output_samples[out_samples*6-1] = input_samples[in_samples*6-1]; +} + + diff --git a/src/audio_out/resample.h b/src/audio_out/resample.h index 11c9e4a45..0b5facf47 100644 --- a/src/audio_out/resample.h +++ b/src/audio_out/resample.h @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: resample.h,v 1.1 2001/04/24 20:53:00 f1rmb Exp $ + * $Id: resample.h,v 1.2 2001/07/22 11:22:00 ehasenle Exp $ * * utilitiy functions for audio drivers * @@ -39,4 +39,7 @@ void audio_out_resample_4channel(int16_t* input_samples, uint32_t in_samples, void audio_out_resample_5channel(int16_t* input_samples, uint32_t in_samples, int16_t* output_samples, uint32_t out_samples); +void audio_out_resample_6channel(int16_t* input_samples, uint32_t in_samples, + int16_t* output_samples, uint32_t out_samples); + #endif -- cgit v1.2.3