151 lines
3.6 KiB
C++
151 lines
3.6 KiB
C++
/**
|
|
* @author Edouard DUPIN
|
|
*
|
|
* @copyright 2014, Edouard DUPIN, all right reserved
|
|
*
|
|
* @license BSD v3 (see license file)
|
|
*/
|
|
|
|
#include <eaudiofx/debug.h>
|
|
#include <eaudiofx/core/Block.h>
|
|
#include <eaudiofx/core/Buffer.h>
|
|
#include <eaudiofx/core/BlockMeta.h>
|
|
|
|
|
|
|
|
eaudiofx::Block::Block(void) :
|
|
m_uid(0),
|
|
m_type(),
|
|
m_parent(NULL) {
|
|
static size_t id=0;
|
|
m_uid = id;
|
|
id++;
|
|
}
|
|
|
|
eaudiofx::Block::~Block(void) {
|
|
for (auto &it : m_io) {
|
|
if (it.second.m_buffer == NULL) {
|
|
continue;
|
|
}
|
|
if (it.second.m_internal != true) {
|
|
continue;
|
|
}
|
|
// just remove pointer from reference system.
|
|
eaudiofx::Buffer* tmp = it.second.m_buffer;
|
|
it.second.m_buffer = NULL;
|
|
// Notify all element that a buffer is removed.
|
|
subRemoveBuffer(tmp);
|
|
delete(tmp);
|
|
}
|
|
}
|
|
|
|
int32_t eaudiofx::Block::pull(double _currentTime, int32_t _request, float _timeout) {
|
|
int32_t ret = eaudiofx::ERR_NONE;
|
|
//EAUDIOFX_DEBUG("Pull request for " << m_io.size() << " IO(s)");
|
|
for (auto &it : m_io) {
|
|
if (it.second.m_buffer == NULL) {
|
|
EAUDIOFX_DEBUG(" ==> null buffer");
|
|
continue;
|
|
}
|
|
if ( it.second.m_type != eaudiofx::Block::ioInput
|
|
&& it.second.m_type != eaudiofx::Block::ioParameter) {
|
|
continue;
|
|
}
|
|
if (it.second.m_buffer->pull(_currentTime, _request, _timeout) != eaudiofx::ERR_NONE) {
|
|
ret = eaudiofx::ERR_FAIL;
|
|
}
|
|
}
|
|
return ret;
|
|
};
|
|
|
|
|
|
void eaudiofx::Block::subRemoveBuffer(const eaudiofx::Buffer* _buffer) {
|
|
if (_buffer == NULL) {
|
|
return;
|
|
}
|
|
if (m_parent == NULL) {
|
|
onRemoveBuffer(_buffer);
|
|
} else {
|
|
m_parent->subRemoveBuffer(_buffer);
|
|
}
|
|
}
|
|
|
|
void eaudiofx::Block::onRemoveBuffer(const eaudiofx::Buffer* _buffer) {
|
|
unLinkBuffer(_buffer);
|
|
}
|
|
|
|
int32_t eaudiofx::Block::linkBuffer(eaudiofx::Buffer* _buffer, const std::string& _name) {
|
|
if ( _buffer == NULL
|
|
|| _name.size() == 0) {
|
|
return eaudiofx::ERR_INPUT_NULL;
|
|
}
|
|
for (auto &it : m_io) {
|
|
if (it.first == _name) {
|
|
if (it.second.m_type == ioOutput) {
|
|
EAUDIOFX_ERROR("[" << getUID() << "Can not overwrite output buffer...");
|
|
return eaudiofx::ERR_FORBIDEN;
|
|
}
|
|
it.second.m_buffer = _buffer;
|
|
// TODO : Negiciate ???
|
|
return eaudiofx::ERR_NONE;
|
|
}
|
|
}
|
|
return eaudiofx::ERR_NO_IO;
|
|
}
|
|
|
|
|
|
int32_t eaudiofx::Block::unLinkBuffer(const eaudiofx::Buffer* _buffer) {
|
|
if (_buffer == NULL) {
|
|
return eaudiofx::ERR_INPUT_NULL;
|
|
}
|
|
// For every buffer, remove internal reference...
|
|
for (auto &it : m_io) {
|
|
if (it.second.m_buffer == _buffer) {
|
|
it.second.m_buffer = NULL;
|
|
}
|
|
}
|
|
return eaudiofx::ERR_NONE;
|
|
}
|
|
|
|
int32_t eaudiofx::Block::unLinkBuffer(const std::string& _name) {
|
|
if (_name.size() == 0) {
|
|
return eaudiofx::ERR_INPUT_NULL;
|
|
}
|
|
for (auto &it : m_io) {
|
|
if (it.first == _name) {
|
|
if (it.second.m_type == ioOutput) {
|
|
EAUDIOFX_ERROR("[" << getUID() << "Can not overwrite output buffer...");
|
|
return eaudiofx::ERR_FORBIDEN;
|
|
}
|
|
it.second.m_buffer = NULL;
|
|
if (it.second.m_type == ioParameter) {
|
|
// TODO : Re-create the basic input buffer ... (Or duplicate the last one???
|
|
}
|
|
return eaudiofx::ERR_NONE;
|
|
}
|
|
}
|
|
return eaudiofx::ERR_NO_IO;
|
|
}
|
|
|
|
int32_t eaudiofx::Block::getBuffer(eaudiofx::Buffer*& _buffer, const std::string& _name) {
|
|
if (_name.size() == 0) {
|
|
return eaudiofx::ERR_INPUT_NULL;
|
|
}
|
|
for (auto &it : m_io) {
|
|
if (it.first == _name) {
|
|
if (it.second.m_type == ioInput) {
|
|
EAUDIOFX_ERROR("[" << getUID() << "Can not Request Input buffer...");
|
|
return eaudiofx::ERR_FORBIDEN;
|
|
}
|
|
if (it.second.m_type == ioParameter) {
|
|
EAUDIOFX_ERROR("[" << getUID() << "Can not Request Parameter buffer...");
|
|
return eaudiofx::ERR_FORBIDEN;
|
|
}
|
|
_buffer = it.second.m_buffer;
|
|
return eaudiofx::ERR_NONE;
|
|
}
|
|
}
|
|
return eaudiofx::ERR_NO_IO;
|
|
}
|
|
|