mirror of
https://github.com/cookiengineer/audacity
synced 2025-05-10 06:01:09 +02:00
173 lines
4.1 KiB
C++
173 lines
4.1 KiB
C++
#ifndef SBSMS_INCLUDE
|
|
#define SBSMS_INCLUDE
|
|
|
|
#include <stdio.h>
|
|
|
|
#define SBSMS_REAL_FLOAT 1
|
|
|
|
namespace _sbsms_ {
|
|
typedef float real;
|
|
typedef real interleaved[2];
|
|
typedef interleaved audio;
|
|
|
|
struct sbsms_quality {
|
|
long inframesize;
|
|
long maxoutframesize;
|
|
real minrate;
|
|
real maxrate;
|
|
int bands;
|
|
int M_MAX;
|
|
int H[5];
|
|
int N[8];
|
|
int S[8];
|
|
int res[8];
|
|
real pad[8];
|
|
real P[8];
|
|
real Q[8];
|
|
};
|
|
|
|
extern const sbsms_quality sbsms_quality_standard;
|
|
extern const sbsms_quality sbsms_quality_fast;
|
|
|
|
struct sbsms_resample_frame {
|
|
real ratio0;
|
|
real ratio1;
|
|
audio *in;
|
|
long size;
|
|
};
|
|
|
|
typedef long (*sbsms_cb)(audio *buf, long n, void *data);
|
|
typedef real (*sbsms_rate_cb)(long nProcessed, void *data);
|
|
typedef real (*sbsms_pitch_cb)(long nProcessed, void *data);
|
|
typedef long (*sbsms_resample_cb)(void *cb_data, sbsms_resample_frame *frame);
|
|
|
|
class subband;
|
|
class TrackAllocator;
|
|
class PeakAllocator;
|
|
|
|
struct sbsms {
|
|
FILE *fp;
|
|
sbsms_cb getSamplesCB;
|
|
sbsms_rate_cb getRateCB;
|
|
sbsms_pitch_cb getPitchCB;
|
|
subband *top;
|
|
TrackAllocator *ta;
|
|
PeakAllocator *pa;
|
|
long n_prepad, n_postpad, n_prespent, n_processed;
|
|
bool bWritingComplete;
|
|
sbsms_quality quality;
|
|
int channels;
|
|
audio *ina;
|
|
void *threadData;
|
|
};
|
|
|
|
class SampleBufBase {
|
|
public:
|
|
SampleBufBase() {};
|
|
virtual ~SampleBufBase() {};
|
|
virtual long read(audio *buf, long n)=0;
|
|
virtual void advance(long n)=0;
|
|
virtual long n_readable()=0;
|
|
};
|
|
|
|
class grain;
|
|
|
|
class SampleBuf {
|
|
public:
|
|
//SampleBuf() {};
|
|
SampleBuf(int N);
|
|
SampleBuf(int N, long delay);
|
|
void init(int N, long delay);
|
|
void clear();
|
|
virtual ~SampleBuf();
|
|
|
|
void grow(long pos);
|
|
long write(audio *buf, long n);
|
|
long write(grain* g, int h);
|
|
virtual long read(audio *buf, long n);
|
|
virtual void advance(long n);
|
|
virtual long n_readable();
|
|
audio *getReadBuf();
|
|
|
|
long readPos, writePos;
|
|
long delay;
|
|
|
|
int N;
|
|
long length;
|
|
audio *buf;
|
|
};
|
|
|
|
class Resampler {
|
|
public:
|
|
Resampler(sbsms_resample_cb func, void *data);
|
|
Resampler(SampleBuf *in, real pitch);
|
|
~Resampler();
|
|
long read(audio *audioOut, long frames);
|
|
void writingComplete();
|
|
void reset();
|
|
void init();
|
|
long samplesInOutput();
|
|
|
|
protected:
|
|
sbsms_resample_frame frame;
|
|
long startAbs;
|
|
long midAbs;
|
|
real midAbsf;
|
|
long endAbs;
|
|
long writePosAbs;
|
|
bool bInput;
|
|
SampleBuf *out;
|
|
sbsms_resample_cb cb;
|
|
void *data;
|
|
bool bPull;
|
|
SampleBuf *in;
|
|
long inOffset;
|
|
real sincZeros;
|
|
bool bWritingComplete;
|
|
};
|
|
|
|
void sbsms_init(int n);
|
|
void sbsms_reset(sbsms *sbsmser);
|
|
void sbsms_seek(sbsms *sbsmser, long framePos, long samplePos);
|
|
sbsms* sbsms_create(sbsms_cb getSamplesCB, sbsms_rate_cb getRateCB, sbsms_pitch_cb getPitchCB, int channels, sbsms_quality *quality, bool bPreAnalyze, bool bSynthesize);
|
|
sbsms* sbsms_create(FILE *fp, sbsms_rate_cb getRateCB, sbsms_pitch_cb getPitchCB);
|
|
void sbsms_destroy(sbsms* sbsmser);
|
|
long sbsms_read_frame(audio *out, void *data, sbsms *sbsmer, real *pitch0, real *pitch1);
|
|
long sbsms_write_frame(FILE *fp, void *data, sbsms *sbsmser);
|
|
long sbsms_samples_processed(sbsms *sbsmser);
|
|
long sbsms_pre_analyze(sbsms_cb getSamplesCB, void *data, sbsms *sbsmser);
|
|
void sbsms_pre_analyze_complete(sbsms *sbsmser);
|
|
|
|
long sbsms_get_samples_queued(sbsms *sbsmser);
|
|
long sbsms_get_frames_queued(sbsms *sbsmser);
|
|
long sbsms_get_last_input_frame_size(sbsms *sbsmser);
|
|
long sbsms_get_frame_pos(sbsms *sbsmser);
|
|
|
|
void sbsms_close_write(FILE *fp, sbsms *sbsmser);
|
|
FILE *sbsms_open_write(const char *fileName, sbsms *sbsmser, long samples_to_process);
|
|
void sbsms_close_read(FILE *fp);
|
|
FILE *sbsms_open_read(const char *fileName);
|
|
long sbsms_get_samples_to_process(FILE *fp);
|
|
long sbsms_get_frames_to_process(FILE *fp);
|
|
long sbsms_get_channels(FILE *fp);
|
|
void sbsms_get_quality(FILE *fp, sbsms_quality *quality);
|
|
void sbsms_seek_start_data(FILE *fp);
|
|
|
|
struct sbsmsInfo {
|
|
real rate0, rate1;
|
|
real pitch0, pitch1;
|
|
long samplesToProcess;
|
|
long samplesToGenerate;
|
|
Resampler *rs;
|
|
};
|
|
|
|
long getLinearOutputSamples(sbsmsInfo *si);
|
|
real rateCBLinear(long nProcessed, void *userData);
|
|
real rateCBConstant(long nProcessed, void *userData);
|
|
real pitchCBLinear(long nProcessed, void *userData);
|
|
real pitchCBConstant(long nProcessed, void *userData);
|
|
|
|
}
|
|
|
|
#endif
|