Show
Ignore:
Timestamp:
10/16/07 18:18:01 (1 year ago)
Author:
shans
Message:

Handle ladspa plugins that don't consume any inputs.
Convenience function for generating ladspa initialisation functions.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • ocaml-remix/trunk/plugin.ml

    r510 r511  
    44 
    55exception InappropriatePlugin 
     6 
     7let get_ports ladspa =  
     8  let ports = Ladspa_raw.port_count ladspa in 
     9  let rec _portdesc n =  
     10    if n = ports then [] 
     11    else (n, Ladspa_raw.port_descriptor ladspa n)::_portdesc (n + 1) in 
     12  _portdesc 0 
     13 
     14let set_control_value plugin handle port value =  
     15  let v = Ladspa_raw.control_value_to_buffer value in 
     16  Ladspa_raw.connect_port plugin handle port v;; 
     17 
     18let ladspa_init func ladspa handle = 
     19  let ports = get_ports ladspa in 
     20  let inControlPorts = List.filter (function (a,(b,c)) ->  
     21    b = Ladspa_raw.Input && c = Ladspa_raw.Control) ports in 
     22    List.iter (function p -> set_control_value ladspa handle p (func p))  
     23          (List.map fst inControlPorts); 
     24  let outControlPorts = List.filter (function (a,(b,c)) -> 
     25    b = Ladspa_raw.Output && c = Ladspa_raw.Control) ports in 
     26    List.iter (function p -> set_control_value ladspa handle p 0.0) 
     27          (List.map fst outControlPorts);; 
    628 
    729let from_ladspa_impl ladspa setup href insound remix extent render_extent = 
     
    3254        ) 
    3355      )) in 
    34   let ports = Ladspa_raw.port_count ladspa in 
    35   let rec _portdesc n =  
    36     if n = ports then [] 
    37     else (n, Ladspa_raw.port_descriptor ladspa n)::_portdesc (n + 1) in 
    38   let ports = _portdesc 0 in 
     56  let ports = get_ports ladspa in 
    3957  let inAudioPorts = List.filter (function (a,(b,c)) ->  
    4058        b = Ladspa_raw.Input && c = Ladspa_raw.Audio) ports in 
    4159  let outAudioPorts = List.filter (function (a,(b,c)) ->  
    4260        b = Ladspa_raw.Output && c = Ladspa_raw.Audio) ports in 
    43   if List.length inAudioPorts = 1 && List.length outAudioPorts = 1 then ( 
     61  let num_in = List.length inAudioPorts in 
     62  let num_out = List.length outAudioPorts in  
     63  let create_in_buffers n sound length = 
     64    let b = Array.init n (function _ -> Ladspa_raw.empty_buffer length) in 
     65    Ladspa_raw.raw_sound_to_buffers sound b length; b in 
     66  let create_out_buffers n length =  
     67    Array.init n (function _ -> Ladspa_raw.empty_buffer length) in 
     68  let connect portlist portpos h b i = 
     69    Ladspa_raw.connect_port ladspa h.(i) (fst (List.nth portlist portpos))  
     70              b.(i) in 
     71  if num_in = 1 && num_out = 1 then ( 
    4472    let raw_insound = insound remix extent render_extent in 
    4573    let channels = Remix.channels remix in 
    46     let buffers =  
    47       Array.init channels (function _ -> Ladspa_raw.empty_buffer raw_length) in 
    48     Ladspa_raw.raw_sound_to_buffers raw_insound buffers raw_length; 
    49     let outbuffers =  
    50       Array.init channels (function _ -> Ladspa_raw.empty_buffer raw_length) in 
     74    let buffers = create_in_buffers channels raw_insound raw_length in 
     75    let outbuffers = create_out_buffers channels raw_length in 
    5176    for i = 0 to (channels - 1) do ( 
    52       Ladspa_raw.connect_port ladspa handles.(i) (fst (List.hd inAudioPorts)) 
    53         buffers.(i); 
    54       Ladspa_raw.connect_port ladspa handles.(i) (fst (List.hd outAudioPorts)) 
    55         outbuffers.(i); 
     77      connect inAudioPorts 0 handles buffers i; 
     78      connect outAudioPorts 0 handles outbuffers i; 
     79      Ladspa_raw.run ladspa handles.(i) raw_length 
     80    ) done; 
     81    Ladspa_raw.buffers_to_raw_sound outbuffers raw_length 
     82  ) else if num_in = 0 && num_out = 1 then ( 
     83    let channels = Remix.channels remix in 
     84    let outbuffers = create_out_buffers channels raw_length in 
     85    for i = 0 to (channels - 1) do ( 
     86      connect outAudioPorts 0 handles outbuffers i; 
    5687      Ladspa_raw.run ladspa handles.(i) raw_length 
    5788    ) done; 
     
    6394  from_ladspa_impl ladspa setup href;; 
    6495 
     96