From owner-FreeBSD-users-jp@jp.freebsd.org  Fri Jul 21 16:11:58 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id QAA64807;
	Fri, 21 Jul 2000 16:11:58 +0900 (JST)
	(envelope-from owner-FreeBSD-users-jp@jp.FreeBSD.org)
Received: from mist.nintendo.co.jp (firewall-user@mist.nintendo.co.jp [202.214.242.34])
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) with ESMTP id QAA64802
	for <FreeBSD-users-jp@jp.freebsd.org>; Fri, 21 Jul 2000 16:11:58 +0900 (JST)
	(envelope-from shirai@nintendo.co.jp)
Received: by mist.nintendo.co.jp; id QAA27667; Fri, 21 Jul 2000 16:11:57 +0900 (JST)
Received: from unknown(172.16.1.9) by mist.nintendo.co.jp via smap (V4.2)
	id xma027441; Fri, 21 Jul 00 16:11:20 +0900
Received: from pon.nintendo.co.jp (pon [172.16.1.1])
	by yellow.nintendo.co.jp (8.9.3/3.7W/2000071209) with ESMTP id QAA27923
	for <FreeBSD-users-jp@jp.freebsd.org>; Fri, 21 Jul 2000 16:09:44 +0900 (JST)
Received: from nintendo.co.jp (IDENT:shirai@localhost [127.0.0.1])
	by pon.nintendo.co.jp (8.9.3/3.7W/2000010715) with ESMTP id QAA27136
	for <FreeBSD-users-jp@jp.freebsd.org>; Fri, 21 Jul 2000 16:11:19 +0900
Message-Id: <200007210711.QAA27136@pon.nintendo.co.jp>
To: FreeBSD-users-jp@jp.freebsd.org
In-reply-to: My message of Fri, 21 Jul 2000 09:27:19 JST.
             <200007210027.JAA22970@pon.nintendo.co.jp> 
Date: Fri, 21 Jul 2000 16:11:19 +0900
From: Takashi SHIRAI <shirai@nintendo.co.jp>
Reply-To: FreeBSD-users-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+000315
X-Sequence: FreeBSD-users-jp 53551
Subject: [FreeBSD-users-jp 53551] Re: newpcm
 =?ISO-2022-JP?B?GyRCJEgbKEI=?= timidity++ 
Errors-To: owner-FreeBSD-users-jp@jp.freebsd.org
Sender: owner-FreeBSD-users-jp@jp.freebsd.org
X-Originator: shirai@nintendo.co.jp

$B!!#N#e#c#o$G$9!#(B

In Message-Id <200007210027.JAA22970@pon.nintendo.co.jp> 
        Takashi SHIRAI <shirai@nintendo.co.jp> writes:
> $B!!#N#e#c#o$G$9!#(B

