mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-25 22:18:07 +00:00 
			
		
		
		
	https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r45079 | file | 2006-10-13 14:42:49 -0400 (Fri, 13 Oct 2006) | 2 lines And file said... let the compiler warnings STOP! ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@45080 65c4cc65-6c06-0410-ace0-fbb531ad65f3
		
			
				
	
	
		
			276 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			276 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
| 
 | |
| $Log$
 | |
| Revision 1.15  2004/06/26 03:50:14  markster
 | |
| Merge source cleanups (bug #1911)
 | |
| 
 | |
| Revision 1.14  2003/02/12 13:59:15  matteo
 | |
| mer feb 12 14:56:57 CET 2003
 | |
| 
 | |
| Revision 1.1.1.1  2003/02/12 13:59:15  matteo
 | |
| mer feb 12 14:56:57 CET 2003
 | |
| 
 | |
| Revision 1.3  2001/04/12 21:27:53  markh
 | |
| app_record now supports wildcards of sort so your output file is not overwritten every time it's run.  File.h got a documentation update on the ast_fileexists to include the return call.  Watch out for the placea.c placev.c code, it's updates have not been tested yet.  Just a few parenthesis to make it compile nicer on newer gcc versions with all the -W flags set.
 | |
| 
 | |
| Revision 1.2  2000/01/05 08:20:39  markster
 | |
| Some OSS fixes and a few lpc changes to make it actually work
 | |
| 
 | |
|  * Revision 1.1  1996/08/19  22:31:02  jaf
 | |
|  * Initial revision
 | |
|  *
 | |
| 
 | |
| */
 | |
| 
 | |
| /*  -- translated by f2c (version 19951025).
 | |
|    You must link the resulting object file with the libraries:
 | |
| 	-lf2c -lm   (in that order)
 | |
| */
 | |
| 
 | |
| #include "f2c.h"
 | |
| 
 | |
| #ifdef P_R_O_T_O_T_Y_P_E_S
 | |
| extern int placev_(integer *osbuf, integer *osptr, integer *oslen, integer *obound, integer *vwin, integer *af, integer *lframe, integer *minwin, integer *maxwin, integer *dvwinl, integer *dvwinh);
 | |
| #endif
 | |
| 
 | |
| /* ****************************************************************** */
 | |
| 
 | |
| /* 	PLACEV Version 48 */
 | |
| 
 | |
| /* $Log$
 | |
|  * Revision 1.15  2004/06/26 03:50:14  markster
 | |
|  * Merge source cleanups (bug #1911)
 | |
|  *
 | |
|  * Revision 1.14  2003/02/12 13:59:15  matteo
 | |
|  * mer feb 12 14:56:57 CET 2003
 | |
|  *
 | |
|  * Revision 1.1.1.1  2003/02/12 13:59:15  matteo
 | |
|  * mer feb 12 14:56:57 CET 2003
 | |
|  *
 | |
|  * Revision 1.3  2001/04/12 21:27:53  markh
 | |
|  * app_record now supports wildcards of sort so your output file is not overwritten every time it's run.  File.h got a documentation update on the ast_fileexists to include the return call.  Watch out for the placea.c placev.c code, it's updates have not been tested yet.  Just a few parenthesis to make it compile nicer on newer gcc versions with all the -W flags set.
 | |
|  *
 | |
|  * Revision 1.2  2000/01/05 08:20:39  markster
 | |
|  * Some OSS fixes and a few lpc changes to make it actually work
 | |
|  *
 | |
|  * Revision 1.1  1996/08/19  22:31:02  jaf
 | |
|  * Initial revision
 | |
|  * */
 | |
| /* Revision 1.6  1996/03/19  20:42:19  jaf */
 | |
| /* Added some conditions satisfied by the output values in VWIN. */
 | |
| 
 | |
| /* Revision 1.5  1996/03/19  18:37:56  jaf */
 | |
| /* Strengthened the specification of which indices of VWIN are read and */
 | |
| /* written. */
 | |
| 
 | |
| /* Revision 1.4  1996/03/15  16:38:33  jaf */
 | |
| /* One tiny comment added. */
 | |
| 
 | |
| /* Revision 1.3  1996/03/15  16:36:13  jaf */
 | |
| /* Added comments giving In/Out status of arguments. */
 | |
| 
 | |
| /* Revision 1.2  1996/03/12  23:56:01  jaf */
 | |
| /* Comments added explaining that none of the local variables of this */
 | |
| /* subroutine need to be saved from one invocation to the next. */
 | |
| 
 | |
| /* Revision 1.1  1996/02/07 14:48:39  jaf */
 | |
| /* Initial revision */
 | |
| 
 | |
| 
 | |
| /* ****************************************************************** */
 | |
| 
 | |
| /* Input: */
 | |
| /*  OSBUF	Buffer which holds sorted indexes of onsets */
 | |
| /*       	I believe that only indices 1 through OSPTR-1 can be read. */
 | |
| /*  OSLEN */
 | |
| /*  OSPTR	Free pointer into OSBUF */
 | |
| /*  AF */
 | |
| /*  LFRAME */
 | |
| /*  MINWIN */
 | |
| /*  MAXWIN */
 | |
| /*  DVWINL */
 | |
| /*  DVWINH	(This argument is never used.  Should it be?) */
 | |
| /* Input/Output: */
 | |
| /*  VWIN		Buffer of Voicing Window Positions (Modified) */
 | |
| /*       	Index (2,AF-1) is read. */
 | |
| /*       	Indices (1,AF) and (2,AF) are written, */
 | |
| /*       	and then possibly read. */
 | |
| /*       	All other indices are unused. */
 | |
| /*              In all cases, the final values will satsify the condition:*/
 | |
| /*               VWIN(2,AF)-VWIN(1,AF)+1 .LE. MAXWIN */
 | |
| /*               I'm not certain yet, but they may also satisfy: */
 | |
| /*               MINWIN .LE. VWIN(2,AF)-VWIN(1,AF)+1 */
 | |
| /* Output: */
 | |
| /*  OBOUND	This variable is set by this procedure and used */
 | |
| /* 		in placing analysis windows (PLACEA).  Bit 1 */
 | |
| /* 		indicates whether an onset bounds the left side */
 | |
| /* 		of the voicing window, and bit 2 indicates whether */
 | |
| /* 		an onset bounds the right side of the voicing window. */
 | |
| 
 | |
| /* This subroutine has no local state. */
 | |
| 
 | |
| /* Subroutine */ int placev_(integer *osbuf, integer *osptr, integer *oslen, 
 | |
| 	integer *obound, integer *vwin, integer *af, integer *lframe, integer 
 | |
| 	*minwin, integer *maxwin, integer *dvwinl, integer *dvwinh)
 | |
| {
 | |
|     /* System generated locals */
 | |
|     integer i__1, i__2;
 | |
| 
 | |
|     /* Local variables */
 | |
|     logical crit;
 | |
|     integer i__, q, osptr1, hrange, lrange;
 | |
| 
 | |
| /*       Arguments */
 | |
| /*       Local variables that need not be saved */
 | |
| /*   Variables */
 | |
| /*    LRANGE, HRANGE  Range in which window is placed */
 | |
| /*    OSPTR1     OSPTR excluding samples in 3F */
 | |
| /*       Local state */
 | |
| /*       None */
 | |
| /*   Voicing Window Placement */
 | |
| 
 | |
| /*         __________________ __________________ ______________ */
 | |
| /*        |                  |                  | */
 | |
| /*        |        1F        |        2F        |        3F ... */
 | |
| /*        |__________________|__________________|______________ */
 | |
| 
 | |
| /*    Previous | */
 | |
| /*      Window | */
 | |
| /*  ...________| */
 | |
| 
 | |
| /*             |                                | */
 | |
| /*      ------>| This window's placement range  |<------ */
 | |
| /*             |                                | */
 | |
| 
 | |
| /*   There are three cases.  Note that these are different from those */
 | |
| /*   given in the LPC-10e phase 1 report. */
 | |
| 
 | |
| /*   1.  If there are no onsets in this range, then the voicing window */
 | |
| /*   is centered in the pitch window.  If such a placement is not within 
 | |
| */
 | |
| /*   the window's placement range, then the window is placed in the left- 
 | |
| */
 | |
| /*   most portion of the placement range.  Its length is always MAXWIN. */
 | |
| 
 | |
| /*   2.  If the first onset is in 2F and there is sufficient room to place
 | |
|  */
 | |
| /*   the window immediately before this onset, then the window is placed 
 | |
| */
 | |
| /*   there, and its length is set to the maximum possible under these */
 | |
| /*   constraints. */
 | |
| 
 | |
| /* 	"Critical Region Exception":  If there is another onset in 2F */
 | |
| /* 	such that a window can be placed between the two onsets, the */
 | |
| /* 	window is placed there (ie, as in case 3). */
 | |
| 
 | |
| /*   3.  Otherwise, the window is placed immediately after the onset.  The
 | |
|  */
 | |
| /*   window's length */
 | |
| /*  is the longest length that can fit in the range under these constraint
 | |
| s,*/
 | |
| /*  except that the window may be shortened even further to avoid overlapp
 | |
| ing*/
 | |
| /*  other onsets in the placement range.  In any case, the window's length
 | |
| */
 | |
| /*   is at least MINWIN. */
 | |
| 
 | |
| /*   Note that the values of MINWIN and LFRAME must be chosen such */
 | |
| /*   that case 2 = false implies case 3 = true.   This means that */
 | |
| /*   MINWIN <= LFRAME/2.  If this were not the case, then a fourth case */
 | |
| /*   would have to be added for when the window cannot fit either before 
 | |
| */
 | |
| /*   or after the onset. */
 | |
| 
 | |
| /*   Note also that onsets which weren't in 2F last time may be in 1F this
 | |
|  */
 | |
| /*  time, due to the filter delays in computing onsets.  The result is tha
 | |
| t*/
 | |
| /*   occasionally a voicing window will overlap that onset.  The only way 
 | |
| */
 | |
| /*   to circumvent this problem is to add more delay in processing input 
 | |
| */
 | |
| /*   speech.  In the trade-off between delay and window-placement, window 
 | |
| */
 | |
| /*   placement lost. */
 | |
| /* Compute the placement range */
 | |
|     /* Parameter adjustments */
 | |
|     --osbuf;
 | |
|     vwin -= 3;
 | |
| 
 | |
|     /* Function Body */
 | |
| /* Computing MAX */
 | |
|     i__1 = vwin[((*af - 1) << 1) + 2] + 1, i__2 = (*af - 2) * *lframe + 1;
 | |
|     lrange = max(i__1,i__2);
 | |
|     hrange = *af * *lframe;
 | |
| /* Compute OSPTR1, so the following code only looks at relevant onsets. */
 | |
|     for (osptr1 = *osptr - 1; osptr1 >= 1; --osptr1) {
 | |
| 	if (osbuf[osptr1] <= hrange) {
 | |
| 	    goto L90;
 | |
| 	}
 | |
|     }
 | |
| L90:
 | |
|     ++osptr1;
 | |
| /* Check for case 1 first (fast case): */
 | |
|     if (osptr1 <= 1 || osbuf[osptr1 - 1] < lrange) {
 | |
| /* Computing MAX */
 | |
| 	i__1 = vwin[((*af - 1) << 1) + 2] + 1;
 | |
| 	vwin[(*af << 1) + 1] = max(i__1,*dvwinl);
 | |
| 	vwin[(*af << 1) + 2] = vwin[(*af << 1) + 1] + *maxwin - 1;
 | |
| 	*obound = 0;
 | |
|     } else {
 | |
| /* Search backward in OSBUF for first onset in range. */
 | |
| /* This code relies on the above check being performed first. */
 | |
| 	for (q = osptr1 - 1; q >= 1; --q) {
 | |
| 	    if (osbuf[q] < lrange) {
 | |
| 		goto L100;
 | |
| 	    }
 | |
| 	}
 | |
| L100:
 | |
| 	++q;
 | |
| /* Check for case 2 (placement before onset): */
 | |
| /* Check for critical region exception: */
 | |
| 	i__1 = osptr1 - 1;
 | |
| 	for (i__ = q + 1; i__ <= i__1; ++i__) {
 | |
| 	    if (osbuf[i__] - osbuf[q] >= *minwin) {
 | |
| 		crit = TRUE_;
 | |
| 		goto L105;
 | |
| 	    }
 | |
| 	}
 | |
| 	crit = FALSE_;
 | |
| L105:
 | |
| /* Computing MAX */
 | |
| 	i__1 = (*af - 1) * *lframe, i__2 = lrange + *minwin - 1;
 | |
| 	if (! crit && osbuf[q] > max(i__1,i__2)) {
 | |
| 	    vwin[(*af << 1) + 2] = osbuf[q] - 1;
 | |
| /* Computing MAX */
 | |
| 	    i__1 = lrange, i__2 = vwin[(*af << 1) + 2] - *maxwin + 1;
 | |
| 	    vwin[(*af << 1) + 1] = max(i__1,i__2);
 | |
| 	    *obound = 2;
 | |
| /* Case 3 (placement after onset) */
 | |
| 	} else {
 | |
| 	    vwin[(*af << 1) + 1] = osbuf[q];
 | |
| L110:
 | |
| 	    ++q;
 | |
| 	    if (q >= osptr1) {
 | |
| 		goto L120;
 | |
| 	    }
 | |
| 	    if (osbuf[q] > vwin[(*af << 1) + 1] + *maxwin) {
 | |
| 		goto L120;
 | |
| 	    }
 | |
| 	    if (osbuf[q] < vwin[(*af << 1) + 1] + *minwin) {
 | |
| 		goto L110;
 | |
| 	    }
 | |
| 	    vwin[(*af << 1) + 2] = osbuf[q] - 1;
 | |
| 	    *obound = 3;
 | |
| 	    return 0;
 | |
| L120:
 | |
| /* Computing MIN */
 | |
| 	    i__1 = vwin[(*af << 1) + 1] + *maxwin - 1;
 | |
| 	    vwin[(*af << 1) + 2] = min(i__1,hrange);
 | |
| 	    *obound = 1;
 | |
| 	}
 | |
|     }
 | |
|     return 0;
 | |
| } /* placev_ */
 | |
| 
 |