#include #include #include SinkManager::SinkManager() { } SinkManager::Stream::Stream(dsp::stream* in, const Event::EventHandler& srChangeHandler, float sampleRate) { _in = in; srChange.bindHandler(srChangeHandler); _sampleRate = sampleRate; splitter.init(_in); } void SinkManager::Stream::setInput(dsp::stream* in) { std::lock_guard lck(ctrlMtx); _in = in; splitter.setInput(_in); } dsp::stream* SinkManager::Stream::bindStream() { dsp::stream* stream = new dsp::stream; splitter.bindStream(stream); return stream; } void SinkManager::Stream::unbindStream(dsp::stream* stream) { splitter.unbindStream(stream); delete stream; } void SinkManager::Stream::setSampleRate(float sampleRate) { std::lock_guard lck(ctrlMtx); _sampleRate = sampleRate; srChange.emit(sampleRate); } void SinkManager::registerSinkProvider(std::string name, SinkProvider provider) { if (providers.find(name) != providers.end()) { spdlog::error("Cannot create sink provider '{0}', this name is already taken", name); return; } providers[name] = provider; } void SinkManager::registerStream(std::string name, SinkManager::Stream* stream) { if (streams.find(name) != streams.end()) { spdlog::error("Cannot register stream '{0}', this name is already taken", name); return; } core::configManager.aquire(); std::string providerName = core::configManager.conf["defaultSink"]; core::configManager.release(); SinkManager::SinkProvider provider; if (providers.find(providerName) == providers.end()) { // TODO: get default } else { provider = providers[providerName]; } stream->sink = provider.create(stream, provider.ctx); } void SinkManager::unregisterStream(std::string name) { if (streams.find(name) == streams.end()) { spdlog::error("Cannot unregister stream '{0}', this stream doesn't exist", name); return; } SinkManager::Stream* stream = streams[name]; delete stream->sink; delete stream; } dsp::stream* SinkManager::bindStream(std::string name) { if (streams.find(name) == streams.end()) { spdlog::error("Cannot bind to stream '{0}'. Stream doesn't exist", name); return NULL; } return streams[name]->bindStream(); } void SinkManager::unbindStream(std::string name, dsp::stream* stream) { if (streams.find(name) == streams.end()) { spdlog::error("Cannot unbind from stream '{0}'. Stream doesn't exist", name); return; } streams[name]->unbindStream(stream); } void SinkManager::showMenu() { for (auto const& [name, stream] : streams) { } }