WARNS?=	6
Z_STOPBAND	?=	100

#############
#
# -96 db stop
#
Z_PRESET_96_1	=	96:8
Z_PRESET_96_2	=	96:18
Z_PRESET_96_3	=	96:28:0.7687
Z_PRESET_96_4	=	96:38:0.8326
Z_PRESET_96_5	=	96:48:0.8692	#96:48:0.8691
Z_PRESET_96_6	=	96:58:0.8924
Z_PRESET_96_7	=	96:68:0.9088
Z_PRESET_96_8	=	96:78:0.9217
Z_PRESET_96_9	=	96:88:0.9305	#96:88:0.9304
Z_PRESET_96_10	=	96:98:0.9374
Z_PRESET_96_11	=	96:108:0.9433
Z_PRESET_96_12	=	96:118:0.9480	#96:118:0.9481
Z_PRESET_96_13	=	96:128:0.9521
Z_PRESET_96_14	=	96:138:0.9557
Z_PRESET_96_15	=	96:148:0.9587
Z_PRESET_96_16	=	96:158:0.9618
Z_PRESET_96_17	=	96:168:0.9639
Z_PRESET_96_18	=	96:178:0.9658
Z_PRESET_96_19	=	96:188:0.9676
Z_PRESET_96_20	=	96:198:0.9692
Z_PRESET_96_21	=	96:208:0.9706

Z_PRESETS_96_LOW	=	$(Z_PRESET_96_1) $(Z_PRESET_96_2)
Z_PRESETS_96_MEDIUM	=	$(Z_PRESET_96_3) $(Z_PRESET_96_4)	\
				$(Z_PRESET_96_5)
Z_PRESETS_96_HIGH	=	$(Z_PRESET_96_7) $(Z_PRESET_96_9)	\
				$(Z_PRESET_96_13) $(Z_PRESET_96_17)

#
# pow2 coeff table, -96 db stop
#
Z_PRESET_96_P2_1	=	96:8
Z_PRESET_96_P2_2	=	96:16
Z_PRESET_96_P2_3	=	96:32:0.8010
Z_PRESET_96_P2_4	=	96:64:0.9034	#96:64:0.9033
Z_PRESET_96_P2_5	=	$(Z_PRESET_96_13)

Z_PRESETS_96_P2		=	$(Z_PRESET_96_P2_1)			\
				$(Z_PRESET_96_P2_2)			\
				$(Z_PRESET_96_P2_3)			\
				$(Z_PRESET_96_P2_4)			\
				$(Z_PRESET_96_P2_5)

##############
#
# -100 db stop
#
Z_PRESET_100_1	=	100:8
Z_PRESET_100_2	=	100:18
Z_PRESET_100_3	=	100:28:0.7599	#100:28:0.7598
Z_PRESET_100_4	=	100:38:0.8260	#100:38:0.8259
Z_PRESET_100_5	=	100:48:0.8635
Z_PRESET_100_6	=	100:58:0.8877
Z_PRESET_100_7	=	100:68:0.9047
Z_PRESET_100_8	=	100:78:0.9180
Z_PRESET_100_9	=	100:88:0.9271
Z_PRESET_100_10	=	100:98:0.9346	#100:98:0.9345
Z_PRESET_100_11	=	100:108:0.9406
Z_PRESET_100_12	=	100:118:0.9456	#100:118:0.9455
Z_PRESET_100_13	=	100:128:0.9499
Z_PRESET_100_14	=	100:138:0.9536
Z_PRESET_100_15	=	100:148:0.9566
Z_PRESET_100_16	=	100:158:0.9598	#100:158:0.9599
Z_PRESET_100_17	=	100:168:0.9621
Z_PRESET_100_18	=	100:178:0.9640	#100:178:0.9641
Z_PRESET_100_19	=	100:188:0.9661
Z_PRESET_100_20	=	100:198:0.9675	#100:198:0.9676
Z_PRESET_100_21	=	100:208:0.9691

Z_PRESETS_100_LOW	=	$(Z_PRESET_100_1) $(Z_PRESET_100_2)
Z_PRESETS_100_MEDIUM	=	$(Z_PRESET_100_3) $(Z_PRESET_100_4)	\
				$(Z_PRESET_100_5)
Z_PRESETS_100_HIGH	=	$(Z_PRESET_100_7) $(Z_PRESET_100_9)	\
				$(Z_PRESET_100_13) $(Z_PRESET_100_17)

