Shinya Kitaoka 810553
#pragma once
Shinya Kitaoka 810553
Toshihiro Shimizu 890ddd
#ifndef TSOUND_INCLUDED
Toshihiro Shimizu 890ddd
#define TSOUND_INCLUDED
Toshihiro Shimizu 890ddd
Shinya Kitaoka 262a92
#include <memory></memory>
Shinya Kitaoka 262a92
Toshihiro Shimizu 890ddd
#include "tsmartpointer.h"
Toshihiro Shimizu 890ddd
#include "texception.h"
Toshihiro Shimizu 890ddd
#include "tthreadmessage.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
namespace TSound
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
typedef UCHAR Channel;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
const int MONO = 0;
Toshihiro Shimizu 890ddd
const int LEFT = 0;
Toshihiro Shimizu 890ddd
const int RIGHT = LEFT + 1;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// forward declarations
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TSoundTrack;
Toshihiro Shimizu 890ddd
class TSoundTransform;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
template class DVAPI TSmartPointerT<tsoundtrack>;</tsoundtrack>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
typedef TSmartPointerT<tsoundtrack> TSoundTrackP;</tsoundtrack>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  The class TSoundTrackFormat contains the main features of a TSoundTrack as:
Toshihiro Shimizu 890ddd
  sample rate, bit per sample, number of channels and signed or unsigned sample
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
class DVAPI TSoundTrackFormat
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TUINT32 m_sampleRate; // frequenza di campionamento
Toshihiro Shimizu 890ddd
	int m_bitPerSample;   // numero di bit per campione
Toshihiro Shimizu 890ddd
	int m_channelCount;   // numero di canali
Toshihiro Shimizu 890ddd
	bool m_signedSample;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TSoundTrackFormat(
Toshihiro Shimizu 890ddd
		TUINT32 sampleRate = 0,
Toshihiro Shimizu 890ddd
		int bitPerSample = 0,
Toshihiro Shimizu 890ddd
		int channelCount = 0,
Toshihiro Shimizu 890ddd
		bool signedSample = true)
Toshihiro Shimizu 890ddd
		: m_sampleRate(sampleRate), m_bitPerSample(bitPerSample), m_channelCount(channelCount), m_signedSample(signedSample) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	~TSoundTrackFormat() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool operator==(const TSoundTrackFormat &rhs);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool operator!=(const TSoundTrackFormat &rhs);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
//! \include sound_ex.cpp
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  The class TSoundTrack contains all features about a sound track
Toshihiro Shimizu 890ddd
  and gives all methods to access to these informations
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
class DVAPI TSoundTrack : public TSmartObject
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	DECLARE_CLASS_CODE
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Toshihiro Shimizu 890ddd
	TUINT32 m_sampleRate; // frequenza di campionamento
Toshihiro Shimizu 890ddd
	int m_sampleSize;	 // numero di byte per campione
Toshihiro Shimizu 890ddd
	int m_bitPerSample;   // numero di bit per campione
Toshihiro Shimizu 890ddd
	TINT32 m_sampleCount; // numero di campioni
Toshihiro Shimizu 890ddd
	int m_channelCount;   // numero di canali
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TSoundTrack *m_parent; // nel caso di sotto-traccie
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	UCHAR *m_buffer;
Toshihiro Shimizu 890ddd
	bool m_bufferOwner;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TSoundTrack();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TSoundTrack(
Toshihiro Shimizu 890ddd
		TUINT32 sampleRate, int bitPerSample,
Toshihiro Shimizu 890ddd
		int channelCount, int sampleSize, TINT32 sampleCount, bool isSampleSigned);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TSoundTrack(
Toshihiro Shimizu 890ddd
		TUINT32 sampleRate, int bitPerSample,
Toshihiro Shimizu 890ddd
		int channelCount, int sampleSize, TINT32 sampleCount,
Toshihiro Shimizu 890ddd
		UCHAR *buffer, TSoundTrack *parent);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
  Create a new soundtrack according to the sample rate, bits per sample, number 
Toshihiro Shimizu 890ddd
  of channels and number of samples specified as inputs.
