1 ! Copyright (C) 2008 Alex Chapman
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors alien.c-types combinators kernel locals math
4 math.ranges openal sequences sequences.merged specialized-arrays ;
5 FROM: alien.c-types => short ;
6 SPECIALIZED-ARRAY: uchar
7 SPECIALIZED-ARRAY: short
10 TUPLE: buffer sample-freq 8bit? id ;
12 : <buffer> ( sample-freq 8bit? -- buffer )
15 TUPLE: mono-buffer < buffer data ;
17 : <mono-buffer> ( sample-freq 8bit? -- buffer )
20 : <8bit-mono-buffer> ( sample-freq -- buffer ) t <mono-buffer> ;
21 : <16bit-mono-buffer> ( sample-freq -- buffer ) f <mono-buffer> ;
23 TUPLE: stereo-buffer < buffer left-data right-data ;
25 : <stereo-buffer> ( sample-freq 8bit? -- buffer )
26 f f f stereo-buffer boa ;
28 : <8bit-stereo-buffer> ( sample-freq -- buffer ) t <stereo-buffer> ;
29 : <16bit-stereo-buffer> ( sample-freq -- buffer ) f <stereo-buffer> ;
31 PREDICATE: 8bit-buffer < buffer 8bit?>> ;
32 PREDICATE: 16bit-buffer < buffer 8bit?>> not ;
33 INTERSECTION: 8bit-mono-buffer 8bit-buffer mono-buffer ;
34 INTERSECTION: 16bit-mono-buffer 16bit-buffer mono-buffer ;
35 INTERSECTION: 8bit-stereo-buffer 8bit-buffer stereo-buffer ;
36 INTERSECTION: 16bit-stereo-buffer 16bit-buffer stereo-buffer ;
38 GENERIC: buffer-format ( buffer -- format )
39 M: 8bit-mono-buffer buffer-format drop AL_FORMAT_MONO8 ;
40 M: 16bit-mono-buffer buffer-format drop AL_FORMAT_MONO16 ;
41 M: 8bit-stereo-buffer buffer-format drop AL_FORMAT_STEREO8 ;
42 M: 16bit-stereo-buffer buffer-format drop AL_FORMAT_STEREO16 ;
44 : 8bit-buffer-data ( seq -- data size )
45 [ 128 * >integer 128 + ] uchar-array{ } map-as [ underlying>> ] [ length ] bi ;
47 : 16bit-buffer-data ( seq -- data size )
48 [ 32768 * >integer ] short-array{ } map-as [ underlying>> ] [ byte-length ] bi ;
50 : stereo-data ( stereo-buffer -- left right )
51 [ left-data>> ] [ right-data>> ] bi@ ;
53 : interleaved-stereo-data ( stereo-buffer -- data )
54 stereo-data <2merged> ;
56 GENERIC: buffer-data ( buffer -- data size )
57 M: 8bit-mono-buffer buffer-data data>> 8bit-buffer-data ;
58 M: 16bit-mono-buffer buffer-data data>> 16bit-buffer-data ;
59 M: 8bit-stereo-buffer buffer-data
60 interleaved-stereo-data 8bit-buffer-data ;
61 M: 16bit-stereo-buffer buffer-data
62 interleaved-stereo-data 16bit-buffer-data ;
64 CONSTANT: telephone-sample-freq 8000
65 CONSTANT: half-sample-freq 22050
66 CONSTANT: cd-sample-freq 44100
67 CONSTANT: digital-sample-freq 48000
68 CONSTANT: professional-sample-freq 88200
70 : send-buffer ( buffer -- buffer )
72 [ gen-buffer dup [ >>id ] dip ]
75 [ sample-freq>> alBufferData ]
78 : ?send-buffer ( buffer -- buffer )
79 dup id>> [ send-buffer ] unless ;