richarddobson 3 years ago
parent
commit
c69763cb83
1 changed files with 275 additions and 275 deletions
  1. 275 275
      dev/spec/simple.c

+ 275 - 275
dev/spec/simple.c

@@ -41,10 +41,10 @@
 #include <string.h>
 #include <simple.h>
 
-#define VERYBIG  		(10000.0)
-#define SRCFILE			(0)
-#define NOISEFILE		(1)
-#define COMPAREFILE		(2)
+#define VERYBIG         (10000.0)
+#define SRCFILE         (0)
+#define NOISEFILE       (1)
+#define COMPAREFILE     (2)
 
 static int  copy_cut_samps(int startwindow,int *endwindow,int windows_per_buf,int endchunksize,dataptr dz);
 static int  outer_clean_loop(int whichfile,int no_of_marked_channels,dataptr dz);
@@ -62,113 +62,113 @@ static int  read_cut_samps(dataptr dz);
 
 int specgain(dataptr dz)
 {
-	int vc;
-	for( vc = 0; vc < dz->wanted; vc += 2)
-		dz->flbufptr[0][AMPP] = (float)(dz->flbufptr[0][AMPP] * dz->param[GAIN_GAIN]);
-	return(FINISHED);
+    int vc;
+    for( vc = 0; vc < dz->wanted; vc += 2)
+        dz->flbufptr[0][AMPP] = (float)(dz->flbufptr[0][AMPP] * dz->param[GAIN_GAIN]);
+    return(FINISHED);
 }
 
 /*********************** SPECLIMIT ***************************/
 
 int speclimit(dataptr dz)
 {
-	int vc;
-	for( vc = 0; vc < dz->wanted; vc += 2) {
-		if(dz->flbufptr[0][AMPP] < dz->param[LIMIT_THRESH])
-			dz->flbufptr[0][AMPP] = 0.0f;
-	}
-	return(FINISHED);
+    int vc;
+    for( vc = 0; vc < dz->wanted; vc += 2) {
+        if(dz->flbufptr[0][AMPP] < dz->param[LIMIT_THRESH])
+            dz->flbufptr[0][AMPP] = 0.0f;
+    }
+    return(FINISHED);
 }
 
 /**************************** SPECCLEAN ***************************/
 
 int specclean(dataptr dz)
 {
-	int exit_status;
-	int no_of_marked_channels = 0;
-	if((exit_status = outer_clean_loop(NOISEFILE,no_of_marked_channels,dz))<0)
-		return(exit_status);
-	if((exit_status = adjust_noise_level(dz))<0)
-		return(exit_status);
-	switch(dz->mode) {
-	case(FILTERING):
-		if((exit_status = setup_cleaning_filter(dz))<0)
-			return(exit_status);
-		break;
-	case(COMPARING):
-		if((exit_status = outer_clean_loop(COMPAREFILE,no_of_marked_channels,dz))<0)
-			return(exit_status);
-		if((exit_status = reorganise_marks(&no_of_marked_channels,dz))<0)
-			return(exit_status);
-		break;
-	}
-	return outer_clean_loop(SRCFILE,no_of_marked_channels,dz);
+    int exit_status;
+    int no_of_marked_channels = 0;
+    if((exit_status = outer_clean_loop(NOISEFILE,no_of_marked_channels,dz))<0)
+        return(exit_status);
+    if((exit_status = adjust_noise_level(dz))<0)
+        return(exit_status);
+    switch(dz->mode) {
+    case(FILTERING):
+        if((exit_status = setup_cleaning_filter(dz))<0)
+            return(exit_status);
+        break;
+    case(COMPARING):
+        if((exit_status = outer_clean_loop(COMPAREFILE,no_of_marked_channels,dz))<0)
+            return(exit_status);
+        if((exit_status = reorganise_marks(&no_of_marked_channels,dz))<0)
+            return(exit_status);
+        break;
+    }
+    return outer_clean_loop(SRCFILE,no_of_marked_channels,dz);
 }
 
 /**************************** OUTER_CLEAN_LOOP ****************************/
 
 int outer_clean_loop(int whichfile,int no_of_marked_channels,dataptr dz)
 {
-	int exit_status;
-	int samps_read, windows_in_buffer;
+    int exit_status;
+    int samps_read, windows_in_buffer;
     while((samps_read = fgetfbufEx(dz->bigfbuf, dz->big_fsize,dz->ifd[whichfile],0)) > 0) {
-    	dz->flbufptr[0]    = dz->bigfbuf;
-	   	windows_in_buffer = samps_read/dz->wanted;
-		switch(whichfile) {
-		case(NOISEFILE):	
-			if((exit_status = read_noise_data(windows_in_buffer,dz))<0)
-				return(exit_status);
-			break;
-		case(COMPAREFILE):	
-			if((exit_status = read_comparison_data(windows_in_buffer,dz))<0)
-				return(exit_status);
-			break;
-		case(SRCFILE):		
-			if((exit_status = do_cleaning(windows_in_buffer,no_of_marked_channels,dz))<0)
-				return(exit_status);
-			break;
-    	default:
-    		sprintf(errstr,"Unknown option in outer_clean_loop()\n");
-			return(PROGRAM_ERROR);
-		}
-		if(whichfile==SRCFILE && (samps_read > 0)) {
-			if((exit_status = write_exact_samps(dz->bigfbuf,samps_read,dz))<0)
-				return(exit_status);
-		}
-	}  
-	if(samps_read<0) {
-		sprintf(errstr,"Sound read error.\n");
-		return(SYSTEM_ERROR);
-	}
-	if(whichfile!=SRCFILE)
-		dz->time = 0.0f;
-	return(FINISHED);
+        dz->flbufptr[0]    = dz->bigfbuf;
+        windows_in_buffer = samps_read/dz->wanted;
+        switch(whichfile) {
+        case(NOISEFILE):    
+            if((exit_status = read_noise_data(windows_in_buffer,dz))<0)
+                return(exit_status);
+            break;
+        case(COMPAREFILE):  
+            if((exit_status = read_comparison_data(windows_in_buffer,dz))<0)
+                return(exit_status);
+            break;
+        case(SRCFILE):      
+            if((exit_status = do_cleaning(windows_in_buffer,no_of_marked_channels,dz))<0)
+                return(exit_status);
+            break;
+        default:
+            sprintf(errstr,"Unknown option in outer_clean_loop()\n");
+            return(PROGRAM_ERROR);
+        }
+        if(whichfile==SRCFILE && (samps_read > 0)) {
+            if((exit_status = write_exact_samps(dz->bigfbuf,samps_read,dz))<0)
+                return(exit_status);
+        }
+    }  
+    if(samps_read<0) {
+        sprintf(errstr,"Sound read error.\n");
+        return(SYSTEM_ERROR);
+    }
+    if(whichfile!=SRCFILE)
+        dz->time = 0.0f;
+    return(FINISHED);
 }
 
 /************************ ADJUST_NOISE_LEVEL **********************/
 
 int adjust_noise_level(dataptr dz)
 {
-	int cc;
-	for( cc = 0; cc < dz->clength; cc++)
-		dz->amp[cc] = (float)(dz->amp[cc] * dz->param[CL_GAIN]);
-	return(FINISHED);
+    int cc;
+    for( cc = 0; cc < dz->clength; cc++)
+        dz->amp[cc] = (float)(dz->amp[cc] * dz->param[CL_GAIN]);
+    return(FINISHED);
 }
 
 /************************* SETUP_CLEANING_FILTER ***************************/
 
 int setup_cleaning_filter(dataptr dz)
 {
-	int cc, vc;
-	double chtop   = dz->chwidth/2.0;
-	if(chtop < dz->param[CL_FRQ])
-		dz->amp[0] = 0.0f;
-	for( cc = 1, vc = 2; cc < dz->clength; cc++, vc +=2) {
-		chtop += dz->chwidth;
-		if(chtop < dz->param[CL_FRQ])
-			dz->amp[cc] = 0.0f;
-	}
-	return(FINISHED);
+    int cc, vc;
+    double chtop   = dz->chwidth/2.0;
+    if(chtop < dz->param[CL_FRQ])
+        dz->amp[0] = 0.0f;
+    for( cc = 1, vc = 2; cc < dz->clength; cc++, vc +=2) {
+        chtop += dz->chwidth;
+        if(chtop < dz->param[CL_FRQ])
+            dz->amp[cc] = 0.0f;
+    }
+    return(FINISHED);
 }
 
 /************************ REORGANISE_MARKS **********************
@@ -179,154 +179,154 @@ int setup_cleaning_filter(dataptr dz)
 
 int reorganise_marks(int *no_of_marked_channels,dataptr dz)
 {
-	int n;
-	*no_of_marked_channels = 0;
-	for(n=0;n < dz->clength;n++) {
-		if(dz->iparray[CL_MARK][n]) {
-			dz->iparray[CL_MARK][*no_of_marked_channels] = n;
-			(*no_of_marked_channels)++;
-		}
-	}
-	if(*no_of_marked_channels==0) {
-		sprintf(errstr,"Comparison file is already clean, relative to noisefile.\n");
-		return(GOAL_FAILED);
-	}
-	for(n=0;n < *no_of_marked_channels; n++)		/* change marks from cc to vc */
-		dz->iparray[CL_MARK][n] *= 2;
-	return(FINISHED);
+    int n;
+    *no_of_marked_channels = 0;
+    for(n=0;n < dz->clength;n++) {
+        if(dz->iparray[CL_MARK][n]) {
+            dz->iparray[CL_MARK][*no_of_marked_channels] = n;
+            (*no_of_marked_channels)++;
+        }
+    }
+    if(*no_of_marked_channels==0) {
+        sprintf(errstr,"Comparison file is already clean, relative to noisefile.\n");
+        return(GOAL_FAILED);
+    }
+    for(n=0;n < *no_of_marked_channels; n++)        /* change marks from cc to vc */
+        dz->iparray[CL_MARK][n] *= 2;
+    return(FINISHED);
 }
 
 /************************* READ_NOISE_DATA ***************************/
 
 int read_noise_data(int windows_in_buffer,dataptr dz)
 {
-	int wc;
-	int cc, vc;
-	for(wc=0; wc<windows_in_buffer; wc++) {
-		for( cc = 0 ,vc = 0; cc < dz->clength; cc++, vc += 2) {
-			if(dz->flbufptr[0][AMPP] > dz->amp[cc]) 
-				dz->amp[cc] = dz->flbufptr[0][AMPP];
-		}
-		dz->flbufptr[0] += dz->wanted;
-	}
-	return(FINISHED);
+    int wc;
+    int cc, vc;
+    for(wc=0; wc<windows_in_buffer; wc++) {
+        for( cc = 0 ,vc = 0; cc < dz->clength; cc++, vc += 2) {
+            if(dz->flbufptr[0][AMPP] > dz->amp[cc]) 
+                dz->amp[cc] = dz->flbufptr[0][AMPP];
+        }
+        dz->flbufptr[0] += dz->wanted;
+    }
+    return(FINISHED);
 }
 
 /************************* READ_COMPARISON_DATA ***************************/
 
 int read_comparison_data(int windows_in_buffer,dataptr dz)
 {
-	int wc;
-	int cc, vc;
-	for(wc=0; wc<windows_in_buffer; wc++) {
-		for( cc = 0 ,vc = 0; cc < dz->clength; cc++, vc += 2) {
-			if(dz->flbufptr[0][AMPP] > dz->amp[cc])
-				dz->iparray[CL_MARK][cc] = 0;
-		}
-		dz->flbufptr[0] += dz->wanted;
-	}
-	return(FINISHED);
+    int wc;
+    int cc, vc;
+    for(wc=0; wc<windows_in_buffer; wc++) {
+        for( cc = 0 ,vc = 0; cc < dz->clength; cc++, vc += 2) {
+            if(dz->flbufptr[0][AMPP] > dz->amp[cc])
+                dz->iparray[CL_MARK][cc] = 0;
+        }
+        dz->flbufptr[0] += dz->wanted;
+    }
+    return(FINISHED);
 }
