changeset 4424:561de830fdf1

working dummy audio driver, patch by Tobias Diedrich <td@informatik.uni-hannover.de>
author arpi
date Thu, 31 Jan 2002 00:32:04 +0000
parents ed500b952d2d
children 6144f63cbaa1
files libao2/ao_null.c
diffstat 1 files changed, 46 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/libao2/ao_null.c	Wed Jan 30 22:05:46 2002 +0000
+++ b/libao2/ao_null.c	Thu Jan 31 00:32:04 2002 +0000
@@ -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;
 }