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>