[MPlayer-dev-eng] Re: [PATCH] ao_null buglet

Tobias Diedrich td at informatik.uni-hannover.de
Mon Jan 28 14:30:44 CET 2002


Arpi wrote:

> it won't work, as the null driver doesn't provide timers.
> so it was a temporary solution to report error instead of success, so
> mplayer disables sound.

Then how about this one. It now emulates a real sound device.

-- 
Tobias								PGP: 0x9AC7E0BC
Hannover Fantreffen ML: mailto:fantreffen-request at mantrha.de?subject=subscribe
Manga & Anime Treff Hannover: http://www.mantrha.de/
-------------- next part --------------
--- main/libao2/ao_null.c.orig	Mon Jan 28 00:06:33 2002
+++ main/libao2/ao_null.c	Mon Jan 28 14:29:27 2002
@@ -1,6 +1,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#include "afmt.h"
 #include "audio_out.h"
 #include "audio_out_internal.h"
 
@@ -14,6 +15,29 @@
 
 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-dev-eng mailing list