Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef TSOUND_T__INCLUDED
Toshihiro Shimizu 890ddd
#define TSOUND_T__INCLUDED
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tsoundsample.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef DVAPI
Toshihiro Shimizu 890ddd
#undef DVVAR
Toshihiro Shimizu 890ddd
#ifdef TSOUND_EXPORTS
Toshihiro Shimizu 890ddd
#define DVAPI DV_EXPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_EXPORT_VAR
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define DVAPI DV_IMPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_IMPORT_VAR
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
class DVAPI TSoundTrackT : public TSoundTrack
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	typedef T SampleType;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TSoundTrackT(TUINT32 sampleRate, int channelCount, TINT32 sampleCount)
Toshihiro Shimizu 890ddd
		: TSoundTrack(
Toshihiro Shimizu 890ddd
			  sampleRate, T::getBitPerSample(),
Toshihiro Shimizu 890ddd
			  channelCount, sizeof(T), sampleCount, T::isSampleSigned()) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TSoundTrackT(TUINT32 sampleRate,
Toshihiro Shimizu 890ddd
				 int channelCount,
Toshihiro Shimizu 890ddd
				 TINT32 sampleCount,
Toshihiro Shimizu 890ddd
				 T *buffer,
Toshihiro Shimizu 890ddd
				 TSoundTrackT<t> *parent)</t>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		: TSoundTrack(
Toshihiro Shimizu 890ddd
			  sampleRate, T::getBitPerSample(),
Toshihiro Shimizu 890ddd
			  channelCount, sizeof(T), sampleCount,
Toshihiro Shimizu 890ddd
			  reinterpret_cast<uchar *="">(buffer), parent)</uchar>
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	~TSoundTrackT(){};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool isSampleSigned() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return T::isSampleSigned();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns the const samples array
Toshihiro Shimizu 890ddd
	const T *samples() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return reinterpret_cast<t *="">(m_buffer);</t>
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns the samples array
Toshihiro Shimizu 890ddd
	T *samples()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return reinterpret_cast<t *="">(m_buffer);</t>
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns a soundtrack whom is a clone of the object
Toshihiro Shimizu 890ddd
	TSoundTrackP clone() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TSoundTrackP dst = TSoundTrack::create(getFormat(), m_sampleCount);
Toshihiro Shimizu 890ddd
		TSoundTrackP src(const_cast<tsoundtrack *="">((const TSoundTrack *)this));</tsoundtrack>
Toshihiro Shimizu 890ddd
		dst->copy(src, (TINT32)0);
Toshihiro Shimizu 890ddd
		return dst;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Extract the subtrack in the samples range [s0,s1] given in samples
Toshihiro Shimizu 890ddd
	TSoundTrackP extract(TINT32 s0, TINT32 s1)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (!m_buffer || s0 > s1)
Toshihiro Shimizu 890ddd
			return TSoundTrackP();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		//addRef();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TINT32 ss0, ss1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		ss0 = tcrop<tint32>(s0, (TINT32)0, getSampleCount() - 1);</tint32>
Toshihiro Shimizu 890ddd
		ss1 = tcrop<tint32>(s1, (TINT32)0, getSampleCount() - 1);</tint32>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		return TSoundTrackP(
Toshihiro Shimizu 890ddd
			new TSoundTrackT<t>(</t>
Toshihiro Shimizu 890ddd
				getSampleRate(), getChannelCount(), ss1 - ss0 + 1,
Toshihiro Shimizu 890ddd
				(T *)(m_buffer + (long)(ss0 * getSampleSize())), this));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
    Returns a soundtrack whom is a clone of the object for the spicified channel
Toshihiro Shimizu 890ddd
    A clone means that it's an object who lives indipendently from the other
Toshihiro Shimizu 890ddd
    from which it's created.It hasn't reference to the object.
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	TSoundTrackP clone(TSound::Channel chan) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (getChannelCount() == 1)
Toshihiro Shimizu 890ddd
			return clone();