-	
+    
 /************************* DO_CLEANING ***************************/
 
 int do_cleaning(int windows_in_buffer,int no_of_marked_channels,dataptr dz)
 {
-	int exit_status;
-	int wc = 0;
-	int n, cc, vc;
-	switch(dz->mode) {
-	case(COMPARING):
-		for(wc=0; wc<windows_in_buffer; wc++) {
-			for(n=0;n<no_of_marked_channels;n++)
-				dz->flbufptr[0][dz->iparray[CL_MARK][n]] = 0.0F;
-			dz->flbufptr[0] += dz->wanted;
-		}
-		break;
-	case(FROMTIME):
-	case(ANYWHERE):
-		wc = 0;
-		if(!dz->finished) {
-			if((exit_status = skip_skipwindows(&wc,windows_in_buffer,dz))<0)
-				return(exit_status);
-			if(exit_status==FINISHED)
-				break;
-		}
-		/* fall thro */
-	case(FILTERING):
-		for(; wc<windows_in_buffer; wc++) {
-			for(cc=0, vc = 0;cc < dz->clength; cc++, vc += 2) {
-				if(dz->flbufptr[0][AMPP] < dz->amp[cc]) {
-					dz->flbufptr[0][AMPP] = 0.0F;
-					if(dz->mode==FROMTIME)
-						dz->amp[cc] = (float)VERYBIG;
-				}
-			}
-			dz->flbufptr[0] += dz->wanted;
-		}
-		break;
-	default:
-		sprintf(errstr,"unknown case in do_cleaning()\n");
-		return(PROGRAM_ERROR);
-	}
-	return(FINISHED);
+    int exit_status;
+    int wc = 0;
+    int n, cc, vc;
+    switch(dz->mode) {
+    case(COMPARING):
+        for(wc=0; wc<windows_in_buffer; wc++) {
+            for(n=0;n<no_of_marked_channels;n++)
+                dz->flbufptr[0][dz->iparray[CL_MARK][n]] = 0.0F;
+            dz->flbufptr[0] += dz->wanted;
+        }
+        break;
+    case(FROMTIME):
+    case(ANYWHERE):
+        wc = 0;
+        if(!dz->finished) {
+            if((exit_status = skip_skipwindows(&wc,windows_in_buffer,dz))<0)
+                return(exit_status);
+            if(exit_status==FINISHED)
+                break;
+        }
+        /* fall thro */
+    case(FILTERING):
+        for(; wc<windows_in_buffer; wc++) {
+            for(cc=0, vc = 0;cc < dz->clength; cc++, vc += 2) {
+                if(dz->flbufptr[0][AMPP] < dz->amp[cc]) {
+                    dz->flbufptr[0][AMPP] = 0.0F;
+                    if(dz->mode==FROMTIME)
+                        dz->amp[cc] = (float)VERYBIG;
+                }
+            }
+            dz->flbufptr[0] += dz->wanted;
+        }
+        break;
+    default:
+        sprintf(errstr,"unknown case in do_cleaning()\n");
+        return(PROGRAM_ERROR);
+    }
+    return(FINISHED);
 }
 
 /************************ SKIP_SKIPWINDOWS **********************/
 
 int skip_skipwindows(int *wc,int windows_in_buffer,dataptr dz)
 {
-	int step;
-	if((step = dz->iparam[CL_SKIPW] - dz->total_windows) >= windows_in_buffer) {
-		dz->total_windows += windows_in_buffer;
-		dz->time += dz->frametime * windows_in_buffer;
-		return(FINISHED);
-	} else {
-		dz->total_windows += step;
-		*wc = step;
-		dz->time += dz->frametime * step;
-		dz->flbufptr[0] += step * dz->wanted;
-		dz->finished = TRUE;		
-	}
-	return(CONTINUE);
+    int step;
+    if((step = dz->iparam[CL_SKIPW] - dz->total_windows) >= windows_in_buffer) {
+        dz->total_windows += windows_in_buffer;
+        dz->time += dz->frametime * windows_in_buffer;
+        return(FINISHED);
+    } else {
+        dz->total_windows += step;
+        *wc = step;
+        dz->time += dz->frametime * step;
+        dz->flbufptr[0] += step * dz->wanted;
+        dz->finished = TRUE;        
+    }
+    return(CONTINUE);
 }
 
 /************************* SPECCUT ***************************/
 
 int speccut(dataptr dz)
 {
-	int exit_status;
-	int samps_remain, bufs_to_skip, endchunksize;
-	int startwindow = (int)(dz->param[CUT_STIME]/dz->frametime);
-	int endwindow   = (int)(dz->param[CUT_ETIME]/dz->frametime);
-	int windows_per_buf = dz->big_fsize/dz->wanted;
-	int w_to_skip = 0;
-	endwindow   = min(endwindow,dz->wlength);
-	if((bufs_to_skip = startwindow/windows_per_buf) > 0) { /* TRUNCATE */
-		w_to_skip = bufs_to_skip * windows_per_buf;
-		if((sndseekEx(dz->ifd[0],w_to_skip * dz->wanted,0))<0) {
-			sprintf(errstr,"Window seek failed: speccut().\n");
-			return(SYSTEM_ERROR);
-		}
-	}
-	startwindow -= w_to_skip;
-	endwindow   -= w_to_skip;
-	if((exit_status = read_cut_samps(dz))<0)
-		return(exit_status);
-	dz->flbufptr[0] = dz->bigfbuf + (startwindow * dz->wanted);
-	endchunksize  = windows_per_buf - startwindow;
-	dz->flbufptr[1] = dz->flbufptr[2];
-	if(endwindow > 0) {
-		do {
-			if((exit_status = copy_cut_samps(startwindow,&endwindow,windows_per_buf,endchunksize,dz))<0)
-				return(exit_status);
-		} while(exit_status==CONTINUE);
-	}
-	if((samps_remain = dz->flbufptr[1] - dz->flbufptr[2]) > 0) {
-		if((exit_status = write_samps(dz->flbufptr[2],samps_remain,dz))<0)
-			return(exit_status);
-	}
-	return(FINISHED);
+    int exit_status;
+    int samps_remain, bufs_to_skip, endchunksize;
+    int startwindow = (int)(dz->param[CUT_STIME]/dz->frametime);
+    int endwindow   = (int)(dz->param[CUT_ETIME]/dz->frametime);
+    int windows_per_buf = dz->big_fsize/dz->wanted;
+    int w_to_skip = 0;
+    endwindow   = min(endwindow,dz->wlength);
+    if((bufs_to_skip = startwindow/windows_per_buf) > 0) { /* TRUNCATE */
+        w_to_skip = bufs_to_skip * windows_per_buf;
+        if((sndseekEx(dz->ifd[0],w_to_skip * dz->wanted,0))<0) {
+            sprintf(errstr,"Window seek failed: speccut().\n");
+            return(SYSTEM_ERROR);
+        }
+    }
+    startwindow -= w_to_skip;
+    endwindow   -= w_to_skip;
+    if((exit_status = read_cut_samps(dz))<0)
+        return(exit_status);
+    dz->flbufptr[0] = dz->bigfbuf + (startwindow * dz->wanted);
+    endchunksize  = windows_per_buf - startwindow;
+    dz->flbufptr[1] = dz->flbufptr[2];
+    if(endwindow > 0) {
+        do {
+            if((exit_status = copy_cut_samps(startwindow,&endwindow,windows_per_buf,endchunksize,dz))<0)
+                return(exit_status);
+        } while(exit_status==CONTINUE);
+    }
+    if((samps_remain = dz->flbufptr[1] - dz->flbufptr[2]) > 0) {
+        if((exit_status = write_samps(dz->flbufptr[2],samps_remain,dz))<0)
+            return(exit_status);
+    }
+    return(FINISHED);
 }
 
 
