[DEV] add basic input viewer widget
This commit is contained in:
130
widget/audio/river/widget/TemporalViewer.cpp
Normal file
130
widget/audio/river/widget/TemporalViewer.cpp
Normal file
@@ -0,0 +1,130 @@
|
||||
/** @file
|
||||
* @author Edouard DUPIN
|
||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||
* @license APACHE v2.0 (see license file)
|
||||
*/
|
||||
|
||||
#include <audio/river/widget/debug.h>
|
||||
#include <audio/river/widget/TemporalViewer.h>
|
||||
#include <etk/tool.h>
|
||||
|
||||
#undef __class__
|
||||
#define __class__ "TemporalViewer"
|
||||
|
||||
|
||||
|
||||
|
||||
audio::river::widget::TemporalViewer::TemporalViewer() :
|
||||
m_minVal(-1.0f),
|
||||
m_maxVal(1.0f) {
|
||||
addObjectType("audio::river::widget::TemporalViewer");
|
||||
}
|
||||
|
||||
void audio::river::widget::TemporalViewer::init() {
|
||||
ewol::Widget::init();
|
||||
m_manager = audio::river::Manager::create("audio::river::widget::TemporalViewer");
|
||||
markToRedraw();
|
||||
}
|
||||
|
||||
|
||||
audio::river::widget::TemporalViewer::~TemporalViewer() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void audio::river::widget::TemporalViewer::onDataReceived(const void* _data,
|
||||
const audio::Time& _time,
|
||||
size_t _nbChunk,
|
||||
enum audio::format _format,
|
||||
uint32_t _frequency,
|
||||
const std::vector<audio::channel>& _map) {
|
||||
std11::unique_lock<std11::mutex> lock(m_mutex);
|
||||
if (_format != audio::format_float) {
|
||||
std::cout << "[ERROR] call wrong type ... (need int16_t)" << std::endl;
|
||||
}
|
||||
// get the curent power of the signal.
|
||||
const float* data = static_cast<const float*>(_data);
|
||||
for (size_t iii=0; iii<_nbChunk*_map.size(); ++iii) {
|
||||
m_data.push_back(data[iii]);
|
||||
}
|
||||
const int32_t nbSecond = 3;
|
||||
if (m_data.size()>_frequency*nbSecond) {
|
||||
m_data.erase(m_data.begin(), m_data.begin()+(m_data.size()-_frequency*nbSecond));
|
||||
}
|
||||
//markToRedraw();
|
||||
}
|
||||
|
||||
void audio::river::widget::TemporalViewer::recordToggle() {
|
||||
std11::unique_lock<std11::mutex> lock(m_mutex);
|
||||
if (m_interface == nullptr) {
|
||||
//Get the generic input:
|
||||
std::vector<audio::channel> channel;
|
||||
channel.push_back(audio::channel_frontLeft);
|
||||
m_interface = m_manager->createInput(48000,
|
||||
channel,
|
||||
audio::format_float,
|
||||
"microphone");
|
||||
if(m_interface == nullptr) {
|
||||
ARW_ERROR("nullptr interface");
|
||||
return;
|
||||
}
|
||||
// set callback mode ...
|
||||
m_interface->setInputCallback(std11::bind(&audio::river::widget::TemporalViewer::onDataReceived,
|
||||
this,
|
||||
std11::placeholders::_1,
|
||||
std11::placeholders::_2,
|
||||
std11::placeholders::_3,
|
||||
std11::placeholders::_4,
|
||||
std11::placeholders::_5,
|
||||
std11::placeholders::_6));
|
||||
// start the stream
|
||||
m_interface->start();
|
||||
periodicCallEnable();
|
||||
} else {
|
||||
m_interface->stop();
|
||||
m_interface.reset();
|
||||
periodicCallDisable();
|
||||
}
|
||||
}
|
||||
|
||||
void audio::river::widget::TemporalViewer::onDraw() {
|
||||
m_draw.draw();
|
||||
}
|
||||
|
||||
|
||||
void audio::river::widget::TemporalViewer::onRegenerateDisplay() {
|
||||
//!< Check if we really need to redraw the display, if not needed, we redraw the previous data ...
|
||||
if (needRedraw() == false) {
|
||||
return;
|
||||
}
|
||||
// remove previous data
|
||||
m_draw.clear();
|
||||
// set background
|
||||
m_draw.setColor(etk::color::black);
|
||||
m_draw.setPos(vec2(0,0));
|
||||
m_draw.rectangleWidth(m_size);
|
||||
std11::unique_lock<std11::mutex> lock(m_mutex);
|
||||
if (m_data.size() == 0) {
|
||||
return;
|
||||
}
|
||||
// set all the line:
|
||||
m_draw.setColor(etk::color::white);
|
||||
m_draw.setThickness(1);
|
||||
float origin = m_size.y()*0.5f;
|
||||
|
||||
float ratioY = m_size.y() / (m_maxVal - m_minVal);
|
||||
float stepX = m_size.x() / float(m_data.size());
|
||||
m_draw.setPos(vec2(0, origin + ratioY*m_data[0]));
|
||||
float baseX = 0;
|
||||
for (size_t iii=1; iii<m_data.size(); ++iii) {
|
||||
m_draw.lineTo(vec2(float(iii)*stepX, origin + ratioY*m_data[iii]));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void audio::river::widget::TemporalViewer::periodicCall(const ewol::event::Time& _event) {
|
||||
markToRedraw();
|
||||
}
|
62
widget/audio/river/widget/TemporalViewer.h
Normal file
62
widget/audio/river/widget/TemporalViewer.h
Normal file
@@ -0,0 +1,62 @@
|
||||
/** @file
|
||||
* @author Edouard DUPIN
|
||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||
* @license APACHE v2.0 (see license file)
|
||||
*/
|
||||
|
||||
#ifndef __ARW_TEMPORAL_VIEWER_H__
|
||||
#define __ARW_TEMPORAL_VIEWER_H__
|
||||
|
||||
#include <audio/river/widget/debug.h>
|
||||
#include <ewol/widget/Widget.h>
|
||||
#include <ewol/compositing/Drawing.h>
|
||||
#include <audio/river/river.h>
|
||||
#include <audio/river/Manager.h>
|
||||
#include <audio/river/Interface.h>
|
||||
#include <mutex>
|
||||
|
||||
namespace audio {
|
||||
namespace river {
|
||||
namespace widget {
|
||||
class TemporalViewer : public ewol::Widget {
|
||||
private:
|
||||
mutable std11::mutex m_mutex;
|
||||
private:
|
||||
ewol::compositing::Drawing m_draw; //!< drawing instance
|
||||
protected:
|
||||
//! @brief constructor
|
||||
TemporalViewer();
|
||||
void init();
|
||||
public:
|
||||
DECLARE_WIDGET_FACTORY(TemporalViewer, "TemporalViewer");
|
||||
//! @brief destructor
|
||||
virtual ~TemporalViewer();
|
||||
|
||||
void recordToggle();
|
||||
void generateToggle() {
|
||||
// ...
|
||||
}
|
||||
private:
|
||||
std::vector<float> m_data;
|
||||
private:
|
||||
float m_minVal; //!< display minimum value
|
||||
float m_maxVal; //!< display maximum value
|
||||
public: // herited function
|
||||
virtual void onDraw();
|
||||
virtual void onRegenerateDisplay();
|
||||
virtual void periodicCall(const ewol::event::Time& _event);
|
||||
private:
|
||||
std11::shared_ptr<audio::river::Manager> m_manager;
|
||||
std11::shared_ptr<audio::river::Interface> m_interface;
|
||||
void onDataReceived(const void* _data,
|
||||
const audio::Time& _time,
|
||||
size_t _nbChunk,
|
||||
enum audio::format _format,
|
||||
uint32_t _frequency,
|
||||
const std::vector<audio::channel>& _map);
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
13
widget/audio/river/widget/debug.cpp
Normal file
13
widget/audio/river/widget/debug.cpp
Normal file
@@ -0,0 +1,13 @@
|
||||
/** @file
|
||||
* @author Edouard DUPIN
|
||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||
* @license APACHE v2.0 (see license file)
|
||||
*/
|
||||
|
||||
#include <audio/river/widget/debug.h>
|
||||
|
||||
|
||||
int32_t audio::river::widget::getLogId() {
|
||||
static int32_t g_val = etk::log::registerInstance("audio-river-widget");
|
||||
return g_val;
|
||||
}
|
47
widget/audio/river/widget/debug.h
Normal file
47
widget/audio/river/widget/debug.h
Normal file
@@ -0,0 +1,47 @@
|
||||
/** @file
|
||||
* @author Edouard DUPIN
|
||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||
* @license APACHE v2.0 (see license file)
|
||||
*/
|
||||
|
||||
#ifndef __ARW_DEBUG_H__
|
||||
#define __ARW_DEBUG_H__
|
||||
|
||||
#include <etk/log.h>
|
||||
|
||||
namespace audio {
|
||||
namespace river {
|
||||
namespace widget {
|
||||
int32_t getLogId();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define ARW_BASE(info,data) TK_LOG_BASE(audio::river::widget::getLogId(),info,data)
|
||||
|
||||
#define ARW_PRINT(data) ARW_BASE(-1, data)
|
||||
#define ARW_CRITICAL(data) ARW_BASE(1, data)
|
||||
#define ARW_ERROR(data) ARW_BASE(2, data)
|
||||
#define ARW_WARNING(data) ARW_BASE(3, data)
|
||||
#ifdef DEBUG
|
||||
#define ARW_INFO(data) ARW_BASE(4, data)
|
||||
#define ARW_DEBUG(data) ARW_BASE(5, data)
|
||||
#define ARW_VERBOSE(data) ARW_BASE(6, data)
|
||||
#define ARW_TODO(data) ARW_BASE(4, "TODO : " << data)
|
||||
#else
|
||||
#define ARW_INFO(data) do { } while(false)
|
||||
#define ARW_DEBUG(data) do { } while(false)
|
||||
#define ARW_VERBOSE(data) do { } while(false)
|
||||
#define ARW_TODO(data) do { } while(false)
|
||||
#endif
|
||||
|
||||
#define ARW_ASSERT(cond,data) \
|
||||
do { \
|
||||
if (!(cond)) { \
|
||||
ARW_CRITICAL(data); \
|
||||
assert(!#cond); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user