#
# pow2 coeff table, -100 db stop
#
Z_PRESET_100_P2_1	=	100:8
Z_PRESET_100_P2_2	=	100:16
Z_PRESET_100_P2_3	=	100:32:0.7929	#100:32:0.7927
Z_PRESET_100_P2_4	=	100:64:0.8990
Z_PRESET_100_P2_5	=	$(Z_PRESET_100_13)

Z_PRESETS_100_P2	=	$(Z_PRESET_100_P2_1)			\
				$(Z_PRESET_100_P2_2)			\
				$(Z_PRESET_100_P2_3)			\
				$(Z_PRESET_100_P2_4)			\
				$(Z_PRESET_100_P2_5)

Z_PRESETS_SPEEX_UP	=	kaiser:6:8:0.86				\
				kaiser:6:16:0.88			\
				kaiser:6:32:0.91			\
				kaiser:8:48:0.917			\
				kaiser:8:64:0.94			\
				kaiser:10:80:0.94			\
				kaiser:10:96:0.945			\
				kaiser:10:128:0.95			\
				kaiser:10:160:0.96			\
				kaiser:12:192:0.968			\
				kaiser:12:256:0.975

Z_PRESETS_SPEEX_DOWN	=	kaiser:6:8:0.83				\
				kaiser:6:16:0.85			\
				kaiser:6:32:0.882			\
				kaiser:8:48:0.895			\
				kaiser:8:64:0.921			\
				kaiser:10:80:0.922			\
				kaiser:10:96:0.940			\
				kaiser:10:128:0.95			\
				kaiser:10:160:0.96			\
				kaiser:12:192:0.968			\
				kaiser:12:256:0.975

# 4 4 8 16 16 32 32
Z_PRESETS_GRC3=
.if defined(Z_EMUL_GRC3_EXACT)
Z_EMUL_GRC3=	true
Z_PRESETS_GRC3 +=	OVERSAMPLING_FACTOR:10
#Z_PRESETS_GRC3 +=	INTERPOLATOR:LINEAR
.endif
Z_PRESETS_GRC3 +=	66:4:1.0 66:8:1.0 66:16:1.0 66:32:1.0

.if defined(Z_EMUL_SPEEX_DOWN)
Z_PRESETS_SPEEX		= $(Z_PRESETS_SPEEX_DOWN)
.else
Z_PRESETS_SPEEX		= $(Z_PRESETS_SPEEX_UP)
.endif
Z_PRESETS_SPEEX_16	=	$(Z_PRESETS_SPEEX)
#Z_PRESETS_SPEEX_16	=	60:8:0.86				\
#				60:16:0.88				\
#				60:32:0.91				\
#				80:48:0.917				\
#				80:64:0.94				\
#				96:80:0.94				\
#				96:96:0.945				\
#				96:128:0.95				\
#				96:160:0.96				\
#				96:192:0.986				\
#				96:256:0.975

Z_PRESETS_RABBIT	=	100.3:36 122:88 160:284
Z_PRESETS_RABBIT_16	=	96:36 116.769690927218:88 153.140578265204:284 #96:39 96:92 96:286

Z_PRESETS_SOX		=	100:36 100:132 125:164 175:236 175:1164
Z_PRESETS_SOX_16	=	$(Z_PRESETS_SOX)#96:45:0.80 96:75:0.875 96:149:0.94

Z_PRESETS_SOX_STEEP	=	OVERSAMPLING_FACTOR:8 $(Z_PRESETS_SOX)


.if defined(Z_EMUL_SPEEX) || defined(Z_EMUL_SPEEX_DOWN) || defined(Z_EMUL_SPEEX_UP)
.if defined(Z_16)
Z_PRESETS=	$(Z_PRESETS_SPEEX_16)
.else
Z_PRESETS=	$(Z_PRESETS_SPEEX)
.endif
.elif defined(Z_EMUL_RABBIT)
.if defined(Z_16)
Z_PRESETS=	$(Z_PRESETS_RABBIT_16)
.else
Z_PRESETS=	$(Z_PRESETS_RABBIT)
.endif
.elif defined(Z_EMUL_SOX)
.if defined(Z_16)
Z_PRESETS=	$(Z_PRESETS_SOX_16)
.else
Z_PRESETS=	$(Z_PRESETS_SOX)
.endif
.elif defined(Z_EMUL_SOX_STEEP)
Z_PRESETS=	$(Z_PRESETS_SOX_STEEP)
.elif defined(Z_EMUL_GRC3)
Z_PRESETS=	$(Z_PRESETS_GRC3)
.endif