@@ -334,73 +334,73 @@ int speccut(dataptr dz)
 
 int copy_cut_samps(int startwindow,int *endwindow,int windows_per_buf,int endchunksize,dataptr dz)
 {
-	int exit_status;
-	if(*endwindow >= windows_per_buf) {
-		memmove((char *)dz->flbufptr[1],(char *)dz->flbufptr[0],(size_t)(endchunksize * dz->wanted * sizeof(float)));
-		dz->flbufptr[1] += endchunksize * dz->wanted;
-		dz->flbufptr[0]  = dz->bigfbuf;
-		if((exit_status = read_cut_samps(dz))<0)
-			return(exit_status);
-		*endwindow -= windows_per_buf;
-	} else {
-		memmove((char *)dz->flbufptr[1],(char *)dz->flbufptr[0],(size_t)((*endwindow - startwindow) * dz->wanted * sizeof(float)));
-		dz->flbufptr[1] += (*endwindow - startwindow) * dz->wanted;
-		return(FINISHED);
-	}
-	if(*endwindow >= startwindow) {
-		if(startwindow > 0)
-			memmove((char *)dz->flbufptr[1],(char *)dz->flbufptr[0],(size_t)(startwindow * dz->wanted * sizeof(float)));
-		if((exit_status = write_exact_samps(dz->flbufptr[2],dz->big_fsize,dz))<0)
-			return(exit_status);
-		dz->flbufptr[1]  = dz->flbufptr[2];
-		dz->flbufptr[0] += startwindow * dz->wanted;
-	} else {
-		memmove((char *)dz->flbufptr[1],(char *)dz->flbufptr[0],(size_t)(*endwindow * dz->wanted * sizeof(float)));
-		dz->flbufptr[1] += *endwindow * dz->wanted;
-		return(FINISHED);
-	}
-	return(CONTINUE);
+    int exit_status;
+    if(*endwindow >= windows_per_buf) {
+        memmove((char *)dz->flbufptr[1],(char *)dz->flbufptr[0],(size_t)(endchunksize * dz->wanted * sizeof(float)));
+        dz->flbufptr[1] += endchunksize * dz->wanted;
+        dz->flbufptr[0]  = dz->bigfbuf;
+        if((exit_status = read_cut_samps(dz))<0)
+            return(exit_status);
+        *endwindow -= windows_per_buf;
+    } else {
+        memmove((char *)dz->flbufptr[1],(char *)dz->flbufptr[0],(size_t)((*endwindow - startwindow) * dz->wanted * sizeof(float)));
+        dz->flbufptr[1] += (*endwindow - startwindow) * dz->wanted;
+        return(FINISHED);
+    }
+    if(*endwindow >= startwindow) {
+        if(startwindow > 0)
+            memmove((char *)dz->flbufptr[1],(char *)dz->flbufptr[0],(size_t)(startwindow * dz->wanted * sizeof(float)));
+        if((exit_status = write_exact_samps(dz->flbufptr[2],dz->big_fsize,dz))<0)
+            return(exit_status);
+        dz->flbufptr[1]  = dz->flbufptr[2];
+        dz->flbufptr[0] += startwindow * dz->wanted;
+    } else {
+        memmove((char *)dz->flbufptr[1],(char *)dz->flbufptr[0],(size_t)(*endwindow * dz->wanted * sizeof(float)));
+        dz->flbufptr[1] += *endwindow * dz->wanted;
+        return(FINISHED);
+    }
+    return(CONTINUE);
 }
 
 /****************************** SPECGRAB_OR_MAGNIFY ***************************/
 
 int specgrab_or_magnify(int frztime_paramno,dataptr dz)
 {
-	int exit_status;
-	int frzwindow, bufs_to_seek, samps_read;
-	int big_wsize = dz->big_fsize/dz->wanted;
-	frzwindow = (int)(dz->param[frztime_paramno]/dz->frametime); 		/* truncate */
-	frzwindow = min(frzwindow,dz->wlength-1); /* if time > filelen, get last window */
-	bufs_to_seek = (frzwindow * dz->wanted)/dz->big_fsize;				/* truncate */
-	if(sndseekEx(dz->ifd[0],bufs_to_seek * dz->big_fsize,0)<0) {
-		sprintf(errstr,"seek failed in specgrab_or_magnify().\n");
-		return(SYSTEM_ERROR);
-	}
-	if((samps_read = fgetfbufEx(dz->bigfbuf,dz->big_fsize,dz->ifd[0],0)) < dz->wanted) {
-		if(samps_read<0) {
-			sprintf(errstr,"Sound read error.\n");
-			return(SYSTEM_ERROR);
-		} else {
-			sprintf(errstr,"Problem reading infile data in specgrab_or_magnify().\n");
-			return(PROGRAM_ERROR);
-		}
-	}
-	frzwindow -= bufs_to_seek * big_wsize;
-	dz->flbufptr[0] = dz->bigfbuf + (frzwindow * dz->wanted);
-	switch(dz->process) {
-	case(GRAB):
-		if((exit_status = write_samps(dz->flbufptr[0],dz->wanted,dz))<0)
-			return(exit_status);
-		break;
-	case(MAGNIFY):
-    	dz->total_windows = round(dz->param[MAG_DUR]/dz->frametime);
-		return generate_magnified_outfile(dz);
-		break;
-	default:
-		sprintf(errstr,"unknown application in specgrab_or_magnify()\n");
-		return(PROGRAM_ERROR);
-	}
-	return(FINISHED);
+    int exit_status;
+    int frzwindow, bufs_to_seek, samps_read;
+    int big_wsize = dz->big_fsize/dz->wanted;
+    frzwindow = (int)(dz->param[frztime_paramno]/dz->frametime);        /* truncate */
+    frzwindow = min(frzwindow,dz->wlength-1); /* if time > filelen, get last window */
+    bufs_to_seek = (frzwindow * dz->wanted)/dz->big_fsize;              /* truncate */
+    if(sndseekEx(dz->ifd[0],bufs_to_seek * dz->big_fsize,0)<0) {
+        sprintf(errstr,"seek failed in specgrab_or_magnify().\n");
+        return(SYSTEM_ERROR);
+    }
+    if((samps_read = fgetfbufEx(dz->bigfbuf,dz->big_fsize,dz->ifd[0],0)) < dz->wanted) {
+        if(samps_read<0) {
+            sprintf(errstr,"Sound read error.\n");
+            return(SYSTEM_ERROR);
+        } else {
+            sprintf(errstr,"Problem reading infile data in specgrab_or_magnify().\n");
+            return(PROGRAM_ERROR);
+        }
+    }
+    frzwindow -= bufs_to_seek * big_wsize;
+    dz->flbufptr[0] = dz->bigfbuf + (frzwindow * dz->wanted);
+    switch(dz->process) {
+    case(GRAB):
+        if((exit_status = write_samps(dz->flbufptr[0],dz->wanted,dz))<0)
+            return(exit_status);
+        break;
+    case(MAGNIFY):
+        dz->total_windows = round(dz->param[MAG_DUR]/dz->frametime);
+        return generate_magnified_outfile(dz);
+        break;
+    default:
+        sprintf(errstr,"unknown application in specgrab_or_magnify()\n");
+        return(PROGRAM_ERROR);
+    }
+    return(FINISHED);
 }
 
 /******************************** GENERATE_MAGNIFIED_OUTFILE **********************************/