Toshihiro Shimizu 890ddd
		else {
Toshihiro Shimizu 890ddd
			typedef typename T::ChannelSampleType TCST;
Toshihiro Shimizu 890ddd
			TSoundTrackT<tcst> *dst =</tcst>
Toshihiro Shimizu 890ddd
				new TSoundTrackT<tcst>(m_sampleRate, 1, getSampleCount());</tcst>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			const T *sample = samples();
Toshihiro Shimizu 890ddd
			const T *endSample = sample + getSampleCount();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			TCST *dstSample = dst->samples();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			while (sample < endSample) {
Toshihiro Shimizu 890ddd
				*dstSample++ = sample->getValue(chan);
Toshihiro Shimizu 890ddd
				sample++;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			return dst;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Copies from sample dst_s0 of object the samples of the soundtrack src
Toshihiro Shimizu 890ddd
	void copy(const TSoundTrackP &src, TINT32 dst_s0)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TSoundTrackT<t> *srcT = dynamic_cast<tsoundtrackt<t> *>(src.getPointer());</tsoundtrackt<t></t>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (!srcT)
Toshihiro Shimizu 890ddd
			throw(TException("Unable to copy from a track whose format is different"));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		T *srcSample = srcT->samples();
Toshihiro Shimizu 890ddd
		T *srcEndSample = srcT->samples() + srcT->getSampleCount();
Toshihiro Shimizu 890ddd
		T *dstEndSample = samples() + getSampleCount();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TINT32 ss0 = tcrop<tint32>(dst_s0, (TINT32)0, getSampleCount() - (TINT32)1);</tint32>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		T *dstSample = samples() + ss0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		while (srcSample < srcEndSample && dstSample < dstEndSample)
Toshihiro Shimizu 890ddd
			*dstSample++ = *srcSample++;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//!Applies a trasformation (echo, reverb, ect) to the object and returns the transformed soundtrack
Campbell Barton 107701
#if defined(MACOSX) || defined(LINUX)
Toshihiro Shimizu 890ddd
	TSoundTrackP apply(TSoundTransform *transform);
Campbell Barton 107701
#else // WIN32
Toshihiro Shimizu 890ddd
	TSoundTrackP apply(TSoundTransform *transform)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		assert(transform);
Toshihiro Shimizu 890ddd
		return transform->compute(*this);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Returns the pressure of the sample s about the channel chan
Toshihiro Shimizu 890ddd
	double getPressure(TINT32 s, TSound::Channel chan) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		assert(s >= 0 && s < getSampleCount());
Toshihiro Shimizu 890ddd
		assert(m_buffer);
Toshihiro Shimizu 890ddd
		const T *sample = samples() + s;
Toshihiro Shimizu 890ddd
		assert(sample);
Toshihiro Shimizu 890ddd
		return sample->getPressure(chan);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns the soundtrack pressure max and min values in the given sample range and channel
Toshihiro Shimizu 890ddd
	void getMinMaxPressure(
Toshihiro Shimizu 890ddd
		TINT32 s0, TINT32 s1, TSound::Channel chan,
Toshihiro Shimizu 890ddd
		double &min, double &max) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TINT32 sampleCount = getSampleCount();
Toshihiro Shimizu 890ddd
		if (sampleCount <= 0) {
Toshihiro Shimizu 890ddd
			min = 0;
Toshihiro Shimizu 890ddd
			max = -1;
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		assert(s1 >= s0);
Toshihiro Shimizu 890ddd
		TINT32 ss0, ss1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		ss0 = tcrop<tint32>(s0, (TINT32)0, sampleCount - (TINT32)1);</tint32>
Toshihiro Shimizu 890ddd
		ss1 = tcrop<tint32>(s1, (TINT32)0, sampleCount - (TINT32)1);</tint32>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		assert(ss1 >= ss0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (s0 == s1) {
Toshihiro Shimizu 890ddd
			min = max = getPressure(s0, chan);
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		const T *sample = samples() + ss0;
Toshihiro Shimizu 890ddd
		assert(sample);
Toshihiro Shimizu 890ddd
		min = max = sample->getPressure(chan);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		const T *endSample = sample + (ss1 - ss0 + 1);
Toshihiro Shimizu 890ddd
		++sample;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		while (sample < endSample) {
Toshihiro Shimizu 890ddd
			double value = sample->getPressure(chan);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (max < value)
Toshihiro Shimizu 890ddd
				max = value;
Toshihiro Shimizu 890ddd
			if (min > value)
Toshihiro Shimizu 890ddd
				min = value;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			++sample;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns the soundtrack pressure max value in the given sample range and channel
Toshihiro Shimizu 890ddd
	double getMaxPressure(TINT32 s0, TINT32 s1, TSound::Channel chan) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TINT32 sampleCount = getSampleCount();
Toshihiro Shimizu 890ddd
		if (sampleCount <= 0) {
Toshihiro Shimizu 890ddd
			return -1;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		assert(s1 >= s0);
Toshihiro Shimizu 890ddd
		TINT32 ss0, ss1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		ss0 = tcrop<tint32>(s0, (TINT32)0, sampleCount - (TINT32)1);</tint32>
Toshihiro Shimizu 890ddd
		ss1 = tcrop<tint32>(s1, (TINT32)0, sampleCount - (TINT32)1);</tint32>
Toshihiro Shimizu 890ddd
		assert(ss1 >= ss0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (s0 == s1)
Toshihiro Shimizu 890ddd
			return (getPressure(s0, chan));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		const T *sample = samples() + ss0;
Toshihiro Shimizu 890ddd
		assert(sample);
Toshihiro Shimizu 890ddd
		double maxPressure = sample->getPressure(chan);
Toshihiro Shimizu 890ddd
		const T *endSample = sample + (ss1 - ss0 + 1);
Toshihiro Shimizu 890ddd
		++sample;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		while (sample < endSample) {
Toshihiro Shimizu 890ddd
			if (maxPressure < sample->getPressure(chan))
Toshihiro Shimizu 890ddd
				maxPressure = sample->getPressure(chan);
Toshihiro Shimizu 890ddd
			++sample;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		return ((double)maxPressure);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns the soundtrack pressure min value in the given sample range and channel
Toshihiro Shimizu 890ddd
	double getMinPressure(TINT32 s0, TINT32 s1, TSound::Channel chan) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TINT32 sampleCount = getSampleCount();
Toshihiro Shimizu 890ddd
		if (sampleCount <= 0) {
Toshihiro Shimizu 890ddd
			return 0;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		assert(s1 >= s0);
Toshihiro Shimizu 890ddd
		TINT32 ss0, ss1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		ss0 = tcrop<tint32>(s0, (TINT32)0, (TINT32)(getSampleCount() - (TINT32)1));</tint32>
Toshihiro Shimizu 890ddd
		ss1 = tcrop<tint32>(s1, (TINT32)0, (TINT32)(getSampleCount() - (TINT32)1));</tint32>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		assert(ss1 >= ss0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (s0 == s1)
Toshihiro Shimizu 890ddd
			return (getPressure(s0, chan));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		const T *sample = samples() + ss0;
Toshihiro Shimizu 890ddd
		assert(sample);
Toshihiro Shimizu 890ddd
		double minPressure = sample->getPressure(chan);
Toshihiro Shimizu 890ddd
		const T *endSample = sample + (ss1 - ss0 + 1);
Toshihiro Shimizu 890ddd
		++sample;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		while (sample < endSample) {
Toshihiro Shimizu 890ddd
			if (minPressure > sample->getPressure(chan))
Toshihiro Shimizu 890ddd
				minPressure = sample->getPressure(chan);
Toshihiro Shimizu 890ddd
			++sample;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		return ((double)minPressure);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
    Copies the samples in the given sample range and channel
Toshihiro Shimizu 890ddd
    inside the dstChan channel from sample dst_s0
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	void copyChannel(
Toshihiro Shimizu 890ddd
		const TSoundTrackT<t> &src, TINT32 src_s0, TINT32 src_s1,</t>
Toshihiro Shimizu 890ddd
		TSound::Channel srcChan, TINT32 dst_s0,
Toshihiro Shimizu 890ddd
		TSound::Channel dstChan)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TINT32 ss0, ss1;
Toshihiro Shimizu 890ddd
		//se i valori sono nel range ed uguali => voglio copiare il
Toshihiro Shimizu 890ddd
		//canale di un solo campione
Toshihiro Shimizu 890ddd
		if (src_s1 == src_s0 && src_s1 >= 0 && src_s1 < src.getSampleCount())
Toshihiro Shimizu 890ddd
			ss0 = ss1 = src_s1;
Toshihiro Shimizu 890ddd
		else {
Toshihiro Shimizu 890ddd
			assert(src_s1 >= src_s0);
Toshihiro Shimizu 890ddd
			ss0 = tcrop(src_s0, (TINT32)0, (TINT32)(src.getSampleCount() - 1));
Toshihiro Shimizu 890ddd
			ss1 = tcrop(src_s1, (TINT32)0, (TINT32)(src.getSampleCount() - 1));
Toshihiro Shimizu 890ddd
			assert(ss1 >= ss0);
Toshihiro Shimizu 890ddd
			//esco perche' non ha senso copiare indiscriminatamente il primo
Toshihiro Shimizu 890ddd
			//o l'ultimo campione della sorgente
Toshihiro Shimizu 890ddd
			if (ss1 == ss0)
Toshihiro Shimizu 890ddd
				return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		assert(dst_s0 >= 0L && dst_s0 < getSampleCount());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		const T *srcSample = src.samples() + ss0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		const T *srcEndSample =
Toshihiro Shimizu 890ddd
			srcSample + tmin((TINT32)(ss1 - ss0 + 1), (TINT32)(getSampleCount() - dst_s0));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		T *dstSample = samples() + dst_s0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		for (; srcSample < srcEndSample; srcSample++, dstSample++)
Toshihiro Shimizu 890ddd
			dstSample->setValue(srcChan, srcSample->getValue(dstChan));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Makes blank the samples in the given sample range
Toshihiro Shimizu 890ddd
	void blank(TINT32 s0, TINT32 s1)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TINT32 ss0, ss1;
Toshihiro Shimizu 890ddd
		//se i valori sono nel range ed uguali => voglio pulire
Toshihiro Shimizu 890ddd
		//un solo campione
Toshihiro Shimizu 890ddd
		if (s1 == s0 && s1 >= 0 && s1 < getSampleCount())
Toshihiro Shimizu 890ddd
			ss0 = ss1 = s1;
Toshihiro Shimizu 890ddd
		else {
Toshihiro Shimizu 890ddd
			assert(s1 >= s0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			ss0 = tcrop<tint32>(s0, (TINT32)0, (TINT32)(getSampleCount() - 1));</tint32>
Toshihiro Shimizu 890ddd
			ss1 = tcrop<tint32>(s1, (TINT32)0, (TINT32)(getSampleCount() - 1));</tint32>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			assert(ss1 >= ss0);
Toshihiro Shimizu 890ddd
			//esco perche' non ha senso pulire indiscriminatamente
Toshihiro Shimizu 890ddd
			//il primo o l'ultimo campione
Toshihiro Shimizu 890ddd
			if (ss1 == ss0)
Toshihiro Shimizu 890ddd
				return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		T *sample = samples() + ss0;
Toshihiro Shimizu 890ddd
		assert(sample);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		T blankSample;
Toshihiro Shimizu 890ddd
		const T *endSample = sample + (ss1 - ss0 + 1);
Toshihiro Shimizu 890ddd
		while (sample < endSample)
Toshihiro Shimizu 890ddd
			*sample++ = blankSample;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Makes blank the samples in the given sample range and channel
Toshihiro Shimizu 890ddd
	void blankChannel(TINT32 s0, TINT32 s1, TSound::Channel chan)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (s0 > s1)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		// ....
Toshihiro Shimizu 890ddd
		assert(false);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
template class DVAPI TSoundTrackT<tmono8signedsample>;</tmono8signedsample>
Toshihiro Shimizu 890ddd
template class DVAPI TSoundTrackT<tmono8unsignedsample>;</tmono8unsignedsample>
Toshihiro Shimizu 890ddd
template class DVAPI TSoundTrackT<tstereo8signedsample>;</tstereo8signedsample>
Toshihiro Shimizu 890ddd
template class DVAPI TSoundTrackT<tstereo8unsignedsample>;</tstereo8unsignedsample>
Toshihiro Shimizu 890ddd
template class DVAPI TSoundTrackT<tmono16sample>;</tmono16sample>
Toshihiro Shimizu 890ddd
template class DVAPI TSoundTrackT<tstereo16sample>;</tstereo16sample>
Toshihiro Shimizu 890ddd
template class DVAPI TSoundTrackT<tmono24sample>;</tmono24sample>
Toshihiro Shimizu 890ddd
template class DVAPI TSoundTrackT<tstereo24sample>;</tstereo24sample>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
typedef TSoundTrackT<tmono8signedsample> TSoundTrackMono8Signed;</tmono8signedsample>
Toshihiro Shimizu 890ddd
typedef TSoundTrackT<tmono8unsignedsample> TSoundTrackMono8Unsigned;</tmono8unsignedsample>
Toshihiro Shimizu 890ddd
typedef TSoundTrackT<tstereo8signedsample> TSoundTrackStereo8Signed;</tstereo8signedsample>
Toshihiro Shimizu 890ddd
typedef TSoundTrackT<tstereo8unsignedsample> TSoundTrackStereo8Unsigned;</tstereo8unsignedsample>
Toshihiro Shimizu 890ddd
typedef TSoundTrackT<tmono16sample> TSoundTrackMono16;</tmono16sample>
Toshihiro Shimizu 890ddd
typedef TSoundTrackT<tstereo16sample> TSoundTrackStereo16;</tstereo16sample>
Toshihiro Shimizu 890ddd
typedef TSoundTrackT<tmono24sample> TSoundTrackMono24;</tmono24sample>
Toshihiro Shimizu 890ddd
typedef TSoundTrackT<tstereo24sample> TSoundTrackStereo24;</tstereo24sample>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TSoundTransform
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TSoundTransform() {}
Toshihiro Shimizu 890ddd
	virtual ~TSoundTransform() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual TSoundTrackP compute(const TSoundTrackMono8Signed &) { return 0; };
Toshihiro Shimizu 890ddd
	virtual TSoundTrackP compute(const TSoundTrackMono8Unsigned &) { return 0; };
Toshihiro Shimizu 890ddd
	virtual TSoundTrackP compute(const TSoundTrackStereo8Signed &) { return 0; };
Toshihiro Shimizu 890ddd
	virtual TSoundTrackP compute(const TSoundTrackStereo8Unsigned &) { return 0; };
Toshihiro Shimizu 890ddd
	virtual TSoundTrackP compute(const TSoundTrackMono16 &) { return 0; };
Toshihiro Shimizu 890ddd
	virtual TSoundTrackP compute(const TSoundTrackStereo16 &) { return 0; };
Toshihiro Shimizu 890ddd
	virtual TSoundTrackP compute(const TSoundTrackMono24 &) { return 0; };
Toshihiro Shimizu 890ddd
	virtual TSoundTrackP compute(const TSoundTrackStereo24 &) { return 0; };
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
#ifdef MACOSX
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
DVAPI TSoundTrackP TSoundTrackT<t>::apply(TSoundTransform *transform)</t>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(transform);
Toshihiro Shimizu 890ddd
	return transform->compute(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
#endif