root/ocaml-remix/trunk/sound.ml

Revision 529, 2.1 kB (checked in by shans, 1 year ago)

Replacing sound implementation - WAS ocaml int arrays, IS native float
arrays. This has not yet been completely been debugged!

Line 
1 (* a raw sound is an array of int values *)
2 type raw_sound = FB.buffer;;
3
4 (* but sounds have a start, a rendered start, and a rendered length *)
5 type sound = Remix.remix -> Time.time -> Time.extent -> raw_sound;;
6
7 let silence r e (s,l) =
8   let length = Time.time_to_raw_time r l in
9   FB.create length (Remix.channels r);;
10
11 (* note: length applies to raw sounds *)
12 let length = FB.length;;
13
14 let size = FB.size;;
15
16 (* note: ignore start time when writing raw sounds *)
17 let write_raw_sound r out snd =
18   IO.nwrite out "RIFF";
19   IO.write_i32 out ((size snd) * 2 + 36);
20   IO.nwrite out "WAVE";
21   IO.nwrite out "fmt "; (* format chunk *)
22   IO.write_i32 out 16;
23   IO.write_i16 out 1; (* no compression *)
24   IO.write_i16 out (Remix.channels r);
25   IO.write_i32 out (Remix.samplerate r);
26   IO.write_i32 out ((Remix.samplerate r) * (Remix.channels r) * 2);
27   IO.write_i16 out ((Remix.channels r) * 2); (* bytes per frame *)
28   IO.write_i16 out 16; (* bits per sample - always 16 *)
29   IO.nwrite out "data"; (* data chunk *)
30   IO.write_i32 out ((size snd) * 2);
31   for i = 0 to (size snd - 1) do IO.write_i16 out (FB.short_at snd i) done;;
32
33 let write output remix snd start render_extent =
34   let raw_sound = snd remix start render_extent in
35   write_raw_sound remix output raw_sound;;
36
37 let preview remix sound start (rstart,rlength) =
38   let raw_start = Time.time_to_raw_time remix rstart in
39   let raw_inc = Time.time_to_raw_time remix (Time.Seconds 0.2) in
40   let dev = Oss.sound_open () in
41   Oss.sound_set_parms dev (Remix.channels remix) (Remix.samplerate remix);
42   let t = ref raw_start in
43   let cond =
44     (
45       if rlength = Time.Forever
46       then (fun a -> true)
47       else (
48         let raw_length = Time.time_to_raw_time remix rlength in
49         fun a -> a < raw_length
50       )
51     ) in
52   while cond !t do (
53     Oss.sound_write dev
54         (sound remix start (Time.Samples !t, Time.Samples raw_inc));
55     t := !t + raw_inc) done;
56   Oss.sound_close dev;;
57
58 let raw_preview remix sound =
59   let dev = Oss.sound_open () in
60   Oss.sound_set_parms dev (Remix.channels remix) (Remix.samplerate remix);
61   Oss.sound_write dev sound;
62   Oss.sound_close dev;;
Note: See TracBrowser for help on using the browser.