diff options
Diffstat (limited to 'tools/zalsa/lfqueue.h')
-rw-r--r-- | tools/zalsa/lfqueue.h | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/tools/zalsa/lfqueue.h b/tools/zalsa/lfqueue.h new file mode 100644 index 00000000..3943d401 --- /dev/null +++ b/tools/zalsa/lfqueue.h @@ -0,0 +1,182 @@ +// ---------------------------------------------------------------------------- +// +// Copyright (C) 2012 Fons Adriaensen <fons@linuxaudio.org> +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +// +// ---------------------------------------------------------------------------- + + +#ifndef __LFQUEUE_H +#define __LFQUEUE_H + + +#include <stdint.h> +#include <string.h> + + +class Adata +{ +public: + + int32_t _state; + int32_t _nsamp; + double _timer; +}; + + +class Lfq_adata +{ +public: + + Lfq_adata (int size); + ~Lfq_adata (void); + + void reset (void) { _nwr = _nrd = 0; } + int size (void) const { return _size; } + + int wr_avail (void) const { return _size - _nwr + _nrd; } + Adata *wr_datap (void) { return _data + (_nwr & _mask); } + void wr_commit (void) { _nwr++; } + + int rd_avail (void) const { return _nwr - _nrd; } + Adata *rd_datap (void) { return _data + (_nrd & _mask); } + void rd_commit (void) { _nrd++; } + +private: + + Adata *_data; + int _size; + int _mask; + int _nwr; + int _nrd; +}; + + +class Jdata +{ +public: + + int32_t _state; + double _error; + double _ratio; + int _bstat; +}; + + +class Lfq_jdata +{ +public: + + Lfq_jdata (int size); + ~Lfq_jdata (void); + + void reset (void) { _nwr = _nrd = 0; } + int size (void) const { return _size; } + + int wr_avail (void) const { return _size - _nwr + _nrd; } + Jdata *wr_datap (void) { return _data + (_nwr & _mask); } + void wr_commit (void) { _nwr++; } + + int rd_avail (void) const { return _nwr - _nrd; } + Jdata *rd_datap (void) { return _data + (_nrd & _mask); } + void rd_commit (void) { _nrd++; } + +private: + + Jdata *_data; + int _size; + int _mask; + int _nwr; + int _nrd; +}; + + +class Lfq_int32 +{ +public: + + Lfq_int32 (int size); + ~Lfq_int32 (void); + + int size (void) const { return _size; } + void reset (void) { _nwr = _nrd = 0; } + + int wr_avail (void) const { return _size - _nwr + _nrd; } + int32_t *wr_datap (void) { return _data + (_nwr & _mask); } + void wr_commit (void) { _nwr++; } + + int rd_avail (void) const { return _nwr - _nrd; } + int32_t *rd_datap (void) { return _data + (_nrd & _mask); } + void rd_commit (void) { _nrd++; } + + void wr_int32 (int32_t v) { _data [_nwr++ & _mask] = v; } + void wr_uint32 (uint32_t v) { _data [_nwr++ & _mask] = v; } + void wr_float (float v) { *(float *)(_data + (_nwr++ & _mask)) = v; } + + int32_t rd_int32 (void) { return _data [_nrd++ & _mask]; } + int32_t rd_uint32 (void) { return _data [_nrd++ & _mask]; } + float rd_float (void) { return *(float *)(_data + (_nrd++ & _mask)); } + +private: + + int32_t *_data; + int _size; + int _mask; + int _nwr; + int _nrd; +}; + + +class Lfq_audio +{ +public: + + Lfq_audio (int nsamp, int nchan); + ~Lfq_audio (void); + + int size (void) const { return _size; } + void reset (void) + { + _nwr = _nrd = 0; + memset (_data, 0, _size * _nch * sizeof (float)); + } + + int nchan (void) const { return _nch; } + int nwr (void) const { return _nwr; }; + int nrd (void) const { return _nrd; }; + + int wr_avail (void) const { return _size - _nwr + _nrd; } + int wr_linav (void) const { return _size - (_nwr & _mask); } + float *wr_datap (void) { return _data + _nch * (_nwr & _mask); } + void wr_commit (int k) { _nwr += k; } + + int rd_avail (void) const { return _nwr - _nrd; } + int rd_linav (void) const { return _size - (_nrd & _mask); } + float *rd_datap (void) { return _data + _nch * (_nrd & _mask); } + void rd_commit (int k) { _nrd += k; } + +private: + + float *_data; + int _size; + int _mask; + int _nch; + int _nwr; + int _nrd; +}; + + +#endif + |