#include #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::start() { sink->start(); } void SinkManager::Stream::stop() { sink->stop(); } 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; providerNames.push_back(name); } 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; } void SinkManager::startStream(std::string name) { if (streams.find(name) == streams.end()) { spdlog::error("Cannot start stream '{0}', this stream doesn't exist", name); return; } streams[name]->start(); } void SinkManager::stopStream(std::string name) { if (streams.find(name) == streams.end()) { spdlog::error("Cannot stop stream '{0}', this stream doesn't exist", name); return; } streams[name]->stop(); } 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::setStreamSink(std::string name, std::string providerName) { } void SinkManager::showMenu() { float menuWidth = ImGui::GetContentRegionAvailWidth(); int count = 0; int maxCount = streams.size(); std::string provStr = ""; for (auto const& [name, provider] : providers) { provStr += name; provStr += '\0'; } for (auto const& [name, stream] : streams) { ImGui::SetCursorPosX((menuWidth / 2.0f) - (ImGui::CalcTextSize(name.c_str()).x / 2.0f)); ImGui::Text("%s", name.c_str()); if (ImGui::Combo("", &stream->providerId, provStr.c_str())) { } stream->sink->menuHandler(); ImGui::PopItemWidth(); count++; if (count < maxCount) { ImGui::Spacing(); ImGui::Separator(); } ImGui::Spacing(); } }