| | 139 | |
|---|
| | 140 | CAMLprim c_ex_ladspa_instantiate(value ml_desc, value ml_samplerate) { |
|---|
| | 141 | |
|---|
| | 142 | CAMLparam2(ml_desc, ml_samplerate); |
|---|
| | 143 | |
|---|
| | 144 | LADSPA_Descriptor *ld = (LADSPA_Descriptor *)Field(ml_desc, 0); |
|---|
| | 145 | long samplerate = Long_val(ml_samplerate); |
|---|
| | 146 | |
|---|
| | 147 | LADSPA_Handle h = ld->instantiate(ld, samplerate); |
|---|
| | 148 | |
|---|
| | 149 | CAMLlocal1(block); |
|---|
| | 150 | block = alloc(1, Abstract_tag); |
|---|
| | 151 | Field(block, 0) = (value)h; |
|---|
| | 152 | CAMLreturn(block); |
|---|
| | 153 | |
|---|
| | 154 | } |
|---|
| | 155 | |
|---|
| | 156 | CAMLprim c_ex_ladspa_activate(value ml_desc, value ml_handle) { |
|---|
| | 157 | |
|---|
| | 158 | CAMLparam2(ml_desc, ml_handle); |
|---|
| | 159 | |
|---|
| | 160 | LADSPA_Descriptor *ld = (LADSPA_Descriptor *)Field(ml_desc, 0); |
|---|
| | 161 | LADSPA_Handle h = (LADSPA_Handle)Field(ml_handle, 0); |
|---|
| | 162 | |
|---|
| | 163 | if (ld->activate != NULL) { |
|---|
| | 164 | ld->activate(h); |
|---|
| | 165 | } |
|---|
| | 166 | |
|---|
| | 167 | CAMLreturn(Val_unit); |
|---|
| | 168 | |
|---|
| | 169 | } |
|---|
| | 170 | |
|---|
| | 171 | value make_arr_entry(LADSPA_Data *d) { |
|---|
| | 172 | CAMLlocal1(block); |
|---|
| | 173 | block = alloc(1, Abstract_tag); |
|---|
| | 174 | Field(block, 0) = (value)d; |
|---|
| | 175 | return block; |
|---|
| | 176 | } |
|---|
| | 177 | |
|---|
| | 178 | CAMLprim c_ex_ladspa_raw_sound_to_buffers(value ml_sound, value ml_channels) { |
|---|
| | 179 | |
|---|
| | 180 | CAMLparam1(ml_sound); |
|---|
| | 181 | |
|---|
| | 182 | int length = Wosize_val(ml_sound); |
|---|
| | 183 | int channels = Int_val(ml_channels); |
|---|
| | 184 | int i; |
|---|
| | 185 | |
|---|
| | 186 | LADSPA_Data **data = malloc((channels + 1) * sizeof(LADSPA_Data *)); |
|---|
| | 187 | |
|---|
| | 188 | for (i = 0; i < channels; i++) { |
|---|
| | 189 | data[i] = malloc(length/channels * sizeof(LADSPA_Data)); |
|---|
| | 190 | } |
|---|
| | 191 | |
|---|
| | 192 | data[channels] = NULL; |
|---|
| | 193 | |
|---|
| | 194 | for (i = 0; i < length; i++) { |
|---|
| | 195 | int v = Int_val(Field(ml_sound, i)); |
|---|
| | 196 | data[i % channels][i / channels] = v / (float)0x7FFF; |
|---|
| | 197 | } |
|---|
| | 198 | |
|---|
| | 199 | CAMLlocal1(block); |
|---|
| | 200 | block = alloc_array((value (*)(char const *))make_arr_entry, |
|---|
| | 201 | (char const **)data); |
|---|
| | 202 | free(data); |
|---|
| | 203 | CAMLreturn(block); |
|---|
| | 204 | } |
|---|
| | 205 | |
|---|
| | 206 | CAMLprim c_ex_ladspa_buffers_to_raw_sound(value ml_buffers, value ml_size) { |
|---|
| | 207 | |
|---|
| | 208 | CAMLparam2(ml_buffers, ml_size); |
|---|
| | 209 | |
|---|
| | 210 | int channels = Wosize_val(ml_buffers); |
|---|
| | 211 | long size = Long_val(ml_size); |
|---|
| | 212 | LADSPA_Data **data = malloc(channels * sizeof(LADSPA_Data *)); |
|---|
| | 213 | int i, j, k; |
|---|
| | 214 | |
|---|
| | 215 | for (i = 0; i < channels; i++) { |
|---|
| | 216 | value b = (value)Field(ml_buffers, i); |
|---|
| | 217 | data[i] = (LADSPA_Data *)Field(b, 0); |
|---|
| | 218 | } |
|---|
| | 219 | |
|---|
| | 220 | CAMLlocal1(block); |
|---|
| | 221 | block = caml_alloc(size * channels, 0); |
|---|
| | 222 | k = 0; |
|---|
| | 223 | for (i = 0; i < size; i++) { |
|---|
| | 224 | for (j = 0; j < channels; j++) { |
|---|
| | 225 | Field(block, k) = (short)(data[j][i] * 0x7FFF); |
|---|
| | 226 | k++; |
|---|
| | 227 | } |
|---|
| | 228 | } |
|---|
| | 229 | |
|---|
| | 230 | free(data); |
|---|
| | 231 | |
|---|
| | 232 | CAMLreturn(block); |
|---|
| | 233 | } |
|---|
| | 234 | |
|---|
| | 235 | CAMLprim c_ex_ladspa_control_value_to_buffer(value ml_value) { |
|---|
| | 236 | |
|---|
| | 237 | CAMLparam1(ml_value); |
|---|
| | 238 | |
|---|
| | 239 | LADSPA_Data *data = malloc(sizeof(LADSPA_Data)); |
|---|
| | 240 | *data = (float)(Double_val(ml_value)); |
|---|
| | 241 | |
|---|
| | 242 | CAMLlocal1(block); |
|---|
| | 243 | block = alloc(1, Abstract_tag); |
|---|
| | 244 | Field(block, 0) = (value)data; |
|---|
| | 245 | CAMLreturn(block); |
|---|
| | 246 | } |
|---|
| | 247 | |
|---|
| | 248 | CAMLprim c_ex_ladspa_empty_buffer(value ml_size) { |
|---|
| | 249 | |
|---|
| | 250 | CAMLparam1(ml_size); |
|---|
| | 251 | |
|---|
| | 252 | int size = Int_val(ml_size); |
|---|
| | 253 | LADSPA_Data *data = malloc(sizeof(LADSPA_Data) * size); |
|---|
| | 254 | |
|---|
| | 255 | CAMLlocal1(block); |
|---|
| | 256 | block = alloc(1, Abstract_tag); |
|---|
| | 257 | Field(block, 0) = (value)data; |
|---|
| | 258 | CAMLreturn(block); |
|---|
| | 259 | } |
|---|
| | 260 | |
|---|
| | 261 | CAMLprim c_ex_ladspa_connect_port(value ml_desc, value ml_handle, |
|---|
| | 262 | value ml_port, value ml_data) { |
|---|
| | 263 | |
|---|
| | 264 | CAMLparam4(ml_desc, ml_handle, ml_port, ml_data); |
|---|
| | 265 | |
|---|
| | 266 | LADSPA_Descriptor *ld = (LADSPA_Descriptor *)Field(ml_desc, 0); |
|---|
| | 267 | LADSPA_Handle h = (LADSPA_Handle)Field(ml_handle, 0); |
|---|
| | 268 | LADSPA_Data *data = (LADSPA_Data *)Field(ml_data, 0); |
|---|
| | 269 | |
|---|
| | 270 | int port = Int_val(ml_port); |
|---|
| | 271 | |
|---|
| | 272 | ld->connect_port(h, port, data); |
|---|
| | 273 | |
|---|
| | 274 | CAMLreturn(Val_unit); |
|---|
| | 275 | |
|---|
| | 276 | } |
|---|
| | 277 | |
|---|
| | 278 | CAMLprim c_ex_ladspa_run(value ml_desc, value ml_handle, value ml_count) { |
|---|
| | 279 | |
|---|
| | 280 | CAMLparam3(ml_desc, ml_handle, ml_count); |
|---|
| | 281 | |
|---|
| | 282 | LADSPA_Descriptor *ld = (LADSPA_Descriptor *)Field(ml_desc, 0); |
|---|
| | 283 | LADSPA_Handle h = (LADSPA_Handle)Field(ml_handle, 0); |
|---|
| | 284 | long count = Long_val(ml_count); |
|---|
| | 285 | |
|---|
| | 286 | ld->run(h, count); |
|---|
| | 287 | |
|---|
| | 288 | CAMLreturn(Val_unit); |
|---|
| | 289 | |
|---|
| | 290 | } |
|---|
| | 291 | |
|---|
| | 292 | CAMLprim c_ex_ladspa_run_adding(value ml_desc, value ml_handle, value ml_count) |
|---|
| | 293 | { |
|---|
| | 294 | |
|---|
| | 295 | CAMLparam3(ml_desc, ml_handle, ml_count); |
|---|
| | 296 | |
|---|
| | 297 | LADSPA_Descriptor *ld = (LADSPA_Descriptor *)Field(ml_desc, 0); |
|---|
| | 298 | LADSPA_Handle h = (LADSPA_Handle)Field(ml_handle, 0); |
|---|
| | 299 | long count = Long_val(ml_count); |
|---|
| | 300 | |
|---|
| | 301 | ld->run_adding(h, count); |
|---|
| | 302 | |
|---|
| | 303 | CAMLreturn(Val_unit); |
|---|
| | 304 | } |
|---|