#.if !defined(Z_PRESETS)
#.if defined(Z_NYQUIST_HOVER)
#Z_PRESETS	+=	NYQUIST_HOVER:$(Z_NYQUIST_HOVER)
#.endif
#.if defined(Z_PRESETS_AUTO)
#.for l in 8 16 32 64 128
#Z_PRESETS	+= $(Z_STOPBAND):$(l)
#.endfor
#.else
#.if defined(Z_PRESETS_96) || (defined(Z_STOPBAND) && $(Z_STOPBAND) == 96)
#Z_PRESETS	+=	$(Z_PRESETS_96_P2)
#.else
#Z_PRESETS	+=	$(Z_PRESETS_100_P2)
#.endif
#.endif
#.endif

.if defined(Z_SPEEX) || defined(Z_SPEEX_FIXED)
PROG=	speex-zresampler
.elif defined(Z_GRC3)
PROG=	grc3-zresampler
.elif defined(Z_GRC3_OPENSOLARIS)
PROG=	grc3-opensolaris-zresampler
.else
PROG=	zresampler
.endif
AWK?=	/usr/bin/awk
#RUBY?=	/usr/local/bin/ruby

CFLAGS+=	-DSND_MULTICHANNEL

.if defined(Z_COEFF_INTERP_QUADRATIC)
CFLAGS+=	-DZ_COEFF_INTERP_QUADRATIC
.elif defined(Z_COEFF_INTERP_HERMITE)
CFLAGS+=	-DZ_COEFF_INTERP_HERMITE
.elif defined(Z_COEFF_INTERP_BSPLINE_3)
CFLAGS+=	-DZ_COEFF_INTERP_BSPLINE_3
.elif defined(Z_COEFF_INTERP_BSPLINE_5)
CFLAGS+=	-DZ_COEFF_INTERP_BSPLINE_5
.elif defined(Z_COEFF_INTERP_BSPLINE)
CFLAGS+=	-DZ_COEFF_INTERP_BSPLINE
.elif defined(Z_COEFF_INTERP_OPT32X)
CFLAGS+=	-DZ_COEFF_INTERP_OPT32X
.elif defined(Z_COEFF_INTERP_OPT16X)
CFLAGS+=	-DZ_COEFF_INTERP_OPT16X
.elif defined(Z_COEFF_INTERP_OPT8X)
CFLAGS+=	-DZ_COEFF_INTERP_OPT8X
.elif defined(Z_COEFF_INTERP_OPT4X)
CFLAGS+=	-DZ_COEFF_INTERP_OPT4X
.elif defined(Z_COEFF_INTERP_OPT2X)
CFLAGS+=	-DZ_COEFF_INTERP_OPT2X
.elif defined(Z_COEFF_INTERP_LINEAR)
CFLAGS+=	-DZ_COEFF_INTERP_LINEAR
.elif defined(Z_COEFF_INTERP_ZOH)
CFLAGS+=	-DZ_COEFF_INTERP_ZOH
.endif

.if $(MACHINE_ARCH) == "i386"
CFLAGS+=	-ansi -Werror -finline-limit=8000 -fno-common
.if !defined(WITH_GCC3)
CFLAGS+=	-mno-align-long-strings
.endif
CFLAGS+=	-mpreferred-stack-boundary=2
CFLAGS+=	-mno-mmx -mno-3dnow -mno-sse -mno-sse2 -ffreestanding -Wall
CFLAGS+=	-Wredundant-decls -Wnested-externs -Wstrict-prototypes
CFLAGS+=	-Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual
.if !defined(WITH_GCC3)
CFLAGS+=	-fformat-extensions
.endif
CFLAGS+=	-std=c99
.elif $(MACHINE_ARCH) == "amd64"
CFLAGS+=	-ansi -Werror -finline-limit=8000 -fno-common
CFLAGS+=	-fno-omit-frame-pointer -mcmodel=kernel -mno-red-zone
CFLAGS+=	-mfpmath=387 -mno-sse -mno-sse2 -mno-mmx -mno-3dnow
CFLAGS+=	-fno-asynchronous-unwind-tables	-ffreestanding -Wall
CFLAGS+=	-Wredundant-decls -Wnested-externs -Wstrict-prototypes
CFLAGS+=	-Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual
.if !defined(WITH_GCC3)
CFLAGS+=	-fformat-extensions
.endif
CFLAGS+=	-std=c99
.endif

