paulxstretch/Source/PS_Source/Input/InputS.h

96 lines
2.6 KiB
C
Raw Normal View History

2017-11-13 15:06:08 +00:00
/*
Copyright (C) 2006-2011 Nasca Octavian Paul
Author: Nasca Octavian Paul
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License
as published by the Free Software Foundation.
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 (version 2) for more details.
You should have received a copy of the GNU General Public License (version 2)
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#pragma once
#include "../globals.h"
#include "../JuceLibraryCode/JuceHeader.h"
class InputS
{
public:
InputS()
{
skipbufsize=1024;
skipbuf.setSize(1, skipbufsize);
2017-11-13 15:06:08 +00:00
};
virtual ~InputS()
{
};
virtual bool openAudioFile(File file)=0;
virtual void close()=0;
virtual int readNextBlock(AudioBuffer<float>& abuf, int smps, int numchans)=0;
void skip(int nsmps)
{
while ((nsmps>0)&&(m_silenceoutputted<1))
{
int readsize=(nsmps<skipbufsize)?nsmps:skipbufsize;
if (skipbuf.getNumSamples() < readsize)
skipbuf.setSize(1, readsize);
readNextBlock(skipbuf,readsize,1);
2017-11-13 15:06:08 +00:00
nsmps-=readsize;
};
};
virtual void seek(double pos, bool immediate)=0;//0=start,1.0=end
2017-11-13 15:06:08 +00:00
struct {
int64_t nsamples=0;
int nchannels=0;
int samplerate=0;
} info;
int getSilenceOutputtedAfterActiveRange()
{
return m_silenceoutputted;
}
Range<double> getActiveRange() { return m_activerange; }
double getLengthSeconds()
{
if (info.nsamples == 0 || info.samplerate==0)
return 0.0;
return (double)info.nsamples / info.samplerate;
}
virtual void setActiveRange(Range<double> rng) = 0;
bool isLooping() { return m_loop_enabled; }
virtual void setLoopEnabled(bool b) = 0;
int64_t getCurrentPosition() { return m_currentsample; }
double getCurrentPositionPercent() { return 1.0 / info.nsamples*m_currentsample; }
2017-11-13 15:06:08 +00:00
virtual bool hasEnded()
{
return m_currentsample >= info.nsamples*m_activerange.getEnd();
}
virtual AudioBuffer<float>* getAudioBuffer()=0;
int64_t getDiskReadSampleCount() { return m_disk_read_count; }
2017-11-13 15:06:08 +00:00
protected:
volatile int64_t m_currentsample = 0;
2017-11-13 15:06:08 +00:00
int m_silenceoutputted = 0;
bool m_loop_enabled = false;
Range<double> m_activerange{ 0.0,1.0 };
int64_t m_disk_read_count = 0;
2017-11-13 15:06:08 +00:00
private:
int skipbufsize;
AudioBuffer<float> skipbuf;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(InputS)
};