1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-12-13 08:06:32 +01:00
Files
audacity/lib-src/sbsms/src/buffer.h
2010-01-24 09:19:39 +00:00

167 lines
2.6 KiB
C++

#ifndef BUFFER_H
#define BUFFER_H
#include <assert.h>
#include <cstring>
#include <cstdlib>
#include "sbsms.h"
#include "grain.h"
#include "trackpoint.h"
#include <list>
using namespace std;
namespace _sbsms_ {
typedef list<trackpoint*> tplist;
template <class T>
class RingBuffer {
public:
RingBuffer();
~RingBuffer();
long write(T a);
T read(long k);
long n_readable();
void advance(long n);
void clear();
long readPos;
long writePos;
protected:
T *buf;
long length;
};
#define INIT_RINGBUF_LENGTH 128
/********************
RingBuffer
********************/
template <class T>
RingBuffer<T> :: RingBuffer()
{
length = INIT_RINGBUF_LENGTH;
buf = (T*) calloc(2*length,sizeof(T));
readPos = 0;
writePos = 0;
}
template <class T>
RingBuffer<T> :: ~RingBuffer()
{
free(buf);
}
template <class T>
long RingBuffer<T> :: write(T a)
{
if(writePos >= 2*length) {
length *= 2;
T *newBuf = (T*) calloc(2*length,sizeof(T));
memcpy(newBuf,buf+readPos,(writePos-readPos)*sizeof(T));
free(buf);
buf = newBuf;
writePos -= readPos;
readPos = 0;
}
buf[writePos++] = a;
return 1;
}
template <class T>
T RingBuffer<T> :: read(long k)
{
return buf[k];
}
template <class T>
long RingBuffer<T> :: n_readable()
{
return writePos-readPos;
}
template <class T>
void RingBuffer<T> :: advance(long n)
{
assert(readPos+n <= writePos);
readPos += n;
if(readPos >= length) {
memcpy(buf,buf+readPos,(writePos-readPos)*sizeof(T));
writePos = writePos - readPos;
readPos = 0;
}
}
template <class T>
void RingBuffer<T> :: clear()
{
readPos = 0;
writePos = 0;
}
class TrackPointListBuffer {
public:
TrackPointListBuffer();
~TrackPointListBuffer();
long write(tplist *tpl);
tplist *read(long k);
long n_readable();
void advance(long n);
long readPos;
long writePos;
protected:
tplist **buf;
long length;
};
class GrainBuf {
public:
GrainBuf(int N, int h);
GrainBuf(int N, int h, real pad, int type);
~GrainBuf();
void init(int N, int h, real pad, int type);
long write(audio *buf, long n);
void write(grain *g);
void advance(long n);
long n_readable() { return writePos - readPos; }
void clear();
grain* read(long k);
long length;
long readPos, writePos;
int N,h,wintype;
real pad;
protected:
void convert(audio *buf);
audio *iBuf;
long iBufWritePos;
grain **buf;
};
class Mixer : public SampleBufBase {
public:
Mixer(SampleBufBase *, SampleBuf *);
long read(audio *buf, long n);
void advance(long n);
long n_readable();
~Mixer() {}
protected:
SampleBuf *buf;
SampleBufBase *b1;
SampleBuf *b2;
};
}
#endif