1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-07 07:12:34 +02:00

187 lines
4.0 KiB
C++

// -*- mode: c++ -*-
#ifndef SUBBAND_H
#define SUBBAND_H
#include "real.h"
#include "buffer.h"
#include "sms.h"
#include <stdio.h>
#include "config.h"
#ifdef MULTITHREADED
#include "pthread.h"
#endif
namespace _sbsms_ {
enum {
NDownSample = 256,
SDownSample = 4,
subBufSize = 512,
hSub = NDownSample/(2*SDownSample)
};
class SubBand {
public:
SubBand(SubBand *parent, int band, int channels, SBSMSQuality *quality, bool bSynthesize);
~SubBand();
long write(audio *buf, long n, float stretch, float pitch);
long read(audio *buf, long n);
long getInputFrameSize();
bool writeInit();
long analyzeInit(int,bool,long n=0);
long extractInit(int,bool);
long markInit(int,bool);
long assignInit(int,bool);
long trial2Init(int,bool);
long adjust2Init(bool);
long trial1Init(int,bool);
long adjust1Init(bool);
long renderInit(int,bool);
long writeFromFileInit(int,bool);
long readInit();
void analyze(int);
void extract(int);
void mark(int);
void assign(int);
void trial2(int);
void trial2Start(int);
void trial2Trial(int);
void trial2End(int);
void adjust2();
void trial1(int);
void trial1Start(int);
void trial1Trial(int);
void trial1End(int);
void adjust1();
void advance(int);
void render(int);
void assignStart(int c);
void assignInit(int c);
void assignFind(int c);
bool assignConnect(int c);
void assignStep(int c);
void splitMerge(int c);
void addRenderer(SBSMSRenderer *);
void removeRenderer(SBSMSRenderer *);
long renderSynchronous();
void renderComplete(const SampleCountType &samples);
void process(bool);
void stepAnalyzeFrame(int);
void stepExtractFrame(int);
void stepMarkFrame(int);
void stepAssignFrame(int);
void stepTrial2Frame(int);
void stepAdjust2Frame();
void stepTrial1Frame(int);
void stepAdjust1Frame();
void stepRenderFrame(int);
void stepReadFrame();
#ifdef MULTITHREADED
pthread_mutex_t dataMutex;
pthread_mutex_t grainMutex[3];
#endif
friend class SBSMSImp;
protected:
void resetNoRecurse();
long getFramesAtFront(int);
void readSubSamples();
void setStretch(float stretch);
void setPitch(float pitch);
int nMarkLatency;
int nAssignLatency;
int nTrial2Latency;
int nAdjust2Latency;
int nTrial1Latency;
int nAdjust1Latency;
int nRenderLatency;
int nWriteSlack;
int nExtractSlack;
int nAnalyzeSlack;
int nMarkSlack;
int nAssignSlack;
int nTrial2Slack;
int nAdjust2Slack;
int nTrial1Slack;
int nAdjust1Slack;
int nRenderSlack;
list<SBSMSRenderer*> renderers;
RingBuffer<float> stretchRender;
RingBuffer<float> pitchRender;
int inputFrameSize;
RingBuffer<int> outputFrameSize;
float totalSizef;
SBSMSQuality *quality;
int channels;
int N;
int h;
int band;
long nReadFromOutputFrame;
long nToWriteForGrain;
long res;
long resMask;
long nGrainsPerFrame;
long nToDrop0;
long nToDrop1;
long nToDrop2;
long nToPrepad1;
long nToPrepad0;
bool bSynthesize;
long nGrainsToAnalyze[3];
long nGrainsToExtract[2];
long nGrainsToMark[2];
long nGrainsToAssign[2];
long nGrainsToAdvance[2];
long nGrainsToTrial2[2];
long nGrainsToAdjust2;
long nGrainsToTrial1[2];
long nGrainsToAdjust1;
long nGrainsToRender[2];
long nGrainsWritten;
long nGrainsMarked[2];
long nGrainsAssigned[2];
long nGrainsTrialed2[2];
long nGrainsAdjusted2;
long nGrainsTrialed1[2];
long nGrainsAdjusted1;
long nGrainsAdvanced[2];
long nGrainsRendered[2];
long nGrainsRead;
long nFramesAnalyzed[3];
long nFramesExtracted[2];
long nFramesMarked[2];
long nFramesAssigned[2];
long nFramesTrialed2[2];
long nFramesAdjusted2;
long nFramesTrialed1[2];
long nFramesAdjusted1;
long nFramesRendered[2];
long nFramesRead;
SubBand *parent;
SubBand *sub;
SampleBufBase *outMixer;
SynthRenderer *synthRenderer;
SMS *sms;
SampleBuf *samplesSubIn;
SampleBuf *samplesSubOut;
GrainBuf *grains[3];
GrainBuf *analyzedGrains[3][2];
GrainBuf *grainsIn;
GrainAllocator *downSampledGrainAllocator;
};
}
#endif