[Mplayer-cvslog] CVS: main/libao2 ao_null.c,1.5,1.6

Arpi of Ize arpi at mplayer.dev.hu
Thu Jan 31 01:32:14 CET 2002


Update of /cvsroot/mplayer/main/libao2
In directory mplayer:/var/tmp.root/cvs-serv26091

Modified Files:
	ao_null.c 
Log Message:
working dummy audio driver, patch by Tobias Diedrich <td at informatik.uni-hannover.de>

Index: ao_null.c
===================================================================
RCS file: /cvsroot/mplayer/main/libao2/ao_null.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ao_null.c	24 Nov 2001 05:21:22 -0000	1.5
+++ ao_null.c	31 Jan 2002 00:32:04 -0000	1.6
@@ -1,6 +1,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#include "afmt.h"
 #include "audio_out.h"
 #include "audio_out_internal.h"
 
@@ -8,12 +9,35 @@
 {
 	"Null audio output",
 	"null",
-	"A'rpi",
+	"Tobias Diedrich",
 	""
 };
 
 LIBAO_EXTERN(null)
 
+struct	timeval last_tv;
+int	buffer;
+
+static int drain(){
+ 
+    struct timeval now_tv;
+    int temp, temp2;
+
+    gettimeofday(&now_tv, 0);
+    temp = now_tv.tv_sec - last_tv.tv_sec;
+    temp *= ao_data.bps;
+    
+    temp2 = now_tv.tv_usec - last_tv.tv_usec;
+    temp2 /= 1000;
+    temp2 *= ao_data.bps;
+    temp2 /= 1000;
+    temp += temp2;
+
+    buffer-=temp;
+    if (buffer<0) buffer=0;
+
+    last_tv = now_tv;
+}
 
 // to set/get/query special features/parameters
 static int control(int cmd,int arg){
@@ -24,9 +48,18 @@
 // return: 1=success 0=fail
 static int init(int rate,int channels,int format,int flags){
 
-    ao_data.outburst=4096;
+    ao_data.buffersize= 65536;
+    ao_data.outburst=1024;
+    ao_data.channels=channels;
+    ao_data.samplerate=rate;
+    ao_data.format=format;
+    ao_data.bps=channels*rate;
+    if (format != AFMT_U8 && format != AFMT_S8)
+	ao_data.bps*=2; 
+    buffer=0;
+    gettimeofday(&last_tv, 0);
 
-    return 0;
+    return 1;
 }
 
 // close audio device
@@ -36,7 +69,7 @@
 
 // stop playing and empty buffers (for seeking/pause)
 static void reset(){
-
+    buffer=0;
 }
 
 // stop playing, keep buffers (for pause)
@@ -54,7 +87,8 @@
 // return: how many bytes can be played without blocking
 static int get_space(){
 
-    return ao_data.outburst;
+    drain();
+    return ao_data.buffersize - buffer;
 }
 
 // plays 'len' bytes of 'data'
@@ -62,13 +96,18 @@
 // return: number of bytes played
 static int play(void* data,int len,int flags){
 
-    return len;
+    int maxbursts = (ao_data.buffersize - buffer) / ao_data.outburst;
+    int playbursts = len / ao_data.outburst;
+    int bursts = playbursts > maxbursts ? maxbursts : playbursts;
+    buffer += bursts * ao_data.outburst;
+    return bursts * ao_data.outburst;
 }
 
 // return: delay in seconds between first and last sample in buffer
 static float get_delay(){
 
-    return 0.0;
+    drain();
+    return (float) buffer / (float) ao_data.bps;
 }
 
 




More information about the MPlayer-cvslog mailing list