Changeset 501

Show
Ignore:
Timestamp:
08/22/07 22:37:57 (1 year ago)
Author:
shans
Message:

raw ladspa wrappers implemented and working (at least for simple test)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • ocaml-remix/trunk/Makefile

    r500 r501  
    2424        ocamlc -I +camlp4 camlp4lib.cma -pp camlp4of pa_operators.ml 
    2525 
    26 remix.cma: $(INTERFACES) $(SOURCES) oss.cma ladspa.cma 
     26remix.cma: $(INTERFACES) $(SOURCES) oss.cma ladspa_raw.cma 
    2727        ocamlc -c $(OCAMLCARGS) $(INTERFACES) $(SOURCES) 
    28         ocamlc -a -g -o remix.cma $(SOURCES) ladspa.cma 
     28        ocamlc -a -g -o remix.cma $(SOURCES) ladspa_raw.cma 
    2929 
    30 remix.cmxa: $(INTERFACES) $(SOURCES) oss.cmxa ladspa.cmx 
     30remix.cmxa: $(INTERFACES) $(SOURCES) oss.cmxa ladspa_raw.cmx 
    3131        ocamlopt -c $(OCAMLOPTARGS) $(INTERFACES) $(SOURCES) 
    32         ocamlopt -a -o remix.cmxa $(SOURCES) ladspa.cmx ladspa_impl.o 
     32        ocamlopt -a -o remix.cmxa $(SOURCES) ladspa_raw.cmx ladspa_impl.o 
    3333 
    3434oss.cma: oss.mli oss.ml oss_impl.c 
     
    3838        ocamlopt oss_impl.c oss.mli oss.ml -a -o oss.cmxa 
    3939 
    40 ladspa.cma: ladspa.mli ladspa.ml ladspa_impl.c 
    41         ocamlc -custom ladspa_impl.c ladspa.mli ladspa.ml -a -o ladspa.cma 
     40ladspa_raw.cma: ladspa_raw.mli ladspa_raw.ml ladspa_impl.c 
     41        ocamlc -custom ladspa_impl.c ladspa_raw.mli ladspa_raw.ml -a \ 
     42                                                        -o ladspa_raw.cma 
    4243 
    43 ladspa.cmx: ladspa.mli ladspa.ml ladspa_impl.c 
    44         ocamlopt ladspa_impl.c ladspa.mli ladspa.ml -a -o ladspa.cmxa 
     44ladspa_raw.cmx: ladspa_raw.mli ladspa_raw.ml ladspa_impl.c 
     45        ocamlopt ladspa_impl.c ladspa_raw.mli ladspa_raw.ml -a \ 
     46                                                        -o ladspa_raw.cmxa 
    4547 
    4648%.bin: remix.cma %.ml 
  • ocaml-remix/trunk/ladspa_impl.c

    r500 r501  
    137137 
    138138} 
     139 
     140CAMLprim 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 
     156CAMLprim 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 
     171value 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 
     178CAMLprim 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 
     206CAMLprim 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 
     235CAMLprim 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 
     248CAMLprim 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 
     261CAMLprim 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 
     278CAMLprim 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 
     292CAMLprim 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} 
  • ocaml-remix/trunk/ladspa_test.ml

    r500 r501  
    1 let d1 = Ladspa.open_plugin "noise:noise_white";; 
     1let p = Ladspa_raw.open_plugin "noise:noise_white";; 
    22 
    3 let n_ports = Ladspa.port_count d1;; 
     3let n_ports = Ladspa_raw.port_count p;; 
    44 
    55Printf.printf "there are %d ports\n" n_ports;; 
    66 
    77for i = 0 to (n_ports - 1) do 
    8   let (d, t) = Ladspa.port_descriptor d1 i in 
     8  let (d, t) = Ladspa_raw.port_descriptor p i in 
    99  Printf.printf "port %d has direction %s and type %s\n" i  
    10       (Ladspa.direction_to_string d) (Ladspa.type_to_string t) done;; 
     10  (Ladspa_raw.direction_to_string d) (Ladspa_raw.type_to_string t) done;; 
     11 
     12let r = Remix.create 44000 2 120.;; 
     13 
     14let h = Ladspa_raw.instantiate p (Remix.samplerate r);; 
     15 
     16let b = Ladspa_raw.empty_buffer 44000;; 
     17Ladspa_raw.connect_port p h 1 b;; 
     18 
     19let c = Ladspa_raw.control_value_to_buffer 1.0;; 
     20Ladspa_raw.connect_port p h 0 c;; 
     21 
     22Ladspa_raw.activate p h;; 
     23Ladspa_raw.run p h 44000;; 
     24 
     25let s = Ladspa_raw.buffers_to_raw_sound [| b; b |] 44000;; 
     26Sound.raw_preview r s;;  
  • ocaml-remix/trunk/sound.ml

    r493 r501  
    4343  Oss.sound_close dev;; 
    4444 
     45let raw_preview remix sound =  
     46  let dev = Oss.sound_open () in 
     47  Oss.sound_set_parms dev (Remix.channels remix) (Remix.samplerate remix); 
     48  Oss.sound_write dev sound; 
     49  Oss.sound_close dev;; 
  • ocaml-remix/trunk/sound.mli

    r493 r501  
    99 
    1010val preview : Remix.remix -> sound -> Time.extent -> Time.extent -> unit;; 
     11 
     12val raw_preview : Remix.remix -> raw_sound -> unit;;