wessedit.c (4891B)
1 2 /* ULTRA64 LIBRARIES */ 3 #include <ultra64.h> 4 #include "ultratypes.h" 5 #include <libaudio.h> 6 7 /* WESS API INCLUDES */ 8 #include "wessapi.h" // audio stuff... 9 #include "seqload.h" 10 #include "soundhw.h" 11 #include "wessarc.h" 12 #include "wessseq.h" 13 14 #include "funqueue.h" 15 16 #include "wessedit.h" 17 #ifndef NOUSEWESSCODE 18 extern pmasterstat *pm_stat; //0x800B41CC 19 20 static int max_edit_labels = 2; //0x8005D900 21 static int soundfx_edit_tracks = 8; //0x8005D904 22 static int music_edit_tracks = 15; //0x8005D908 23 static int drums_edit_tracks = 1; //0x8005D90C 24 static int edt_mem_is_mine = 0;//0x8005D910 25 static char *edt_mem = 0;//0x8005D914 26 static int edt_size = 0;//0x8005D918 27 28 void wess_handle_free_edit_space(void) // 80034D20 29 { 30 if (edt_mem_is_mine) 31 { 32 if (edt_mem) 33 { 34 wess_free(edt_mem); 35 edt_mem = 0; 36 } 37 edt_mem_is_mine = 0; 38 } 39 } 40 41 char *wess_get_edt_start(void) // 80034D70 42 { 43 return(edt_mem); 44 } 45 46 int wess_get_edt_size(void) // 80034D80 47 { 48 return(edt_size); 49 } 50 51 void wess_handle_set_edit_tracks(int labels, int soundfx, int music, int drums) // 80034D90 52 { 53 max_edit_labels = labels; 54 soundfx_edit_tracks = soundfx; 55 music_edit_tracks = music; 56 drums_edit_tracks = drums; 57 } 58 59 int wess_handle_create_edit_space(char *memory_pointer, int data_size, int memory_allowance) // 80034DB4 60 { 61 int i, j, k, soundfx_cnt, music_cnt, drums_cnt; 62 sequence_status *psq_stat; 63 track_status *ptk_stat; 64 char *pdest; 65 char *pmem; 66 int ptrk_indxs_pos; 67 int set_psq_stat; 68 69 char *_memory_pointer; 70 int _data_size; 71 int _memory_allowance; 72 73 _memory_pointer = memory_pointer; 74 _data_size = data_size; 75 _memory_allowance = memory_allowance; 76 77 if (!Is_Module_Loaded()) 78 return(0); 79 80 soundfx_cnt = 0; 81 music_cnt = 0; 82 drums_cnt = 0; 83 84 set_psq_stat = 0; 85 86 if (_memory_pointer == NULL) 87 { 88 edt_mem_is_mine = 1; 89 edt_mem = wess_malloc((char *)_memory_allowance); 90 if (edt_mem == NULL) 91 { 92 return(0); 93 } 94 } 95 else 96 { 97 edt_mem_is_mine = 0; 98 edt_mem = _memory_pointer; 99 } 100 101 edt_size = _memory_allowance; 102 103 wess_disable(); 104 105 for (i = 0; i < wess_driver_tracks; i++) 106 { 107 if (!((pm_stat->pseqstattbl + i)->flags & SEQ_ACTIVE)) 108 break; 109 } 110 111 if (wess_driver_tracks == i) 112 { 113 wess_enable(); 114 return 0; 115 } 116 117 psq_stat = (pm_stat->pseqstattbl + i); 118 pdest = psq_stat->ptrk_indxs; 119 for (j = 0; j < wess_driver_tracks; j++) 120 { 121 ptk_stat = (pm_stat->ptrkstattbl + i); 122 123 if (!(ptk_stat->flags & TRK_ACTIVE)) 124 { 125 if (soundfx_cnt < soundfx_edit_tracks) 126 { 127 ptk_stat->sndclass = SNDFX_CLASS; 128 ptk_stat->patchtype = 1; 129 ptk_stat->data_space = _data_size - (max_edit_labels << 2); 130 ptrk_indxs_pos = soundfx_cnt; 131 soundfx_cnt++; 132 } 133 else if (music_cnt < music_edit_tracks) 134 { 135 ptk_stat->sndclass = MUSIC_CLASS; 136 ptk_stat->patchtype = 1; 137 ptk_stat->data_space = _data_size - (max_edit_labels << 2); 138 ptrk_indxs_pos = (music_cnt + soundfx_edit_tracks); 139 music_cnt++; 140 } 141 else if (drums_cnt < drums_edit_tracks) 142 { 143 ptk_stat->sndclass = DRUMS_CLASS; 144 ptk_stat->patchtype = 1; 145 ptk_stat->data_space = (_memory_allowance - (soundfx_edit_tracks + music_edit_tracks) * _data_size) - (max_edit_labels << 2); 146 ptrk_indxs_pos = (drums_cnt + soundfx_edit_tracks + music_edit_tracks); 147 drums_cnt++; 148 } 149 else 150 { 151 break; 152 } 153 154 //---------------------- 155 set_psq_stat = 1; 156 157 *(pdest + ptrk_indxs_pos) = j; /* update ptrk_indxs for the sequence */ 158 159 ptk_stat->seq_owner = i; 160 ptk_stat->patchnum = 0; 161 ptk_stat->volume_cntrl = 0x7f; 162 ptk_stat->pitch_cntrl = 0; 163 ptk_stat->pan_cntrl = 0x40; 164 ptk_stat->voices_active = 0; 165 ptk_stat->ppq = 120; 166 ptk_stat->qpm = 120; 167 ptk_stat->ppi = CalcPartsPerInt(GetIntsPerSec(), ptk_stat->ppq, ptk_stat->qpm); 168 ptk_stat->starppi = 0; 169 ptk_stat->totppi = 0; 170 ptk_stat->labellist_count = 0; 171 ptk_stat->data_size = 2; 172 ptk_stat->psp = (unsigned char*)ptk_stat->psubstack; 173 ptk_stat->labellist_max = max_edit_labels; 174 175 //---------------------- 176 pmem = (edt_mem + (ptrk_indxs_pos * _data_size)); 177 ptk_stat->plabellist = (unsigned long *)pmem; 178 179 for (k = 0; k < ptk_stat->labellist_max; k++) 180 { 181 *pmem++ = 0; 182 } 183 184 //---------------------- 185 pmem = (edt_mem + (max_edit_labels << 2) + (ptrk_indxs_pos * _data_size)); 186 ptk_stat->pstart = (char *)pmem; 187 pmem[0] = 0; 188 pmem[1] = TrkEnd; 189 190 ptk_stat->flags = (ptk_stat->flags|TRK_ACTIVE|TRK_STOPPED|TRK_HANDLED|TRK_OFF) & ~(TRK_MUTE|TRK_TIMED|TRK_LOOPED|TRK_SKIP); 191 ptk_stat->ppos = Read_Vlq(ptk_stat->pstart, &ptk_stat->deltatime); 192 ptk_stat->mutemask = 0; 193 194 psq_stat->tracks_active++; 195 pm_stat->trks_active++; 196 } 197 } 198 199 if (set_psq_stat) 200 { 201 psq_stat->flags |= (SEQ_HANDLE|SEQ_ACTIVE); 202 psq_stat->seq_num = -1; 203 psq_stat->seq_type = 0; 204 psq_stat->playmode = 0; 205 psq_stat->volume = 0x7f; 206 psq_stat->pan = 0x40; 207 pm_stat->seqs_active++; 208 } 209 210 wess_enable(); 211 212 if (set_psq_stat) 213 { 214 return (i + 1); 215 } 216 217 return 0; 218 } 219 #endif