1 /*----------------------------------------------------------------------------
2 ChucK Concurrent, On-the-fly Audio Programming Language
3 Compiler and Virtual Machine
5 Copyright (c) 2004 Ge Wang and Perry R. Cook. All rights reserved.
6 http://chuck.cs.princeton.edu/
7 http://soundlab.cs.princeton.edu/
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
23 -----------------------------------------------------------------------------*/
25 //-----------------------------------------------------------------------------
26 // file: util_buffers.cpp
27 // desc: buffer implementation
29 // author: Ge Wang (gewang@cs.princeton.edu)
30 // Perry R. Cook (prc@cs.princeton.edu)
31 //-----------------------------------------------------------------------------
32 #include "util_buffers.h"
38 //-----------------------------------------------------------------------------
41 //-----------------------------------------------------------------------------
45 m_data_width
= m_read_offset
= m_write_offset
= m_max_elem
= 0;
51 //-----------------------------------------------------------------------------
54 //-----------------------------------------------------------------------------
63 //-----------------------------------------------------------------------------
66 //-----------------------------------------------------------------------------
67 BOOL__
CBuffer::initialize( UINT__ num_elem
, UINT__ width
)
73 m_data
= (BYTE__
*)malloc( num_elem
* width
);
80 m_max_elem
= num_elem
;
88 //-----------------------------------------------------------------------------
91 //-----------------------------------------------------------------------------
92 void CBuffer::cleanup()
100 m_data_width
= m_read_offset
= m_write_offset
= m_max_elem
= 0;
106 //-----------------------------------------------------------------------------
109 //-----------------------------------------------------------------------------
110 void CBuffer::put( void * data
, UINT__ num_elem
)
113 BYTE__
* d
= (BYTE__
*)data
;
116 for( i
= 0; i
< num_elem
; i
++ )
118 for( j
= 0; j
< m_data_width
; j
++ )
120 m_data
[m_write_offset
*m_data_width
+j
] = d
[i
*m_data_width
+j
];
127 if( m_write_offset
>= m_max_elem
)
135 //-----------------------------------------------------------------------------
138 //-----------------------------------------------------------------------------
139 UINT__
CBuffer::get( void * data
, UINT__ num_elem
)
142 BYTE__
* d
= (BYTE__
*)data
;
144 // read catch up with write
145 if( m_read_offset
== m_write_offset
)
149 for( i
= 0; i
< num_elem
; i
++ )
151 for( j
= 0; j
< m_data_width
; j
++ )
153 d
[i
*m_data_width
+j
] = m_data
[m_read_offset
*m_data_width
+j
];
160 if( m_read_offset
== m_write_offset
)
167 if( m_read_offset
>= m_max_elem
)
171 // return number of elems