summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEduard Hasenleithner <ehasenle@users.sourceforge.net>2001-07-22 11:22:00 +0000
committerEduard Hasenleithner <ehasenle@users.sourceforge.net>2001-07-22 11:22:00 +0000
commiteb2e31af661b9d1d81891f88b6fa8faf648d60d1 (patch)
tree6b334b09dce27819d3c14604f71543002c1fdef7 /src
parent85ceda26b256cd05df927ca6d666e1c765d25ab7 (diff)
downloadxine-lib-eb2e31af661b9d1d81891f88b6fa8faf648d60d1.tar.gz
xine-lib-eb2e31af661b9d1d81891f88b6fa8faf648d60d1.tar.bz2
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
Diffstat (limited to 'src')
-rw-r--r--src/audio_out/audio_oss_out.c18
-rw-r--r--src/audio_out/resample.c70
-rw-r--r--src/audio_out/resample.h5
3 files changed, 88 insertions, 5 deletions
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