Toshihiro Shimizu 890ddd
  signedSample must be true for tracks whose samples are signed
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	static TSoundTrackP create(
Toshihiro Shimizu 890ddd
		TUINT32 sampleRate, int bitPerSample,
Toshihiro Shimizu 890ddd
		int channelCount, TINT32 sampleCount,
Toshihiro Shimizu 890ddd
		bool signedSample = true);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	static TSoundTrackP create(
Toshihiro Shimizu 890ddd
		TUINT32 sampleRate, int bitPerSample,
Toshihiro Shimizu 890ddd
		int channelCount, TINT32 sampleCount, void *buffer,
Toshihiro Shimizu 890ddd
		bool signedSample = true);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
  Create a new soundtrack according to the format and number of samples 
Toshihiro Shimizu 890ddd
  specified as inputs
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	static TSoundTrackP create(const TSoundTrackFormat &format, TINT32 sampleCount);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	static TSoundTrackP create(const TSoundTrackFormat &format, TINT32 sampleCount, void *buffer);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	~TSoundTrack();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Converts from seconds to samples according to the soundtrack sample rate
Toshihiro Shimizu 890ddd
	TINT32 secondsToSamples(double sec) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Converts from samples to seconds according to the soundtrack sample rate
Toshihiro Shimizu 890ddd
	double samplesToSeconds(TINT32 smp) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TUINT32 getSampleRate() const { return m_sampleRate; }
Toshihiro Shimizu 890ddd
	int getSampleSize() const { return m_sampleSize; }
Toshihiro Shimizu 890ddd
	int getChannelCount() const { return m_channelCount; }
Toshihiro Shimizu 890ddd
	int getBitPerSample() const { return m_bitPerSample; }