> $B!!@P@n$5$s$N(B reply $B$K$"$k(B #undef $B$K$h$j!"(BSNDCTL_DSP_GETODELAY
> $B$,(B support $B$5$l$F$$$J$$4D6-MQ$N(B binary $B$,=PMh>e$,$j$^$9!#(B
> $B!!$3$N4D6-$G$OBe$o$j$K(B SNDCTL_DSP_GETOSPACE $B$rMQ$$$FH/2;?t$r(B
> $BD4$Y$k$h$&$K<BAu$5$l$F$$$k$N$G$9$,!"0lC6(B pause $B$7$?$jO"B31i(B
> $BAU$7$?$j$9$k$H@5$7$/5!G=$7$J$$$h$&$G$9!#(B

$B!!$3$l!"D>$7$F$_$?$s$G3NG'$*4j$$=PMh$J$$$G$7$g$&$+!)$&$A$K$O(B
$B:G?7$N(B FreeBSD 4-STABLE $BL5$$$7(B ESS $B$@$7$G!"M>$jI8=`E*$H$O8@(B
$B$($J$$4D6-$J$s$G!#(B
$B!!(BTiMidity++-2.9.5 $B$KBP$9$k(B patch $B$K$J$C$F$$$^$9$,!"(B2.9.3 $B0J(B
$B9_$O$3$N(B patch $BItJ,$KJQ99$O$J$$$s$G(B 2.9.[345] $B$K6&DL$7$FM-8z(B
$B$@$H;W$$$^$9!#(B
$B!!C"$7!"(B5/12 $B$N(B 4-STABLE $B0J9_$r;H$C$F$k?M$O!"<j$G(B SNDCTL_DSP
_GETODELAY $B$r(B #undef $B$9$k9T$rDI2C$7$F2<$5$$!#(B

$B!t!!F1$8$b$N$r(B TiMidity++ $B:n<T$N=P1@$5$s$K$bAw$C$F$"$j$^$9!#(B

                                       $BGr0f(B $BN4(B (as $B#N#e#c#o(B)

diff -ur ../TiMidity++-2.9.5/timidity/oss_a.c timidity/oss_a.c
--- ../TiMidity++-2.9.5/timidity/oss_a.c	Tue Apr 11 17:50:12 2000
+++ timidity/oss_a.c	Sat Jul 22 00:34:53 2000
@@ -266,7 +266,9 @@
 	}
 	buf += n;
 	nbytes -= n;
+#ifdef SNDCTL_DSP_GETODELAY
 	output_counter += n;
+#endif
     }
 
     return 0;
@@ -292,14 +294,6 @@
 
     switch(request)
     {
-      case PM_REQ_DISCARD:
-	output_counter = 0;
-	return ioctl(dpm.fd, SNDCTL_DSP_RESET);
-
-      case PM_REQ_FLUSH:
-	output_counter = 0;
-	return ioctl(dpm.fd, SNDCTL_DSP_SYNC);
-
       case PM_REQ_RATE:
 	i = *(int *)arg; /* sample rate in and out */
 	if(ioctl(dpm.fd, SNDCTL_DSP_SPEED, &i) < 0)
@@ -314,6 +308,14 @@
 	return 0;
 
 #ifdef SNDCTL_DSP_GETODELAY
+      case PM_REQ_DISCARD:
+	output_counter = 0;
+	return ioctl(dpm.fd, SNDCTL_DSP_RESET);
+
+      case PM_REQ_FLUSH:
+	output_counter = 0;
+	return ioctl(dpm.fd, SNDCTL_DSP_SYNC);
+
       case PM_REQ_GETFILLED:
 	if(total_bytes <= 0 || ioctl(dpm.fd, SNDCTL_DSP_GETODELAY, &i) == -1)
 	    return -1;
@@ -340,6 +342,28 @@
 	*((int *)arg) = i;
 	return 0;
 #else /* SNDCTL_DSP_GETODELAY */
+      case PM_REQ_PLAY_START:
+	if(total_bytes <= 0 || ioctl(dpm.fd, SNDCTL_DSP_GETOPTR, &cinfo) == -1)
+	    return -1;
+	output_counter = cinfo.bytes;
+	return 0;
+
+      case PM_REQ_DISCARD:
+	if(ioctl(dpm.fd, SNDCTL_DSP_RESET) == -1)
+	    return -1;
+	if(total_bytes <= 0 || ioctl(dpm.fd, SNDCTL_DSP_GETOPTR, &cinfo) == -1)
+	    return -1;
+	output_counter = cinfo.bytes;
+	return 0;
+
+      case PM_REQ_FLUSH:
+	if(ioctl(dpm.fd, SNDCTL_DSP_SYNC) == -1)
+	    return -1;
+	if(total_bytes <= 0 || ioctl(dpm.fd, SNDCTL_DSP_GETOPTR, &cinfo) == -1)
+	    return -1;
+	output_counter = cinfo.bytes;
+	return 0;
+
 # ifdef SNDCTL_DSP_GETOSPACE
       case PM_REQ_GETFILLABLE:
 	if(total_bytes <= 0 || ioctl(dpm.fd, SNDCTL_DSP_GETOSPACE, &info) == -1)
@@ -365,7 +389,7 @@
       case PM_REQ_GETSAMPLES:
 	if(total_bytes <= 0 || ioctl(dpm.fd, SNDCTL_DSP_GETOPTR, &cinfo) == -1)
 	    return -1;
-	i = cinfo.bytes;
+	i = cinfo.bytes - output_counter;
 	if(!(dpm.encoding & PE_MONO)) i >>= 1;
 	if(dpm.encoding & PE_16BIT) i >>= 1;
 	*((int *)arg) = i;
