summaryrefslogtreecommitdiffstats
path: root/libao2
diff options
context:
space:
mode:
authoralbeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-05-13 13:15:40 +0000
committeralbeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-05-13 13:15:40 +0000
commitb6a7934eb5ae4d2bbf435aca79a51ffa4b8ff6c3 (patch)
tree1749ec73ed03b2746589ab8bb73cf7c6cea8349d /libao2
parent927c55fb02d927e45b0f41580f822ec28404442b (diff)
downloadmpv-b6a7934eb5ae4d2bbf435aca79a51ffa4b8ff6c3.tar.bz2
mpv-b6a7934eb5ae4d2bbf435aca79a51ffa4b8ff6c3.tar.xz
Initial support for dxr2. Based on patch from Tobias Diedrich <ranma@gmx.at>.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@6070 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libao2')
-rw-r--r--libao2/ao_dxr2.c143
-rw-r--r--libao2/audio_out.c6
2 files changed, 149 insertions, 0 deletions
diff --git a/libao2/ao_dxr2.c b/libao2/ao_dxr2.c
new file mode 100644
index 0000000000..63ca4c28cb
--- /dev/null
+++ b/libao2/ao_dxr2.c
@@ -0,0 +1,143 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <inttypes.h>
+
+#include "../config.h"
+#include "mp_msg.h"
+#include "bswap.h"
+
+#include "audio_out.h"
+#include "audio_out_internal.h"
+
+#include "afmt.h"
+
+
+static ao_info_t info =
+{
+ "DXR2 audio output",
+ "dxr2",
+ "Tobias Diedrich <ranma@gmx.at>",
+ ""
+};
+
+LIBAO_EXTERN(dxr2)
+
+// to set/get/query special features/parameters
+static int control(int cmd,int arg){
+ return CONTROL_UNKNOWN;
+}
+
+static int freq=0;
+static int freq_id=0;
+
+// open & setup audio device
+// return: 1=success 0=fail
+static int init(int rate,int channels,int format,int flags){
+
+ ao_data.outburst=2048;
+ ao_data.samplerate=rate;
+ ao_data.channels=channels;
+ ao_data.buffersize=2048;
+ ao_data.bps=rate*4;
+ ao_data.format=format;
+ freq=rate;
+
+ switch(rate){
+ case 48000:
+ freq_id=0;
+ break;
+ case 96000:
+ freq_id=1;
+ break;
+ case 44100:
+ freq_id=2;
+ break;
+ case 32000:
+ freq_id=3;
+ break;
+ case 22050:
+ freq_id=4;
+ break;
+#if 0
+ case 24000:
+ freq_id=5;
+ break;
+ case 64000:
+ freq_id=6;
+ break;
+ case 88200:
+ freq_id=7;
+ break;
+#endif
+ default:
+ mp_msg(MSGT_AO,MSGL_ERR,"[AO] dxr2: %d Hz not supported, try \"-aop list=resample\"\n",rate);
+ return 0;
+ }
+
+ return 1;
+}
+
+// close audio device
+static void uninit(){
+
+}
+
+// stop playing and empty buffers (for seeking/pause)
+static void reset(){
+
+}
+
+// stop playing, keep buffers (for pause)
+static void audio_pause()
+{
+ // for now, just call reset();
+ reset();
+}
+
+// resume playing, after audio_pause()
+static void audio_resume()
+{
+}
+
+extern void dxr2_send_packet(unsigned char* data,int len,int id,int timestamp);
+extern void dxr2_send_lpcm_packet(unsigned char* data,int len,int id,int timestamp,int freq_id);
+extern int vo_pts;
+static int preload = 1;
+// return: how many bytes can be played without blocking
+static int get_space(){
+ float x=(float)(vo_pts-ao_data.pts)/90000.0;
+ int y;
+ if(x<=0) return 0;
+ y=freq*4*x;y/=ao_data.outburst;y*=ao_data.outburst;
+ if(y>32768) y=32768;
+ return y;
+}
+
+// plays 'len' bytes of 'data'
+// it should round it down to outburst*n
+// return: number of bytes played
+static int play(void* data,int len,int flags){
+ // MPEG and AC3 don't work :-(
+ if(ao_data.format==AFMT_MPEG)
+ dxr2_send_packet(data,len,0xC0,ao_data.pts);
+ else if(ao_data.format==AFMT_AC3)
+ dxr2_send_packet(data,len,0x80,ao_data.pts);
+ else {
+ int i;
+ //unsigned short *s=data;
+ uint16_t *s=data;
+#ifndef WORDS_BIGENDIAN
+ for(i=0;i<len/2;i++) s[i] = bswap_16(s[i]); // (s[i]>>8)|(s[i]<<8); // le<->be bswap_16(s[i]);
+#endif
+ dxr2_send_lpcm_packet(data,len,0xA0,ao_data.pts-10000,freq_id);
+ }
+ return len;
+}
+
+// return: delay in seconds between first and last sample in buffer
+static float get_delay(){
+
+ return 0.0;
+}
+
diff --git a/libao2/audio_out.c b/libao2/audio_out.c
index f2d1c87c7e..e1c8d6dd7c 100644
--- a/libao2/audio_out.c
+++ b/libao2/audio_out.c
@@ -34,6 +34,9 @@ extern ao_functions_t audio_out_sun;
#ifdef USE_SGI_AUDIO
extern ao_functions_t audio_out_sgi;
#endif
+#ifdef HAVE_DXR2
+extern ao_functions_t audio_out_dxr2;
+#endif
extern ao_functions_t audio_out_mpegpes;
extern ao_functions_t audio_out_pcm;
extern ao_functions_t audio_out_pss;
@@ -50,6 +53,9 @@ ao_functions_t* audio_out_drivers[] =
#ifdef USE_SGI_AUDIO
&audio_out_sgi,
#endif
+#ifdef HAVE_DXR2
+ &audio_out_dxr2,
+#endif
&audio_out_null,
#ifdef HAVE_ALSA5
&audio_out_alsa5,