@@ -414,30 +414,30 @@ int generate_magnified_outfile(dataptr dz)
     int w_to_buf = dz->big_fsize/dz->wanted;
     float *bigbufend = dz->bigfbuf + dz->big_fsize;
 
-	memmove((char *)dz->windowbuf[0],(char *)dz->flbufptr[0],(size_t)(dz->wanted * sizeof(float)));
+    memmove((char *)dz->windowbuf[0],(char *)dz->flbufptr[0],(size_t)(dz->wanted * sizeof(float)));
     dz->flbufptr[0]  = dz->bigfbuf;
     for(wc=0; wc<dz->total_windows; wc++) {
-		memmove((char *)dz->flbufptr[0],(char *)dz->windowbuf[0],(size_t)(dz->wanted * sizeof(float)));
+        memmove((char *)dz->flbufptr[0],(char *)dz->windowbuf[0],(size_t)(dz->wanted * sizeof(float)));
         if((dz->flbufptr[0] += dz->wanted) >= bigbufend) {
             if(!written_whole_buffer) {
                 for( cc = 0 ,vc = 0; cc < dz->clength; cc++, vc += 2)
                     dz->bigfbuf[vc] = 0.0F;                                 /* ZERO AMPS IN WINDOW ONE */
             }
-			if((exit_status = write_exact_samps(dz->bigfbuf,dz->big_fsize,dz))<0)
+            if((exit_status = write_exact_samps(dz->bigfbuf,dz->big_fsize,dz))<0)
                 return(exit_status);
             if(!written_whole_buffer)                                       /* RESTORE DATA IN WINDOW ONE */
-				memmove((char *)dz->bigfbuf,(char *)dz->windowbuf[0],(size_t)(dz->wanted * sizeof(float)));
+                memmove((char *)dz->bigfbuf,(char *)dz->windowbuf[0],(size_t)(dz->wanted * sizeof(float)));
             written_whole_buffer = 1;
             dz->flbufptr[0] = dz->bigfbuf;
-		}
+        }
     }
     if(!written_whole_buffer) {
-		for( cc = 0 ,vc = 0; cc < dz->clength; cc++, vc += 2)
+        for( cc = 0 ,vc = 0; cc < dz->clength; cc++, vc += 2)
             dz->bigfbuf[vc] = 0.0F;                         /* ZERO AMPS IN WINDOW ONE */
-		if(dz->flbufptr[0] -  dz->bigfbuf > 0) {
-			if((exit_status = write_samps(dz->bigfbuf,dz->flbufptr[0] -  dz->bigfbuf,dz))<0)
-				return(exit_status);
-		}
+        if(dz->flbufptr[0] -  dz->bigfbuf > 0) {
+            if((exit_status = write_samps(dz->bigfbuf,dz->flbufptr[0] -  dz->bigfbuf,dz))<0)
+                return(exit_status);
+        }
     } else {
         if((windows_left  = dz->total_windows % w_to_buf)> 0) {
             if((exit_status = write_samps(dz->bigfbuf,windows_left * dz->wanted,dz))<0)
@@ -451,9 +451,9 @@ int generate_magnified_outfile(dataptr dz)
 
 int read_cut_samps(dataptr dz)
 {
-	if(fgetfbufEx(dz->bigfbuf,dz->big_fsize,dz->ifd[0],0) < 0) {
-		sprintf(errstr,"Window read failed: read_cut_samps().\n");
-		return(SYSTEM_ERROR);
-	}
-	return(FINISHED);
+    if(fgetfbufEx(dz->bigfbuf,dz->big_fsize,dz->ifd[0],0) < 0) {
+        sprintf(errstr,"Window read failed: read_cut_samps().\n");
+        return(SYSTEM_ERROR);
+    }
+    return(FINISHED);
 }