Toshihiro Shimizu 890ddd
	TINT32 getSampleCount() const { return m_sampleCount; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns the duration of the soundtrack in seconds.
Toshihiro Shimizu 890ddd
	double getDuration() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns true if the samples of the soundtrack are signed, false otherwise
Toshihiro Shimizu 890ddd
	virtual bool isSampleSigned() const = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns the soundtrack format
Toshihiro Shimizu 890ddd
	TSoundTrackFormat getFormat() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns a pointer to the samples buffer.
Toshihiro Shimizu 890ddd
	const UCHAR *getRawData() const { return m_buffer; };
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setSampleRate(TUINT32 sampleRate) { m_sampleRate = sampleRate; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Clones the soundtrack
Toshihiro Shimizu 890ddd
	virtual TSoundTrackP clone() const = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns a soundtrack that contains just the cloned channel
Toshihiro Shimizu 890ddd
	virtual TSoundTrackP clone(TSound::Channel chan) const = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns a subtrack for the range [s0, s1], s0 and s1 are samples
Toshihiro Shimizu 890ddd
	virtual TSoundTrackP extract(TINT32 s0, TINT32 s1) = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns a subtrack for the range [t0, t1], t0 and t1 are seconds
Toshihiro Shimizu 890ddd
	TSoundTrackP extract(double t0, double t1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
  Copies the all samples of the source soundtrack 
Toshihiro Shimizu 890ddd
  to the object, starting from dst_s0.
Toshihiro Shimizu 890ddd
  dst_s0 is expressed in samples.
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	virtual void copy(const TSoundTrackP &src, TINT32 dst_s0) = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
  Copies the all samples of the source soundtrack 
Toshihiro Shimizu 890ddd
  to the object, starting from dst_t0.
Toshihiro Shimizu 890ddd
  dst_t0 is expressed in seconds.
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	void copy(const TSoundTrackP &src, double dst_t0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Blanks the soundtrack in the given range
Toshihiro Shimizu 890ddd
	virtual void blank(TINT32 s0, TINT32 s1) = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*! 
Toshihiro Shimizu 890ddd
  Blanks the soundtrack in the given range. Range is expressed in seconds.
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	void blank(double t0, double t1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*! 
Toshihiro Shimizu 890ddd
  Returns a new soundtrack obtained applying the given sound tranform 
Toshihiro Shimizu 890ddd
  to the soundtrack
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	virtual TSoundTrackP apply(TSoundTransform *) = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns the soundtrack pressure value for the given sample and channel: range [-1,1]
Toshihiro Shimizu 890ddd
	virtual double getPressure(TINT32 sample, TSound::Channel chan) const = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns the soundtrack pressure value for the given time and channel
Toshihiro Shimizu 890ddd
	double getPressure(double second, TSound::Channel chan) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns the soundtrack pressure max and min values in the given sample range and channel
Toshihiro Shimizu 890ddd
	virtual void getMinMaxPressure(
Toshihiro Shimizu 890ddd
		TINT32 s0, TINT32 s1, TSound::Channel chan,
Toshihiro Shimizu 890ddd
		double &min, double &max) const = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
  Returns the soundtrack pressure min and max values in the given range and channel.
Toshihiro Shimizu 890ddd
  Range in seconds
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	void getMinMaxPressure(
Toshihiro Shimizu 890ddd
		double t0, double t1, TSound::Channel chan,
Toshihiro Shimizu 890ddd
		double &min, double &max) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns the soundtrack pressure min and max values for the given channel
Toshihiro Shimizu 890ddd
	void getMinMaxPressure(TSound::Channel chan, double &min, double &max) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns the soundtrack pressure max value in the given sample range and channel
Toshihiro Shimizu 890ddd
	virtual double getMaxPressure(TINT32 s0, TINT32 s1, TSound::Channel chan) const = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
  Returns the soundtrack pressure min value in the given range and channel.
Toshihiro Shimizu 890ddd
  Range in seconds
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	double getMaxPressure(double t0, double t1, TSound::Channel chan) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns the soundtrack pressure max value for the given channel
Toshihiro Shimizu 890ddd
	double getMaxPressure(TSound::Channel chan) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns the soundtrack pressure max value in the given sample range and channel
Toshihiro Shimizu 890ddd
	virtual double getMinPressure(TINT32 s0, TINT32 s1, TSound::Channel chan) const = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
  Returns the soundtrack pressure mix value in the given sample range and channel
Toshihiro Shimizu 890ddd
  Range in seconds
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	double getMinPressure(double t0, double t1, TSound::Channel chan) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns the soundtrack pressure min value for the given channel
Toshihiro Shimizu 890ddd
	double getMinPressure(TSound::Channel chan) const;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TSoundDeviceException : public TException
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	enum Type {
Toshihiro Shimizu 890ddd
		FailedInit, // fallimento del costruttore
Toshihiro Shimizu 890ddd
		UnableOpenDevice,
Toshihiro Shimizu 890ddd
		UnableCloseDevice,
Toshihiro Shimizu 890ddd
		UnablePrepare,	 // non puo' preparare i blocchi per play o rec
Toshihiro Shimizu 890ddd
		UnsupportedFormat, // formato non supportato
Toshihiro Shimizu 890ddd
		UnableSetDevice,   // non puo' impostare il device richiesto
Toshihiro Shimizu 890ddd
		UnableVolume,	  // non puo' leggere o scrivere il valore del volume
Toshihiro Shimizu 890ddd
		NoMixer,		   // assenza del dispositivo per regolare il volume
Toshihiro Shimizu 890ddd
		Busy			   // indica che il dispositivo gia' sta facendo
Toshihiro Shimizu 890ddd
						   // un play od una registrazione
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	TSoundDeviceException(Type type, const std::string &msg)
Toshihiro Shimizu 890ddd
		: TException(msg), m_type(type) {}
Shinya Kitaoka 3bfa54
	TSoundDeviceException(Type type, const std::wstring &msg)
Toshihiro Shimizu 890ddd
		: TException(msg), m_type(type) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	Type getType()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return m_type;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	Type m_type;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// forward declaration
Toshihiro Shimizu 890ddd
class TSoundInputDeviceImp;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//! \include sndInDev_ex.cpp
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  The class TSoundInputDevice permits the recording of a new sound track
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
class DVAPI TSoundInputDevice
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 262a92
	std::shared_ptr<tsoundinputdeviceimp> m_imp;</tsoundinputdeviceimp>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	enum Source {
Toshihiro Shimizu 890ddd
		Mic = 0,
Toshihiro Shimizu 890ddd
		LineIn,
Toshihiro Shimizu 890ddd
		DigitalIn,
Toshihiro Shimizu 890ddd
		CdAudio
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TSoundInputDevice();
Toshihiro Shimizu 890ddd
	~TSoundInputDevice();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
    Returns true if on the machine there is an audio card installed correctly
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	static bool installed();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Returns the best format supported near the given parameters
Toshihiro Shimizu 890ddd
	TSoundTrackFormat getPreferredFormat(TUINT32 sampleRate, int channelCount, int bitPerSample);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Returns the best format supported near the given format
Toshihiro Shimizu 890ddd
	TSoundTrackFormat getPreferredFormat(const TSoundTrackFormat &);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Returns true if is possible to change volume setting on current input interface
Toshihiro Shimizu 890ddd
	bool supportsVolume();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Starts the recording of a soundtrack with the given format from the given source.
Toshihiro Shimizu 890ddd
	void record(const TSoundTrackFormat &format, Source devtype = Mic);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
  Starts the recording over the soundtrack st from the given source.
Toshihiro Shimizu 890ddd
  If not stopped before, recording ends when the whole soundtrack has been
Toshihiro Shimizu 890ddd
  overwritten.
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	void record(const TSoundTrackP &st, Source src = Mic);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Stops the recording and returns the result of recording.
Toshihiro Shimizu 890ddd
	TSoundTrackP stop();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Return the current value of the volume
Toshihiro Shimizu 890ddd
	double getVolume();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Set the value of the volume
Toshihiro Shimizu 890ddd
	bool setVolume(double value);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns true if and only if the device is recording
Toshihiro Shimizu 890ddd
	bool isRecording();
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  The class TSoundOutputDeviceListener permits to notify to other object
Toshihiro Shimizu 890ddd
  if a playback is completed. Use it as base class that needs to know if
Toshihiro Shimizu 890ddd
  a playback is ended
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TSoundOutputDeviceListener
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	virtual ~TSoundOutputDeviceListener(){};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual void onPlayCompleted() = 0;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TSoundOutputDeviceImp;
Toshihiro Shimizu 890ddd
//! \include sndOutDev_ex.cpp
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  The class TSoundOutputDevice permits the playback of a sound track
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
class DVAPI TSoundOutputDevice
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 94f329
	std::shared_ptr<tsoundoutputdeviceimp> m_imp;</tsoundoutputdeviceimp>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TSoundOutputDevice();
Toshihiro Shimizu 890ddd
	~TSoundOutputDevice();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
    Returns true if on the machine there is an audio card installed correctly
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	static bool installed();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Returns the best format supported near the given parameters
Toshihiro Shimizu 890ddd
	TSoundTrackFormat getPreferredFormat(TUINT32 sampleRate, int channelCount, int bitPerSample);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Returns the best format supported near the given format
Toshihiro Shimizu 890ddd
	TSoundTrackFormat getPreferredFormat(const TSoundTrackFormat &);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool isFormatSupported(const TSoundTrackFormat &);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef MACOSX
Toshihiro Shimizu 890ddd
	//! Returns true if is possible to change volume setting on current input interface
Toshihiro Shimizu 890ddd
	bool supportsVolume();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns the current value of the volume [0,1]
Toshihiro Shimizu 890ddd
	double getVolume();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Set the value of volume , between [0,1]
Toshihiro Shimizu 890ddd
	bool setVolume(double value);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Open the device according to the features of soundtrack
Toshihiro Shimizu 890ddd
	bool open(const TSoundTrackP &st);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Playback of the sndtrack in the request sample range
Toshihiro Shimizu 890ddd
	void play(const TSoundTrackP &st, TINT32 s0, TINT32 s1, bool loop = false, bool scrubbing = false);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Close in the right mode the device
Toshihiro Shimizu 890ddd
	bool close();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!Playback of the sndtrack in the request time range.
Toshihiro Shimizu 890ddd
     The loop argument permits to set the looping status of player
Toshihiro Shimizu 890ddd
     The scrubbing permits to an application to set the mode for the 
Toshihiro Shimizu 890ddd
     interaction between sound and mouse
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	void play(const TSoundTrackP &st,
Toshihiro Shimizu 890ddd
			  double t0,
Toshihiro Shimizu 890ddd
			  double t1,
Toshihiro Shimizu 890ddd
			  bool loop = false,
Toshihiro Shimizu 890ddd
			  bool scrubbing = false)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		play(st, st->secondsToSamples(t0), st->secondsToSamples(t1), loop, scrubbing);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Stop the playback of one or more soundtracks
Toshihiro Shimizu 890ddd
	void stop();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns if the device is busy with a playback
Toshihiro Shimizu 890ddd
	bool isPlaying() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef MACOSX
Toshihiro Shimizu 890ddd
	//!Return true if the playback of all soundtracks is ended.
Toshihiro Shimizu 890ddd
	bool isAllQueuedItemsPlayed();
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Returns if the status of player is in looping
Toshihiro Shimizu 890ddd
	bool isLooping();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Permits to change the looping status of player
Toshihiro Shimizu 890ddd
	void setLooping(bool loop);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void attach(TSoundOutputDeviceListener *listener);
Toshihiro Shimizu 890ddd
	void detach(TSoundOutputDeviceListener *listener);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif