From 4ba114e8bd8685f3352e748c2143c95a0fed4ba3 Mon Sep 17 00:00:00 2001 From: David Benepe Date: Fri, 4 Jun 2021 19:35:42 -0500 Subject: [PATCH] Split unknown_064830.c into unknown_065550.c and moved the rest of the rodata --- asm/non_matchings/unknown_064830/alFxNew.s | 19 +- .../unknown_064830/alFxParamHdl.s | 21 +- src/unknown_064830.c | 203 ------------------ src/unknown_065550.c | 189 ++++++++++++++++ 4 files changed, 225 insertions(+), 207 deletions(-) create mode 100644 src/unknown_065550.c diff --git a/asm/non_matchings/unknown_064830/alFxNew.s b/asm/non_matchings/unknown_064830/alFxNew.s index 5b9746e2..08554ead 100644 --- a/asm/non_matchings/unknown_064830/alFxNew.s +++ b/asm/non_matchings/unknown_064830/alFxNew.s @@ -1,3 +1,12 @@ +.late_rodata +glabel jpt_800E6EA0 +.word L80064AD8, L80064AE4, L80064AFC, L80064B08, L80064AF0, L80064B14 +glabel D_800E6EB8 +.float 8.320827 +glabel D_800E6EBC +.float 0.04680453 + +.text glabel alFxNew /* 065608 80064A08 27BDFFA0 */ addiu $sp, $sp, -0x60 /* 06560C 80064A0C AFB00038 */ sw $s0, 0x38($sp) @@ -45,27 +54,33 @@ glabel alFxNew /* 0656B4 80064AB4 1020001C */ beqz $at, .L80064B28 /* 0656B8 80064AB8 2673D028 */ addiu $s3, %lo(D_800DD028) # addiu $s3, $s3, -0x2fd8 /* 0656BC 80064ABC 00094880 */ sll $t1, $t1, 2 -/* 0656C0 80064AC0 3C01800E */ lui $at, %hi(D_800E6EA0) # $at, 0x800e +/* 0656C0 80064AC0 3C01800E */ lui $at, %hi(jpt_800E6EA0) # $at, 0x800e /* 0656C4 80064AC4 00290821 */ addu $at, $at, $t1 -/* 0656C8 80064AC8 8C296EA0 */ lw $t1, %lo(D_800E6EA0)($at) +/* 0656C8 80064AC8 8C296EA0 */ lw $t1, %lo(jpt_800E6EA0)($at) /* 0656CC 80064ACC 00000000 */ nop /* 0656D0 80064AD0 01200008 */ jr $t1 /* 0656D4 80064AD4 00000000 */ nop +glabel L80064AD8 /* 0656D8 80064AD8 3C13800E */ lui $s3, %hi(D_800DCEC0) # $s3, 0x800e /* 0656DC 80064ADC 10000012 */ b .L80064B28 /* 0656E0 80064AE0 2673CEC0 */ addiu $s3, %lo(D_800DCEC0) # addiu $s3, $s3, -0x3140 +glabel L80064AE4 /* 0656E4 80064AE4 3C13800E */ lui $s3, %hi(D_800DCF28) # $s3, 0x800e /* 0656E8 80064AE8 1000000F */ b .L80064B28 /* 0656EC 80064AEC 2673CF28 */ addiu $s3, %lo(D_800DCF28) # addiu $s3, $s3, -0x30d8 +glabel L80064AF0 /* 0656F0 80064AF0 3C13800E */ lui $s3, %hi(D_800DCFB0) # $s3, 0x800e /* 0656F4 80064AF4 1000000C */ b .L80064B28 /* 0656F8 80064AF8 2673CFB0 */ addiu $s3, %lo(D_800DCFB0) # addiu $s3, $s3, -0x3050 +glabel L80064AFC /* 0656FC 80064AFC 3C13800E */ lui $s3, %hi(D_800DCFD8) # $s3, 0x800e /* 065700 80064B00 10000009 */ b .L80064B28 /* 065704 80064B04 2673CFD8 */ addiu $s3, %lo(D_800DCFD8) # addiu $s3, $s3, -0x3028 +glabel L80064B08 /* 065708 80064B08 3C13800E */ lui $s3, %hi(D_800DD000) # $s3, 0x800e /* 06570C 80064B0C 10000006 */ b .L80064B28 /* 065710 80064B10 2673D000 */ addiu $s3, %lo(D_800DD000) # addiu $s3, $s3, -0x3000 +glabel L80064B14 /* 065714 80064B14 00105080 */ sll $t2, $s0, 2 /* 065718 80064B18 004A5821 */ addu $t3, $v0, $t2 /* 06571C 80064B1C 8D730020 */ lw $s3, 0x20($t3) diff --git a/asm/non_matchings/unknown_064830/alFxParamHdl.s b/asm/non_matchings/unknown_064830/alFxParamHdl.s index 00d6eec5..4549e313 100644 --- a/asm/non_matchings/unknown_064830/alFxParamHdl.s +++ b/asm/non_matchings/unknown_064830/alFxParamHdl.s @@ -1,3 +1,12 @@ +.late_rodata +glabel jpt_800E6E70 +.word L80063FE8, L8006401C, L8006407C, L80064050, L800640A8, L800640D4, L80064144, L800641C4 +glabel D_800E6E90 +.float 8.320827 +glabel D_800E6E94 +.float 0.04680453 + +.text glabel alFxParamHdl /* 064BAC 80063FAC 27BDFFE8 */ addiu $sp, $sp, -0x18 /* 064BB0 80063FB0 24A3FFFE */ addiu $v1, $a1, -2 @@ -8,12 +17,13 @@ glabel alFxParamHdl /* 064BC4 80063FC4 10200093 */ beqz $at, .L80064214 /* 064BC8 80063FC8 00803825 */ move $a3, $a0 /* 064BCC 80063FCC 000E7080 */ sll $t6, $t6, 2 -/* 064BD0 80063FD0 3C01800E */ lui $at, %hi(D_800E6E70) # $at, 0x800e +/* 064BD0 80063FD0 3C01800E */ lui $at, %hi(jpt_800E6E70) # $at, 0x800e /* 064BD4 80063FD4 002E0821 */ addu $at, $at, $t6 -/* 064BD8 80063FD8 8C2E6E70 */ lw $t6, %lo(D_800E6E70)($at) +/* 064BD8 80063FD8 8C2E6E70 */ lw $t6, %lo(jpt_800E6E70)($at) /* 064BDC 80063FDC 00000000 */ nop /* 064BE0 80063FE0 01C00008 */ jr $t6 /* 064BE4 80063FE4 00000000 */ nop +glabel L80063FE8 /* 064BE8 80063FE8 2401FFF8 */ li $at, -8 /* 064BEC 80063FEC 01017824 */ and $t7, $t0, $at /* 064BF0 80063FF0 8CF80020 */ lw $t8, 0x20($a3) @@ -28,6 +38,7 @@ glabel alFxParamHdl /* 064C10 80064010 03095021 */ addu $t2, $t8, $t1 /* 064C14 80064014 1000007F */ b .L80064214 /* 064C18 80064018 AD4F0000 */ sw $t7, ($t2) +glabel L8006401C /* 064C1C 8006401C 2401FFF8 */ li $at, -8 /* 064C20 80064020 01015824 */ and $t3, $t0, $at /* 064C24 80064024 8CEC0020 */ lw $t4, 0x20($a3) @@ -42,6 +53,7 @@ glabel alFxParamHdl /* 064C44 80064044 018EC821 */ addu $t9, $t4, $t6 /* 064C48 80064048 10000072 */ b .L80064214 /* 064C4C 8006404C AF2B0004 */ sw $t3, 4($t9) +glabel L80064050 /* 064C50 80064050 8CF80020 */ lw $t8, 0x20($a3) /* 064C54 80064054 04610003 */ bgez $v1, .L80064064 /* 064C58 80064058 000348C3 */ sra $t1, $v1, 3 @@ -54,6 +66,7 @@ glabel alFxParamHdl /* 064C70 80064070 030F5021 */ addu $t2, $t8, $t7 /* 064C74 80064074 10000067 */ b .L80064214 /* 064C78 80064078 A5480008 */ sh $t0, 8($t2) +glabel L8006407C /* 064C7C 8006407C 8CED0020 */ lw $t5, 0x20($a3) /* 064C80 80064080 04610003 */ bgez $v1, .L80064090 /* 064C84 80064084 000360C3 */ sra $t4, $v1, 3 @@ -66,6 +79,7 @@ glabel alFxParamHdl /* 064C9C 8006409C 01AE5821 */ addu $t3, $t5, $t6 /* 064CA0 800640A0 1000005C */ b .L80064214 /* 064CA4 800640A4 A568000A */ sh $t0, 0xa($t3) +glabel L800640A8 /* 064CA8 800640A8 8CF90020 */ lw $t9, 0x20($a3) /* 064CAC 800640AC 04610003 */ bgez $v1, .L800640BC /* 064CB0 800640B0 000348C3 */ sra $t1, $v1, 3 @@ -78,6 +92,7 @@ glabel alFxParamHdl /* 064CC8 800640C8 03387821 */ addu $t7, $t9, $t8 /* 064CCC 800640CC 10000051 */ b .L80064214 /* 064CD0 800640D0 A5E8000C */ sh $t0, 0xc($t7) +glabel L800640D4 /* 064CD4 800640D4 44882000 */ mtc1 $t0, $f4 /* 064CD8 800640D8 3C01447A */ li $at, 0x447A0000 # 1000.000000 /* 064CDC 800640DC 468021A0 */ cvt.s.w $f6, $f4 @@ -107,6 +122,7 @@ glabel alFxParamHdl /* 064D38 80064138 01AB4821 */ addu $t1, $t5, $t3 /* 064D3C 8006413C 10000035 */ b .L80064214 /* 064D40 80064140 E5280010 */ swc1 $f8, 0x10($t1) +glabel L80064144 /* 064D44 80064144 8CF90020 */ lw $t9, 0x20($a3) /* 064D48 80064148 04610003 */ bgez $v1, .L80064158 /* 064D4C 8006414C 0003C0C3 */ sra $t8, $v1, 3 @@ -141,6 +157,7 @@ glabel alFxParamHdl /* 064DB8 800641B8 462021A0 */ cvt.s.d $f6, $f4 /* 064DBC 800641BC 10000015 */ b .L80064214 /* 064DC0 800641C0 E446001C */ swc1 $f6, 0x1c($v0) +glabel L800641C4 /* 064DC4 800641C4 04610003 */ bgez $v1, .L800641D4 /* 064DC8 800641C8 000310C3 */ sra $v0, $v1, 3 /* 064DCC 800641CC 24610007 */ addiu $at, $v1, 7 diff --git a/src/unknown_064830.c b/src/unknown_064830.c index c8101ab5..42821e13 100644 --- a/src/unknown_064830.c +++ b/src/unknown_064830.c @@ -13,119 +13,8 @@ s32 D_800DCEB4 = 0x10; // Currently unknown, might be a different type. s32 D_800DCEB8 = 0x10; // Currently unknown, might be a different type. s32 D_800DCEBC = 0x20; // Currently unknown, might be a different type. -// TODO: Figure out what this actually is. -s32 D_800DCEC0[26] = { - 0x00000003, 0x00000FA0, - 0x00000000, 0x00000870, - 0x00002666, 0xFFFFD99A, - 0x00000000, 0x00000000, - 0x00000000, 0x00000000, - 0x000002F8, 0x000005F0, - 0x00000CCC, 0xFFFFF334, - 0x00003FFF, 0x00000000, - 0x00000000, 0x00000000, - 0x00000000, 0x00000960, - 0x00001388, 0x00000000, - 0x00000000, 0x00000000, - 0x00000000, 0x00005000 -}; - -// TODO: Figure out what this actually is. -s32 D_800DCF28[34] = { - 0x00000004, 0x00000FA0, - 0x00000000, 0x00000A50, - 0x00002666, 0xFFFFD99A, - 0x00000000, 0x00000000, - 0x00000000, 0x00000000, - 0x00000370, 0x00000870, - 0x00000CCC, 0xFFFFF334, - 0x00003FFF, 0x00000000, - 0x00000000, 0x00000000, - 0x00000A50, 0x00000E38, - 0x00000CCC, 0xFFFFF334, - 0x00003FFF, 0x00000000, - 0x00000000, 0x00000000, - 0x00000000, 0x00000EB0, - 0x00001F40, 0x00000000, - 0x00000000, 0x00000000, - 0x00000000, 0x00005000 -}; - -// TODO: Figure out what this actually is. -s32 D_800DCFB0[10] = { - 0x00000001, 0x00001F40, - 0x00000000, 0x00001BF8, - 0x00002EE0, 0x00000000, - 0x00007FFF, 0x00000000, - 0x00000000, 0x00000000 -}; - -// TODO: Figure out what this actually is. -s32 D_800DCFD8[10] = { - 0x00000001, 0x00000320, - 0x00000000, 0x000000C8, - 0x00004000, 0x00000000, - 0x00007FFF, 0x00001DB0, - 0x000002BC, 0x00000000 -}; - -// TODO: Figure out what this actually is. -s32 D_800DD000[10] = { - 0x00000001, 0x00000320, - 0x00000000, 0x000000C8, - 0x00000000, 0x00005FFF, - 0x00007FFF, 0x0000017C, - 0x000001F4, 0x00000000 -}; - -// TODO: Figure out what this actually is. -s32 D_800DD028[10] = { - 0x00000000, 0x00000000, - 0x00000000, 0x00000000, - 0x00000000, 0x00000000, - 0x00000000, 0x00000000, - 0x00000000, 0x00000000 -}; - /*******************************/ -/************ .rodata ************/ - -// Jump table in alFxParamHdl -const u32 D_800E6E70[] = { - 0x80063FE8, 0x8006401C, 0x8006407C, 0x80064050, - 0x800640A8, 0x800640D4, 0x80064144, 0x800641C4 -}; - -const FloatLiteral D_800E6E90 = { 8.320827f }; -const FloatLiteral D_800E6E94 = { 0.04680453f }; - -const DoubleLiteral D_800E6E98 = { 0.0f }; // Probably a file boundary. - -// Jump table in alFxNew -const u32 D_800E6EA0[] = { - 0x80064AD8, 0x80064AE4, 0x80064AFC, 0x80064B08, - 0x80064AF0, 0x80064B14 -}; - -const FloatLiteral D_800E6EB8 = { 8.320827f }; -const FloatLiteral D_800E6EBC = { 0.04680453f }; - -/*********************************/ - -extern s32 alAuxBusPull; -extern s32 alAuxBusParam; -extern s32 alEnvMixerPull; -extern s32 alEnvmixerParam; -extern s32 alLoadParam; -extern s32 alLoadPull; -extern s32 alResampleParam; -extern s32 alResamplePull; -extern s32 alMainBusParam; -extern s32 alMainBusPull; -extern s32 alSaveParam; -extern s32 alSavePull; - GLOBAL_ASM("asm/non_matchings/unknown_064830/alFxPull.s") s32 alFxParam(void* filter, s32 paramID, void* param) { @@ -138,7 +27,6 @@ s32 alFxParam(void* filter, s32 paramID, void* param) { GLOBAL_ASM("asm/non_matchings/unknown_064830/alFxParamHdl.s") GLOBAL_ASM("asm/non_matchings/unknown_064830/_loadOutputBuffer.s") - /* * This routine is for loading data from the delay line buff. If the * address of curr_ptr < r->base, it will force it to be within r->base @@ -245,94 +133,3 @@ Acmd *_filterBuffer(ALLowPass *lp, s32 buff, s32 count, Acmd *p) GLOBAL_ASM("asm/non_matchings/unknown_064830/_doModFunc.s") GLOBAL_ASM("asm/non_matchings/unknown_064830/func_8006492C.s") - -#define SCALE 16384 - -void init_lpfilter(ALLowPass *lp) -{ - s32 i, temp; - s16 fc; - f64 ffc, fcoef; - - temp = lp->fc * SCALE; - fc = temp >> 15; - lp->fgain = SCALE - fc; - - lp->first = 1; - for (i=0; i<8; i++) - lp->fcvec.fccoef[i] = 0; - - lp->fcvec.fccoef[i++] = fc; - fcoef = ffc = (f64)fc/SCALE; - - for (; i<16; i++){ - fcoef *= ffc; - lp->fcvec.fccoef[i] = (s16)(fcoef * SCALE); - } -} - -GLOBAL_ASM("asm/non_matchings/unknown_064830/alFxNew.s") - -void alEnvmixerNew(ALEnvMixer* e, s32 arg1) { - alFilterNew(e, &alEnvMixerPull, &alEnvmixerParam, 4); - e->state = alHeapDBAlloc(0, 0, arg1, 1, 0x50); - e->first = 1; - e->motion = AL_STOPPED; - e->volume = 1; - e->ltgt = 1; - e->rtgt = 1; - e->cvolL = 1; - e->cvolR = 1; - e->dryamt = 0; - e->wetamt = 0; - e->lratm = 1; - e->lratl = 0; - e->delta = 0; - e->segEnd = 0; - e->pan = 0; - e->ctrlList = 0; - e->ctrlTail = 0; - e->sources = 0; -} - -void alLoadNew(ALLoadFilter* arg0, s32 (*arg1)(s32*), s32 arg2) { - alFilterNew(arg0, &alLoadPull, &alLoadParam, 0); - arg0->state = alHeapDBAlloc(0, 0, arg2, 1, 0x20); - arg0->lstate = alHeapDBAlloc(0, 0, arg2, 1, 0x20); - arg0->dma = arg1(&arg0->dmaState); - arg0->lastsam = 0; - arg0->first = 1; - arg0->memin = 0; -} - -void alResampleNew(ALResampler* r, ALHeap* hp) { - alFilterNew(r, &alResamplePull, &alResampleParam, 1); - r->state = alHeapDBAlloc(0, 0, hp, 1, 0x20); - r->first = 1; - r->motion = AL_STOPPED; - r->upitch = 0; - r->ctrlList = 0; - r->ctrlTail = 0; - r->delta = 0.0f; - r->ratio = 1.0f; -} - -void alAuxBusNew(ALAuxBus* m, void* sources, s32 maxSources) { - alFilterNew(m, &alAuxBusPull, &alAuxBusParam, 6); - m->sourceCount = 0; - m->maxSources = maxSources; - m->sources = sources; -} - -void alMainBusNew(ALMainBus* m, void* sources, s32 maxSources) { - alFilterNew(m, &alMainBusPull, &alMainBusParam, 7); - m->sourceCount = 0; - m->maxSources = maxSources; - m->sources = sources; -} - -void alSaveNew(ALSave* f) { - alFilterNew(f, &alSavePull, &alSaveParam, AL_SAVE); - f->dramout = 0; - f->first = 1; -} diff --git a/src/unknown_065550.c b/src/unknown_065550.c new file mode 100644 index 00000000..a098f86e --- /dev/null +++ b/src/unknown_065550.c @@ -0,0 +1,189 @@ +/* The comment below is needed for this file to be picked up by generate_ld */ +/* RAM_POS: 0x80064950 */ + +#include "types.h" +#include "macros.h" +#include "libultra_internal.h" +#include "audio_internal.h" + +#define SCALE 16384 + +/************ .data ************/ + +// TODO: Figure out what this actually is. +s32 D_800DCEC0[26] = { + 0x00000003, 0x00000FA0, + 0x00000000, 0x00000870, + 0x00002666, 0xFFFFD99A, + 0x00000000, 0x00000000, + 0x00000000, 0x00000000, + 0x000002F8, 0x000005F0, + 0x00000CCC, 0xFFFFF334, + 0x00003FFF, 0x00000000, + 0x00000000, 0x00000000, + 0x00000000, 0x00000960, + 0x00001388, 0x00000000, + 0x00000000, 0x00000000, + 0x00000000, 0x00005000 +}; + +// TODO: Figure out what this actually is. +s32 D_800DCF28[34] = { + 0x00000004, 0x00000FA0, + 0x00000000, 0x00000A50, + 0x00002666, 0xFFFFD99A, + 0x00000000, 0x00000000, + 0x00000000, 0x00000000, + 0x00000370, 0x00000870, + 0x00000CCC, 0xFFFFF334, + 0x00003FFF, 0x00000000, + 0x00000000, 0x00000000, + 0x00000A50, 0x00000E38, + 0x00000CCC, 0xFFFFF334, + 0x00003FFF, 0x00000000, + 0x00000000, 0x00000000, + 0x00000000, 0x00000EB0, + 0x00001F40, 0x00000000, + 0x00000000, 0x00000000, + 0x00000000, 0x00005000 +}; + +// TODO: Figure out what this actually is. +s32 D_800DCFB0[10] = { + 0x00000001, 0x00001F40, + 0x00000000, 0x00001BF8, + 0x00002EE0, 0x00000000, + 0x00007FFF, 0x00000000, + 0x00000000, 0x00000000 +}; + +// TODO: Figure out what this actually is. +s32 D_800DCFD8[10] = { + 0x00000001, 0x00000320, + 0x00000000, 0x000000C8, + 0x00004000, 0x00000000, + 0x00007FFF, 0x00001DB0, + 0x000002BC, 0x00000000 +}; + +// TODO: Figure out what this actually is. +s32 D_800DD000[10] = { + 0x00000001, 0x00000320, + 0x00000000, 0x000000C8, + 0x00000000, 0x00005FFF, + 0x00007FFF, 0x0000017C, + 0x000001F4, 0x00000000 +}; + +// TODO: Figure out what this actually is. +s32 D_800DD028[10] = { + 0x00000000, 0x00000000, + 0x00000000, 0x00000000, + 0x00000000, 0x00000000, + 0x00000000, 0x00000000, + 0x00000000, 0x00000000 +}; + +/*******************************/ + +extern s32 alAuxBusPull; +extern s32 alAuxBusParam; +extern s32 alEnvMixerPull; +extern s32 alEnvmixerParam; +extern s32 alLoadParam; +extern s32 alLoadPull; +extern s32 alResampleParam; +extern s32 alResamplePull; +extern s32 alMainBusParam; +extern s32 alMainBusPull; +extern s32 alSaveParam; +extern s32 alSavePull; + +void init_lpfilter(ALLowPass *lp) +{ + s32 i, temp; + s16 fc; + f64 ffc, fcoef; + + temp = lp->fc * SCALE; + fc = temp >> 15; + lp->fgain = SCALE - fc; + + lp->first = 1; + for (i=0; i<8; i++) + lp->fcvec.fccoef[i] = 0; + + lp->fcvec.fccoef[i++] = fc; + fcoef = ffc = (f64)fc/SCALE; + + for (; i<16; i++){ + fcoef *= ffc; + lp->fcvec.fccoef[i] = (s16)(fcoef * SCALE); + } +} + +GLOBAL_ASM("asm/non_matchings/unknown_064830/alFxNew.s") + +void alEnvmixerNew(ALEnvMixer* e, s32 arg1) { + alFilterNew(e, &alEnvMixerPull, &alEnvmixerParam, 4); + e->state = alHeapDBAlloc(0, 0, arg1, 1, 0x50); + e->first = 1; + e->motion = AL_STOPPED; + e->volume = 1; + e->ltgt = 1; + e->rtgt = 1; + e->cvolL = 1; + e->cvolR = 1; + e->dryamt = 0; + e->wetamt = 0; + e->lratm = 1; + e->lratl = 0; + e->delta = 0; + e->segEnd = 0; + e->pan = 0; + e->ctrlList = 0; + e->ctrlTail = 0; + e->sources = 0; +} + +void alLoadNew(ALLoadFilter* arg0, s32 (*arg1)(s32*), s32 arg2) { + alFilterNew(arg0, &alLoadPull, &alLoadParam, 0); + arg0->state = alHeapDBAlloc(0, 0, arg2, 1, 0x20); + arg0->lstate = alHeapDBAlloc(0, 0, arg2, 1, 0x20); + arg0->dma = arg1(&arg0->dmaState); + arg0->lastsam = 0; + arg0->first = 1; + arg0->memin = 0; +} + +void alResampleNew(ALResampler* r, ALHeap* hp) { + alFilterNew(r, &alResamplePull, &alResampleParam, 1); + r->state = alHeapDBAlloc(0, 0, hp, 1, 0x20); + r->first = 1; + r->motion = AL_STOPPED; + r->upitch = 0; + r->ctrlList = 0; + r->ctrlTail = 0; + r->delta = 0.0f; + r->ratio = 1.0f; +} + +void alAuxBusNew(ALAuxBus* m, void* sources, s32 maxSources) { + alFilterNew(m, &alAuxBusPull, &alAuxBusParam, 6); + m->sourceCount = 0; + m->maxSources = maxSources; + m->sources = sources; +} + +void alMainBusNew(ALMainBus* m, void* sources, s32 maxSources) { + alFilterNew(m, &alMainBusPull, &alMainBusParam, 7); + m->sourceCount = 0; + m->maxSources = maxSources; + m->sources = sources; +} + +void alSaveNew(ALSave* f) { + alFilterNew(f, &alSavePull, &alSaveParam, AL_SAVE); + f->dramout = 0; + f->first = 1; +}