.if defined(Z_HP)
CFLAGS+=	-DSND_FEEDER_RATE_HP
.endif

.if !defined(Z_NO_64)
CFLAGS+=	-DSND_PCM_64
.endif

.if defined(Z_DIAGNOSTIC)
CFLAGS+=	-DSND_DIAGNOSTIC
.endif

.if defined(Z_STRESS_TEST)
CFLAGS+=	-DZ_STRESS_TEST
.endif

.if defined(Z_CLIP_CHECK)
CFLAGS+=	-DFEEDEQ_ERR_CLIP=1
.endif

.if !defined(Z_BASIC_MULTIFORMAT)
.if defined(Z_MULTIFORMAT)
CFLAGS+=	-DSND_FEEDER_MULTIFORMAT
.else
CFLAGS+=	-DSND_FEEDER_FULL_MULTIFORMAT
.endif
.endif

.if defined(Z_SCALE_UINT)
CFLAGS+=	-DZ_SCALE_UINT
.endif

.if !defined(Z_NO_USE_ALPHADRIFT)
CFLAGS+=	-DZ_USE_ALPHADRIFT
.endif

.if defined(Z_SYS)
.if defined(FEEDER_RATE_PRESETS)
Z_RATE_PRESETS?=	$(FEEDER_RATE_PRESETS)
.endif
.if defined(FEEDER_EQ_PRESETS)
Z_EQ_PRESETS?=		$(FEEDER_EQ_PRESETS)
.endif
.endif

.if defined(Z_TEST)
Z_RATE_PRESETS?=	100:8:0.86 100:32:0.92 100:128:0.98
.endif

.if !defined(Z_DEFAULT)
Z_RATE_PRESETS?=	$(Z_PRESETS)
.endif

.if defined(Z_EQ_EXTREME)
Z_EQ_PRESETS?=	16000,0.25:62,0.25:-12,12,0.1:44100,48000,88200,96000,176400,192000
.else
Z_EQ_PRESETS?=	16000,0.25:62,0.25:-9,9,1.0:44100,48000,88200,96000,176400,192000
.endif

CLEANFILES+=	feeder_rate_gen.h feeder_eq_gen.h snd_fxdiv_gen.h
#g711.h

.if defined(Z_SPEEX) || defined(Z_SPEEX_FIXED) || defined(Z_GRC3) || defined(Z_GRC3_OPENSOLARIS)
feeder_rate_gen.h:
	touch $(.TARGET)
.else
feeder_rate_gen.h:	feeder_rate_mkfilter.awk
	$(AWK) -f feeder_rate_mkfilter.awk -- $(Z_RATE_PRESETS) > $(.TARGET)
.endif

feeder_eq_gen.h:	feeder_eq_mkfilter.awk
	$(AWK) -f feeder_eq_mkfilter.awk -- $(Z_EQ_PRESETS) > $(.TARGET)

snd_fxdiv_gen.h:	snd_fxdiv_gen.awk
	$(AWK) -f snd_fxdiv_gen.awk -- > $(.TARGET)

#g711.h:	g711.rb
#	$(RUBY) g711.rb > $(.TARGET)
	

showconfig:
	@grep -B1 -A8 'ty =' feeder_rate_gen.h

feeder_main.o:	feeder_compat.h feeder_format.c feeder_main.c		\
		feeder_rate.c feeder_stdio.c feeder_rate_gen.h g711.h	\
		oss_compat.h pcm.h waveutil.h intpcm.h feeder_matrix.c	\
		matrix.h feeder_volume.c feeder_eq.c feeder_eq_gen.h	\
		feeder_rate_multi.c feeder_rate_32.c			\
		feeder_rate_dynamic.c intpcm_simple.h			\
		intpcm_full.h version.h feeder_chain.c snd_fxdiv_gen.h	\
		feeder_rate_speex.c feeder_rate_grc3.c			\
		feeder_rate_grc3_opensolaris.c				\
		feeder_rate_16.c matrix_map.h

