[DEV] audate audio time interface

This commit is contained in:
Edouard DUPIN 2015-04-13 21:49:48 +02:00
parent 75e0396bc1
commit 74f1fee452
21 changed files with 49 additions and 45 deletions

View File

@ -18,6 +18,8 @@
#include <etk/memory.h> #include <etk/memory.h>
#include "AutoLogInOut.h" #include "AutoLogInOut.h"
#include "IOFormatInterface.h" #include "IOFormatInterface.h"
#include <audio/Time.h>
#include <audio/Duration.h>
#include "debug.h" #include "debug.h"
namespace audio { namespace audio {
@ -118,7 +120,7 @@ namespace audio {
* @return true The process is done corectly * @return true The process is done corectly
* @return false An error occured * @return false An error occured
*/ */
virtual bool process(std11::chrono::system_clock::time_point& _time, virtual bool process(audio::Time& _time,
void* _input, void* _input,
size_t _inputNbChunk, size_t _inputNbChunk,
void*& _output, void*& _output,

View File

@ -49,7 +49,7 @@ void audio::drain::ChannelReorder::configurationChange() {
} }
bool audio::drain::ChannelReorder::process(std11::chrono::system_clock::time_point& _time, bool audio::drain::ChannelReorder::process(audio::Time& _time,
void* _input, void* _input,
size_t _inputNbChunk, size_t _inputNbChunk,
void*& _output, void*& _output,

View File

@ -27,7 +27,7 @@ namespace audio {
protected: protected:
virtual void configurationChange(); virtual void configurationChange();
public: public:
virtual bool process(std11::chrono::system_clock::time_point& _time, virtual bool process(audio::Time& _time,
void* _input, void* _input,
size_t _inputNbChunk, size_t _inputNbChunk,
void*& _output, void*& _output,

View File

@ -110,10 +110,10 @@ size_t audio::drain::CircularBuffer::getFreeSizeBeforEnd() const {
return size; return size;
} }
size_t audio::drain::CircularBuffer::write(const void* _data, size_t _nbChunk) { size_t audio::drain::CircularBuffer::write(const void* _data, size_t _nbChunk) {
return write(_data, _nbChunk, std11::chrono::system_clock::now());//m_timeRead + ) return write(_data, _nbChunk, audio::Time::now());//m_timeRead + )
} }
size_t audio::drain::CircularBuffer::write(const void* _data, size_t _nbChunk, const std11::chrono::system_clock::time_point& _time) { size_t audio::drain::CircularBuffer::write(const void* _data, size_t _nbChunk, const audio::Time& _time) {
if (m_data.size() == 0) { if (m_data.size() == 0) {
DRAIN_ERROR("EMPTY Buffer"); DRAIN_ERROR("EMPTY Buffer");
return _nbChunk; return _nbChunk;
@ -183,14 +183,14 @@ size_t audio::drain::CircularBuffer::read(void* _data, size_t _nbChunk) {
return read(_data, _nbChunk, m_timeRead); return read(_data, _nbChunk, m_timeRead);
} }
size_t audio::drain::CircularBuffer::read(void* _data, size_t _nbChunk, const std11::chrono::system_clock::time_point& _time) { size_t audio::drain::CircularBuffer::read(void* _data, size_t _nbChunk, const audio::Time& _time) {
size_t nbElementDrop = 0; size_t nbElementDrop = 0;
// Critical section (theoriquely protected by Mutex) // Critical section (theoriquely protected by Mutex)
size_t usedSizeBeforeEnd = getUsedSizeBeforEnd(); size_t usedSizeBeforeEnd = getUsedSizeBeforEnd();
// verify if we have elements in the Buffer // verify if we have elements in the Buffer
if (0 < m_size) { if (0 < m_size) {
// check the time of the read : // check the time of the read :
std11::chrono::nanoseconds deltaTime = m_timeRead - _time; audio::Duration deltaTime = m_timeRead - _time;
if (deltaTime.count() == 0) { if (deltaTime.count() == 0) {
// nothing to do ==> just copy data ... // nothing to do ==> just copy data ...
} else if (deltaTime.count() > 0) { } else if (deltaTime.count() > 0) {
@ -251,16 +251,16 @@ size_t audio::drain::CircularBuffer::read(void* _data, size_t _nbChunk, const st
return nbElementDrop; return nbElementDrop;
} }
void audio::drain::CircularBuffer::setReadPosition(const std11::chrono::system_clock::time_point& _time) { void audio::drain::CircularBuffer::setReadPosition(const audio::Time& _time) {
// Critical section (theoriquely protected by Mutex) // Critical section (theoriquely protected by Mutex)
size_t usedSizeBeforeEnd = getUsedSizeBeforEnd(); size_t usedSizeBeforeEnd = getUsedSizeBeforEnd();
if (0 < m_size) { if (0 < m_size) {
// check the time of the read : // check the time of the read :
std11::chrono::nanoseconds deltaTime = _time - m_timeRead; audio::Duration deltaTime = _time - m_timeRead;
size_t nbSampleToRemove = int64_t(m_frequency)*int64_t(deltaTime.count())/1000000000LL; size_t nbSampleToRemove = int64_t(m_frequency)*int64_t(deltaTime.count())/1000000000LL;
nbSampleToRemove = std::min(nbSampleToRemove, m_size); nbSampleToRemove = std::min(nbSampleToRemove, m_size);
DRAIN_VERBOSE("Remove sample in the buffer " << nbSampleToRemove << " / " << m_size); DRAIN_VERBOSE("Remove sample in the buffer " << nbSampleToRemove << " / " << m_size);
std11::chrono::nanoseconds updateTime((int64_t(nbSampleToRemove)*1000000000LL)/int64_t(m_frequency)); audio::Duration updateTime(0,(int64_t(nbSampleToRemove)*1000000000LL)/int64_t(m_frequency));
DRAIN_VERBOSE(" add time : " << updateTime.count() << "ns / " << deltaTime.count() << "ns"); DRAIN_VERBOSE(" add time : " << updateTime.count() << "ns / " << deltaTime.count() << "ns");
if (usedSizeBeforeEnd >= nbSampleToRemove) { if (usedSizeBeforeEnd >= nbSampleToRemove) {
usedSizeBeforeEnd -= nbSampleToRemove; usedSizeBeforeEnd -= nbSampleToRemove;
@ -274,7 +274,7 @@ void audio::drain::CircularBuffer::setReadPosition(const std11::chrono::system_c
m_timeRead += updateTime; m_timeRead += updateTime;
//m_timeRead += deltaTime; //m_timeRead += deltaTime;
} else { } else {
m_timeRead = std11::chrono::system_clock::time_point(); m_timeRead = audio::Time();
} }
} }

View File

@ -11,6 +11,8 @@
#include <etk/types.h> #include <etk/types.h>
#include <vector> #include <vector>
#include <etk/chrono.h> #include <etk/chrono.h>
#include <audio/Time.h>
#include <audio/Duration.h>
namespace audio { namespace audio {
namespace drain { namespace drain {
@ -44,7 +46,7 @@ namespace audio {
std::vector<uint8_t> m_data; //!< data pointer std::vector<uint8_t> m_data; //!< data pointer
void* m_write; //!< write pointer void* m_write; //!< write pointer
void* m_read; //!< read pointer void* m_read; //!< read pointer
std11::chrono::system_clock::time_point m_timeRead; //!< current read time audio::Time m_timeRead; //!< current read time
uint32_t m_frequency; uint32_t m_frequency;
// TODO : Remove the m_size ==> this is a bad element to be mutex-less // TODO : Remove the m_size ==> this is a bad element to be mutex-less
size_t m_size; //!< number of chunk availlable in this buffer size_t m_size; //!< number of chunk availlable in this buffer
@ -106,7 +108,7 @@ namespace audio {
* @param[in] _time Time to start write data (if before end ==> not replace data, write only if after end) * @param[in] _time Time to start write data (if before end ==> not replace data, write only if after end)
* @return Number of chunk copied. * @return Number of chunk copied.
*/ */
size_t write(const void* _data, size_t _nbChunk, const std11::chrono::system_clock::time_point& _time); size_t write(const void* _data, size_t _nbChunk, const audio::Time& _time);
size_t write(const void* _data, size_t _nbChunk); size_t write(const void* _data, size_t _nbChunk);
/** /**
* @brief Read Chunk from the buffer to the pointer data. * @brief Read Chunk from the buffer to the pointer data.
@ -115,12 +117,12 @@ namespace audio {
* @param[in] _time Time to start read data (if before start ==> add 0 at start, if after, remove unread data) * @param[in] _time Time to start read data (if before start ==> add 0 at start, if after, remove unread data)
* @return Number of chunk copied. * @return Number of chunk copied.
*/ */
size_t read(void* _data, size_t _nbChunk, const std11::chrono::system_clock::time_point& _time); size_t read(void* _data, size_t _nbChunk, const audio::Time& _time);
//! @previous //! @previous
size_t read(void* _data, size_t _nbChunk); size_t read(void* _data, size_t _nbChunk);
void setReadPosition(const std11::chrono::system_clock::time_point& _time); void setReadPosition(const audio::Time& _time);
std11::chrono::system_clock::time_point getReadTimeStamp() { audio::Time getReadTimeStamp() {
return m_timeRead; return m_timeRead;
} }
/** /**

View File

@ -46,7 +46,7 @@ void audio::drain::EndPointCallback::configurationChange() {
} }
bool audio::drain::EndPointCallback::process(std11::chrono::system_clock::time_point& _time, bool audio::drain::EndPointCallback::process(audio::Time& _time,
void* _input, void* _input,
size_t _inputNbChunk, size_t _inputNbChunk,
void*& _output, void*& _output,

View File

@ -13,13 +13,13 @@
namespace audio { namespace audio {
namespace drain { namespace drain {
typedef std11::function<void (void* _data, typedef std11::function<void (void* _data,
const std11::chrono::system_clock::time_point& _playTime, const audio::Time& _playTime,
size_t _nbChunk, size_t _nbChunk,
enum audio::format _format, enum audio::format _format,
uint32_t _frequency, uint32_t _frequency,
const std::vector<audio::channel>& _map)> playbackFunction; const std::vector<audio::channel>& _map)> playbackFunction;
typedef std11::function<void (const void* _data, typedef std11::function<void (const void* _data,
const std11::chrono::system_clock::time_point& _readTime, const audio::Time& _readTime,
size_t _nbChunk, size_t _nbChunk,
enum audio::format _format, enum audio::format _format,
uint32_t _frequency, uint32_t _frequency,
@ -43,7 +43,7 @@ namespace audio {
*/ */
virtual ~EndPointCallback() {}; virtual ~EndPointCallback() {};
virtual void configurationChange(); virtual void configurationChange();
virtual bool process(std11::chrono::system_clock::time_point& _time, virtual bool process(audio::Time& _time,
void* _input, void* _input,
size_t _inputNbChunk, size_t _inputNbChunk,
void*& _output, void*& _output,

View File

@ -32,7 +32,7 @@ void audio::drain::EndPointRead::configurationChange() {
} }
bool audio::drain::EndPointRead::process(std11::chrono::system_clock::time_point& _time, bool audio::drain::EndPointRead::process(audio::Time& _time,
void* _input, void* _input,
size_t _inputNbChunk, size_t _inputNbChunk,
void*& _output, void*& _output,

View File

@ -25,7 +25,7 @@ namespace audio {
*/ */
virtual ~EndPointRead() {}; virtual ~EndPointRead() {};
virtual void configurationChange(); virtual void configurationChange();
virtual bool process(std11::chrono::system_clock::time_point& _time, virtual bool process(audio::Time& _time,
void* _input, void* _input,
size_t _inputNbChunk, size_t _inputNbChunk,
void*& _output, void*& _output,

View File

@ -52,7 +52,7 @@ void audio::drain::EndPointWrite::configurationChange() {
} }
bool audio::drain::EndPointWrite::process(std11::chrono::system_clock::time_point& _time, bool audio::drain::EndPointWrite::process(audio::Time& _time,
void* _input, void* _input,
size_t _inputNbChunk, size_t _inputNbChunk,
void*& _output, void*& _output,

View File

@ -14,7 +14,7 @@
namespace audio { namespace audio {
namespace drain{ namespace drain{
typedef std11::function<void (const std11::chrono::system_clock::time_point& _time, typedef std11::function<void (const audio::Time& _time,
size_t _nbChunk, size_t _nbChunk,
enum audio::format _format, enum audio::format _format,
uint32_t _frequency, uint32_t _frequency,
@ -37,7 +37,7 @@ namespace audio {
*/ */
virtual ~EndPointWrite() {}; virtual ~EndPointWrite() {};
virtual void configurationChange(); virtual void configurationChange();
virtual bool process(std11::chrono::system_clock::time_point& _time, virtual bool process(audio::Time& _time,
void* _input, void* _input,
size_t _inputNbChunk, size_t _inputNbChunk,
void*& _output, void*& _output,

View File

@ -39,7 +39,7 @@ void audio::drain::Equalizer::configurationChange() {
} }
} }
bool audio::drain::Equalizer::process(std11::chrono::system_clock::time_point& _time, bool audio::drain::Equalizer::process(audio::Time& _time,
void* _input, void* _input,
size_t _inputNbChunk, size_t _inputNbChunk,
void*& _output, void*& _output,

View File

@ -30,7 +30,7 @@ namespace audio {
protected: protected:
virtual void configurationChange(); virtual void configurationChange();
public: public:
virtual bool process(std11::chrono::system_clock::time_point& _time, virtual bool process(audio::Time& _time,
void* _input, void* _input,
size_t _inputNbChunk, size_t _inputNbChunk,
void*& _output, void*& _output,

View File

@ -243,7 +243,7 @@ void audio::drain::FormatUpdate::configurationChange() {
} }
bool audio::drain::FormatUpdate::process(std11::chrono::system_clock::time_point& _time, bool audio::drain::FormatUpdate::process(audio::Time& _time,
void* _input, void* _input,
size_t _inputNbChunk, size_t _inputNbChunk,
void*& _output, void*& _output,

View File

@ -26,7 +26,7 @@ namespace audio {
protected: protected:
virtual void configurationChange(); virtual void configurationChange();
public: public:
virtual bool process(std11::chrono::system_clock::time_point& _time, virtual bool process(audio::Time& _time,
void* _input, void* _input,
size_t _inputNbChunk, size_t _inputNbChunk,
void*& _output, void*& _output,

View File

@ -28,7 +28,7 @@ audio::drain::Process::~Process() {
} }
} }
bool audio::drain::Process::push(std11::chrono::system_clock::time_point& _time, bool audio::drain::Process::push(audio::Time& _time,
void* _data, void* _data,
size_t _nbChunk) { size_t _nbChunk) {
void* out = nullptr; void* out = nullptr;
@ -38,7 +38,7 @@ bool audio::drain::Process::push(std11::chrono::system_clock::time_point& _time,
return true; return true;
} }
bool audio::drain::Process::pull(std11::chrono::system_clock::time_point& _time, bool audio::drain::Process::pull(audio::Time& _time,
void* _data, void* _data,
size_t _nbChunk, size_t _nbChunk,
size_t _chunkSize) { size_t _chunkSize) {
@ -81,7 +81,7 @@ bool audio::drain::Process::pull(std11::chrono::system_clock::time_point& _time,
} }
bool audio::drain::Process::process(std11::chrono::system_clock::time_point& _time, bool audio::drain::Process::process(audio::Time& _time,
void* _inData, void* _inData,
size_t _inNbChunk, size_t _inNbChunk,
void*& _outData, void*& _outData,

View File

@ -36,7 +36,7 @@ namespace audio {
* @return true The procress is done corectly. * @return true The procress is done corectly.
* @return false An error occured. * @return false An error occured.
*/ */
bool push(std11::chrono::system_clock::time_point& _time, bool push(audio::Time& _time,
void* _data, void* _data,
size_t _nbChunk); size_t _nbChunk);
/** /**
@ -48,7 +48,7 @@ namespace audio {
* @return true The procress is done corectly. * @return true The procress is done corectly.
* @return false An error occured. * @return false An error occured.
*/ */
bool pull(std11::chrono::system_clock::time_point& _time, bool pull(audio::Time& _time,
void* _data, void* _data,
size_t _nbChunk, size_t _nbChunk,
size_t _chunkSize); size_t _chunkSize);
@ -62,7 +62,7 @@ namespace audio {
* @return true The procress is done corectly. * @return true The procress is done corectly.
* @return false An error occured. * @return false An error occured.
*/ */
bool process(std11::chrono::system_clock::time_point& _time, bool process(audio::Time& _time,
void* _inData, void* _inData,
size_t _inNbChunk, size_t _inNbChunk,
void*& _outData, void*& _outData,
@ -71,7 +71,7 @@ namespace audio {
size_t _inNbChunk, size_t _inNbChunk,
void*& _outData, void*& _outData,
size_t& _outNbChunk) { size_t& _outNbChunk) {
std11::chrono::system_clock::time_point time; audio::Time time;
return process(time, _inData, _inNbChunk, _outData, _outNbChunk); return process(time, _inData, _inNbChunk, _outData, _outNbChunk);
} }
bool processIn(void* _inData, bool processIn(void* _inData,

View File

@ -24,7 +24,7 @@ void audio::drain::Resampler::init() {
audio::drain::Algo::init(); audio::drain::Algo::init();
m_type = "Resampler"; m_type = "Resampler";
m_supportedFormat.push_back(audio::format_int16); m_supportedFormat.push_back(audio::format_int16);
m_residualTimeInResampler = std11::chrono::nanoseconds(0); m_residualTimeInResampler = audio::Duration(0);
} }
std11::shared_ptr<audio::drain::Resampler> audio::drain::Resampler::create() { std11::shared_ptr<audio::drain::Resampler> audio::drain::Resampler::create() {
@ -78,14 +78,14 @@ void audio::drain::Resampler::configurationChange() {
m_input.getFrequency(), m_input.getFrequency(),
m_output.getFrequency(), m_output.getFrequency(),
10, &err); 10, &err);
m_residualTimeInResampler = std11::chrono::nanoseconds(0); m_residualTimeInResampler = audio::Duration(0);
#else #else
DRAIN_WARNING("SPEEX DSP lib not accessible ==> can not resample"); DRAIN_WARNING("SPEEX DSP lib not accessible ==> can not resample");
m_needProcess = false; m_needProcess = false;
#endif #endif
} }
bool audio::drain::Resampler::process(std11::chrono::system_clock::time_point& _time, bool audio::drain::Resampler::process(audio::Time& _time,
void* _input, void* _input,
size_t _inputNbChunk, size_t _inputNbChunk,
void*& _output, void*& _output,
@ -109,7 +109,7 @@ bool audio::drain::Resampler::process(std11::chrono::system_clock::time_point& _
DRAIN_VERBOSE("Resampler correct timestamp : " << _time << " ==> " << (_time - m_residualTimeInResampler)); DRAIN_VERBOSE("Resampler correct timestamp : " << _time << " ==> " << (_time - m_residualTimeInResampler));
_time -= m_residualTimeInResampler; _time -= m_residualTimeInResampler;
std11::chrono::nanoseconds inTime((int64_t(_inputNbChunk)*1000000000LL) / int64_t(m_input.getFrequency())); audio::Duration inTime(0, (int64_t(_inputNbChunk)*1000000000LL) / int64_t(m_input.getFrequency()));
m_residualTimeInResampler += inTime; m_residualTimeInResampler += inTime;
#ifdef HAVE_SPEEX_DSP_RESAMPLE #ifdef HAVE_SPEEX_DSP_RESAMPLE
float nbInputTime = float(_inputNbChunk)/m_input.getFrequency(); float nbInputTime = float(_inputNbChunk)/m_input.getFrequency();
@ -148,7 +148,7 @@ bool audio::drain::Resampler::process(std11::chrono::system_clock::time_point& _
} }
_outputNbChunk = nbChunkOutput; _outputNbChunk = nbChunkOutput;
DRAIN_VERBOSE(" process chunk=" << nbChunkInput << " out=" << nbChunkOutput); DRAIN_VERBOSE(" process chunk=" << nbChunkInput << " out=" << nbChunkOutput);
std11::chrono::nanoseconds outTime((int64_t(_outputNbChunk)*1000000000LL) / int64_t(m_output.getFrequency())); audio::Duration outTime(0, (int64_t(_outputNbChunk)*1000000000LL) / int64_t(m_output.getFrequency()));
DRAIN_VERBOSE("convert " << _inputNbChunk << " ==> " << _outputNbChunk << " " << inTime.count() << " => " << outTime.count()); DRAIN_VERBOSE("convert " << _inputNbChunk << " ==> " << _outputNbChunk << " " << inTime.count() << " => " << outTime.count());
// correct time : // correct time :
m_residualTimeInResampler -= outTime; m_residualTimeInResampler -= outTime;

View File

@ -39,13 +39,13 @@ namespace audio {
protected: protected:
virtual void configurationChange(); virtual void configurationChange();
public: public:
virtual bool process(std11::chrono::system_clock::time_point& _time, virtual bool process(audio::Time& _time,
void* _input, void* _input,
size_t _inputNbChunk, size_t _inputNbChunk,
void*& _output, void*& _output,
size_t& _outputNbChunk); size_t& _outputNbChunk);
private: private:
std11::chrono::nanoseconds m_residualTimeInResampler; //!< the time of data locked in the resampler ... audio::Duration m_residualTimeInResampler; //!< the time of data locked in the resampler ...
}; };
} }
} }

View File

@ -304,7 +304,7 @@ std::vector<audio::format> audio::drain::Volume::getFormatSupportedOutput() {
}; };
bool audio::drain::Volume::process(std11::chrono::system_clock::time_point& _time, bool audio::drain::Volume::process(audio::Time& _time,
void* _input, void* _input,
size_t _inputNbChunk, size_t _inputNbChunk,
void*& _output, void*& _output,

View File

@ -69,7 +69,7 @@ namespace audio {
protected: protected:
virtual void configurationChange(); virtual void configurationChange();
public: public:
virtual bool process(std11::chrono::system_clock::time_point& _time, virtual bool process(audio::Time& _time,
void* _input, void* _input,
size_t _inputNbChunk, size_t _inputNbChunk,
void*& _output, void*& _output,