Files
vimix/Mixer.cpp
2020-04-23 00:36:32 +02:00

125 lines
2.4 KiB
C++

#include <algorithm>
#include "defines.h"
#include "View.h"
#include "Primitives.h"
#include "Mesh.h"
#include "FrameBuffer.h"
#include "Mixer.h"
Mixer::Mixer()
{
current_view_ = &mixing_;
current_source_ = Source::end();
update_time_ = GST_CLOCK_TIME_NONE;
}
void Mixer::update()
{
// compute dt
if (update_time_ == GST_CLOCK_TIME_NONE)
update_time_ = gst_util_get_timestamp ();
gint64 current_time = gst_util_get_timestamp ();
float dt = static_cast<float>( GST_TIME_AS_MSECONDS(current_time - update_time_) ) * 0.001f;
update_time_ = current_time;
// render of all sources
for( SourceList::iterator it = Source::begin(); it != Source::end(); it++){
(*it)->render();
}
// recursive update of ALL views
render_.update(dt);
mixing_.update(dt);
// TODO other views
}
// draw render view and current view
void Mixer::draw()
{
// always draw render view
render_.draw();
// draw the current view in the window
current_view_->draw();
}
// manangement of sources
void Mixer::createSourceMedia(std::string uri)
{
// create source
MediaSource *m = new MediaSource("s", uri);
// add Nodes to ALL views
//
// Render Node
render_.scene.root()->addChild(m->group(View::RENDERING));
// Mixing Node
mixing_.scene.root()->addChild(m->group(View::MIXING));
// set source as current
current_source_ = Source::begin();
}
void Mixer::setCurrentSource(Node *node)
{
current_source_ = Source::find(node);
}
void Mixer::setCurrentSource(std::string namesource)
{
current_source_ = Source::find(namesource);
}
void Mixer::setCurrentSource(Source *s)
{
current_source_ = Source::find(s);
}
void Mixer::unsetCurrentSource()
{
current_source_ = Source::end();
}
Source *Mixer::currentSource()
{
if ( current_source_ == Source::end() )
return nullptr;
else {
return *(current_source_);
}
}
// management of view
void Mixer::setCurrentView(View::Mode m)
{
switch (m) {
case View::MIXING:
current_view_ = &mixing_;
break;
default:
current_view_ = &mixing_;
break;
}
}
View *Mixer::getView(View::Mode m)
{
switch (m) {
case View::RENDERING:
return &render_;
case View::MIXING:
return &mixing_;
default:
return nullptr;
}
}
View *Mixer::currentView()
{
return current_view_;
}