SRCS=	feeder_main.c feeder_rate_gen.h g711.h oss_compat.h waveutil.c	\
	waveutil.h feeder_eq_gen.h snd_fxdiv_gen.h

.if defined(Z_32)
CFLAGS+=	-DZ_32
.elif defined(Z_16)
CFLAGS+=	-DZ_16
.elif defined(Z_DYNAMIC)
CFLAGS+=	-DZ_DYNAMIC
.elif defined(Z_SPEEX) || defined(Z_SPEEX_FIXED)
.PATH:		$(.CURDIR)/speex
CFLAGS+=	-I$(.CURDIR) -DZ_SPEEX -DOUTSIDE_SPEEX -DRANDOM_PREFIX="speexfx"
.if defined(Z_SPEEX_FIXED)
CFLAGS+=	-DFIXED_POINT
.else
CFLAGS+=	-DFLOATING_POINT
.endif
SRCS+=		resample.c
.elif defined(Z_GRC3)
CFLAGS+=	-I$(.CURDIR)/grc3 -DZ_GRC3
.elif defined(Z_GRC3_OPENSOLARIS)
.PATH:		$(.CURDIR)/grc3_opensolaris
CFLAGS+=	-I$(.CURDIR)/grc3_opensolaris -DZ_GRC3_OPENSOLARIS
SRCS+=		audio_grc3.c audio_fltdata.c
.endif

.if ${MACHINE_ARCH} == "i386"
SRCS+=	quad.h qdivrem.c udivdi3.c
.endif

MAN1=

$(PROG)_remove:
	rm -f $(PROG) feeder_main.o waveutil.o qdivrem.o udivdi3.o resampler.o

remake:	$(PROG)_remove $(PROG)

remake_all:	realclean $(PROG)

clean_all:	clean
	rm -f *.raw *.wav a.out *.s *.o a.out zresampler speex-zresampler grc3-zresampler grc3-opensolaris-zresampler
	rm -f *.png
	rm -rf html spectrogram

sine16.wav:
	sox -t null -c 1 -r 96000 -s -2 /dev/null -t wavpcm $(.TARGET) \
		synth 8 sine create 0+48000 vol -6dB

sine.wav:
	sox -t null -c 1 -r 96000 -s -4 /dev/null -t wavpcm $(.TARGET) \
		synth 8 sine create 0+48000 vol -6dB

sine48k.wav:
	sox -t null -c 1 -r 48000 -s -4 /dev/null -t wavpcm $(.TARGET) \
		synth 8 sine create 0+24000 vol -6dB

sine44k.wav:
	sox -t null -c 1 -r 44100 -s -4 /dev/null -t wavpcm $(.TARGET) \
		synth 8 sine create 0+22050 vol -6dB

sineclip.wav:
	sox -t null -c 1 -r 44100 -s -4 /dev/null -t wavpcm sineclip.wav \
		synth 8 sine create 0+22050

realclean:	clean_all

html:
	@mkdir -p html
	@for x in Makefile *.awk *.[ch] *.sh ; do 				\
		gvim -f +'TOhtml' +'w!' +'q!' +'q!' "$$x";		\
		mv -f "$$x".html html/;					\
	done

IBegin.wav:
	ruby -e 'STDOUT.write([1 << 14].pack("s")) ;			\
	    STDOUT.write([0].pack("s") * 44099)' |			\
	    sox -t raw -c 1 -s -2 -r 44100 - $(.TARGET)

IEnd.wav:
	ruby -e 'STDOUT.write([0].pack("s") * 44099) ;			\
	    STDOUT.write([1 << 14].pack("s"))' |			\
	    sox -t raw -c 1 -s -2 -r 44100 - $(.TARGET)

IBoth.wav:
	ruby -e 'STDOUT.write([1 << 14].pack("s"));			\
	    STDOUT.write([0].pack("s") * 44098) ;			\
	    STDOUT.write([1 << 14].pack("s"))' |			\
	    sox -t raw -c 1 -s -2 -r 44100 - $(.TARGET)

I.wav:
	ruby -e '1.upto(44100) do |i|					\
	    STDOUT.write([(i % 2 != 0) ? 1 << 14 : 0].pack("s")) end'	\
	    | sox -t raw -c 1 -s -2 -r 44100 - -t wavpcm $(.TARGET)

.if defined(Z_SPEEX) || defined(Z_SPEEX_FIXED)
LDADD+=		-lm
.endif

.include <bsd.prog.mk>
