diff options
author | albeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-05-13 19:57:27 +0000 |
---|---|---|
committer | albeu <albeu@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-05-13 19:57:27 +0000 |
commit | 0fc19925988a7d07f18d3bcfade0876367ffa2c6 (patch) | |
tree | 9e9b91f3be68ca8f2ce75f9ce5fec886f0246d29 | |
parent | a536c12f99f2770412c67cf6bc3cd9b9a2fe6366 (diff) | |
download | mpv-0fc19925988a7d07f18d3bcfade0876367ffa2c6.tar.bz2 mpv-0fc19925988a7d07f18d3bcfade0876367ffa2c6.tar.xz |
Applied patch from Tobias Diedrich <ranma@gmx.at>, added volume setting
support. Also the dvd subtitles should work now.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@6075 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r-- | libao2/Makefile | 2 | ||||
-rw-r--r-- | libao2/ao_dxr2.c | 58 | ||||
-rw-r--r-- | libvo/vo_dxr2.c | 27 |
3 files changed, 54 insertions, 33 deletions
diff --git a/libao2/Makefile b/libao2/Makefile index 53c2a9e7eb..372cc907fc 100644 --- a/libao2/Makefile +++ b/libao2/Makefile @@ -8,7 +8,7 @@ SRCS=afmt.c audio_out.c ao_mpegpes.c ao_null.c ao_pcm.c ao_plugin.c pl_delay.c p OBJS=$(SRCS:.c=.o) -CFLAGS = $(OPTFLAGS) -I. -I.. $(SDL_INC) $(X11_INC) $(EXTRA_INC) $(DVB_INC) +CFLAGS = $(OPTFLAGS) -I. -I.. $(SDL_INC) $(X11_INC) $(EXTRA_INC) $(DXR2_INC) $(DVB_INC) .SUFFIXES: .c .o diff --git a/libao2/ao_dxr2.c b/libao2/ao_dxr2.c index 63ca4c28cb..4164824413 100644 --- a/libao2/ao_dxr2.c +++ b/libao2/ao_dxr2.c @@ -1,8 +1,9 @@ +#include <math.h> #include <stdio.h> #include <stdlib.h> #include <sys/ioctl.h> #include <inttypes.h> - +#include <dxr2ioctl.h> #include "../config.h" #include "mp_msg.h" #include "bswap.h" @@ -23,8 +24,40 @@ static ao_info_t info = LIBAO_EXTERN(dxr2) +static int volume=19; +extern int dxr2_fd; + // to set/get/query special features/parameters static int control(int cmd,int arg){ + switch(cmd){ + case AOCONTROL_GET_VOLUME: + if(dxr2_fd > 0) { + ao_control_vol_t* vol = (ao_control_vol_t*)arg; + vol->left = vol->right = volume * 19.0 / 100.0; + return CONTROL_OK; + } + return CONTROL_ERROR; + case AOCONTROL_SET_VOLUME: + if(dxr2_fd > 0) { + dxr2_oneArg_t v; + float diff; + ao_control_vol_t* vol = (ao_control_vol_t*)arg; + // We need this trick because the volume stepping is often too small + diff = ((vol->left+vol->right) / 2 - (volume*19.0/100.0)) * 19.0 / 100.0; + v.arg = volume + (diff > 0 ? ceil(diff) : floor(diff)); + if(v.arg > 19) v.arg = 19; + if(v.arg < 0) v.arg = 0; + if(v.arg != volume) { + volume = v.arg; + if( ioctl(dxr2_fd,DXR2_IOC_SET_AUDIO_VOLUME,&v) < 0) { + mp_msg(MSGT_AO,MSGL_ERR,"DXR2 : Setting volume to %d failed\n",volume); + return CONTROL_ERROR; + } + } + return CONTROL_OK; + } + return CONTROL_ERROR; + } return CONTROL_UNKNOWN; } @@ -45,29 +78,32 @@ static int init(int rate,int channels,int format,int flags){ switch(rate){ case 48000: - freq_id=0; + freq_id=DXR2_AUDIO_FREQ_48; break; case 96000: - freq_id=1; + freq_id=DXR2_AUDIO_FREQ_96; break; case 44100: - freq_id=2; + freq_id=DXR2_AUDIO_FREQ_441; break; case 32000: - freq_id=3; + freq_id=DXR2_AUDIO_FREQ_32; break; case 22050: - freq_id=4; + freq_id=DXR2_AUDIO_FREQ_2205; break; -#if 0 +#ifdef DXR2_AUDIO_FREQ_24 + // This is not yet in the dxr2 driver CVS + // you can get the patch at + // http://www.ranmachan.dyndns.org/~ranma/patches/dxr2.pcm1723.20020513 case 24000: - freq_id=5; + freq_id=DXR2_AUDIO_FREQ_24; break; case 64000: - freq_id=6; + freq_id=DXR2_AUDIO_FREQ_64; break; case 88200: - freq_id=7; + freq_id=DXR2_AUDIO_FREQ_882; break; #endif default: @@ -128,7 +164,7 @@ static int play(void* data,int len,int flags){ //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]); + for(i=0;i<len/2;i++) s[i] = bswap_16(s[i]); #endif dxr2_send_lpcm_packet(data,len,0xA0,ao_data.pts-10000,freq_id); } diff --git a/libvo/vo_dxr2.c b/libvo/vo_dxr2.c index 88565344f3..f370c69a36 100644 --- a/libvo/vo_dxr2.c +++ b/libvo/vo_dxr2.c @@ -25,7 +25,7 @@ LIBVO_EXTERN (dxr2) extern float monitor_aspect; extern float movie_aspect; -static int dxr2_fd = -1; +int dxr2_fd = -1; static int movie_w,movie_h; static int fs = 0; @@ -176,7 +176,7 @@ void dxr2_send_packet(unsigned char* data,int len,int id,int timestamp) int ptslen=5; if(dxr2_fd < 0) { - mp_msg(MSGT_VO,MSGL_ERR,"DXR2 isn't ready\n"); + mp_msg(MSGT_VO,MSGL_ERR,"DXR2 fd is not valid\n"); return; } @@ -228,28 +228,14 @@ void dxr2_send_lpcm_packet(unsigned char* data,int len,int id,unsigned int times int ptslen=5; if(dxr2_fd < 0) { - mp_msg(MSGT_VO,MSGL_ERR,"DXR2 isn't ready\n"); + mp_msg(MSGT_VO,MSGL_ERR,"DXR2 fd is not valid\n"); return; } if(last_freq_id != freq_id) { - switch (freq_id) { - case 0: arg=DXR2_AUDIO_FREQ_48; break; - case 1: arg=DXR2_AUDIO_FREQ_96; break; - case 2: arg=DXR2_AUDIO_FREQ_441; break; - case 3: arg=DXR2_AUDIO_FREQ_32; break; - case 4: arg=DXR2_AUDIO_FREQ_2205; break; -#if 0 - // This is not is the dxr2 driver, but in a Tobias Diedrich patch - case 5: arg=DXR2_AUDIO_FREQ_24; break; - case 6: arg=DXR2_AUDIO_FREQ_64; break; - case 7: arg=DXR2_AUDIO_FREQ_882; break; -#endif - } - ioctl(dxr2_fd, DXR2_IOC_SET_AUDIO_SAMPLE_FREQUENCY, &arg); + ioctl(dxr2_fd, DXR2_IOC_SET_AUDIO_SAMPLE_FREQUENCY, &freq_id); last_freq_id = freq_id; } - freq_id=0; if (((int) timestamp)<0) timestamp=0; @@ -316,7 +302,7 @@ void dxr2_send_lpcm_packet(unsigned char* data,int len,int id,unsigned int times // audio sampling frequency (48khz = 0, 96khz = 1) 2 bit // reserved 1 bit // number of audio channels - 1 (e.g. stereo = 1) 3 bit - pack[ptslen+14]=1|(freq_id<<4); + pack[ptslen+14]=1; // dynamic range control (0x80 if off) pack[ptslen+15]=0x80; @@ -326,7 +312,6 @@ void dxr2_send_lpcm_packet(unsigned char* data,int len,int id,unsigned int times len-=payload_size; data+=payload_size; timestamp+=90000/4*payload_size/48000; - // ptslen=0; // store PTS only once, at first packet! } } @@ -508,7 +493,7 @@ static uint32_t draw_slice( uint8_t *srcimg[], int stride[], int w, int h, int x static uint32_t query_format(uint32_t format) { if (format==IMGFMT_MPEGPES) - return VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW|VFCAP_TIMER; + return VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW|VFCAP_TIMER|VFCAP_SPU; return 0; } |