diff --git a/server/streamServer.cpp b/server/streamServer.cpp index 14bcc322..00b8e35d 100644 --- a/server/streamServer.cpp +++ b/server/streamServer.cpp @@ -294,10 +294,10 @@ void StreamServer::onMessageReceived(StreamSession* connection, const msg::BaseM // Assign and update stream PcmStreamPtr stream = streamManager_->getStream(client->config.streamId); - if (stream == nullptr) + if (!stream) { stream = streamManager_->getDefaultStream(); - client->config.streamId = stream->getUri().id(); + client->config.streamId = stream->getId(); } Config::instance().save(); @@ -384,8 +384,8 @@ void StreamServer::start() //TODO: check uniqueness of the stream for (const auto& streamUri: settings_.pcmStreams) { - PcmStream* stream = streamManager_->addStream(streamUri); - if (stream != NULL) + PcmStreamPtr stream = streamManager_->addStream(streamUri); + if (stream) logO << "Stream: " << stream->getUri().toJson() << "\n"; } streamManager_->start(); diff --git a/server/streamreader/pcmStream.cpp b/server/streamreader/pcmStream.cpp index 1e7a0873..f8328c1e 100644 --- a/server/streamreader/pcmStream.cpp +++ b/server/streamreader/pcmStream.cpp @@ -77,6 +77,12 @@ const std::string& PcmStream::getName() const } +const std::string& PcmStream::getId() const +{ + return getName(); +} + + const SampleFormat& PcmStream::getSampleFormat() const { return sampleFormat_; @@ -154,7 +160,7 @@ json PcmStream::toJson() const json j = { {"uri", uri_.toJson()}, - {"id", uri_.id()}, + {"id", getId()}, {"status", state} }; return j; diff --git a/server/streamreader/pcmStream.h b/server/streamreader/pcmStream.h index d76d3f00..7a90a794 100644 --- a/server/streamreader/pcmStream.h +++ b/server/streamreader/pcmStream.h @@ -78,6 +78,7 @@ public: virtual const StreamUri& getUri() const; virtual const std::string& getName() const; + virtual const std::string& getId() const; virtual const SampleFormat& getSampleFormat() const; virtual ReaderState getState() const; diff --git a/server/streamreader/streamManager.cpp b/server/streamreader/streamManager.cpp index c161849b..d39b587a 100644 --- a/server/streamreader/streamManager.cpp +++ b/server/streamreader/streamManager.cpp @@ -36,7 +36,7 @@ StreamManager::StreamManager(PcmListener* pcmListener, const std::string& defaul } -PcmStream* StreamManager::addStream(const std::string& uri) +PcmStreamPtr StreamManager::addStream(const std::string& uri) { StreamUri streamUri(uri); @@ -54,38 +54,44 @@ PcmStream* StreamManager::addStream(const std::string& uri) // for (auto kv: streamUri.query) // logD << "key: '" << kv.first << "' value: '" << kv.second << "'\n"; + PcmStreamPtr stream(nullptr); if (streamUri.scheme == "pipe") { - streams_.push_back(make_shared(pcmListener_, streamUri)); - return streams_.back().get(); + stream = make_shared(pcmListener_, streamUri); } else if (streamUri.scheme == "file") { - streams_.push_back(make_shared(pcmListener_, streamUri)); - return streams_.back().get(); + stream = make_shared(pcmListener_, streamUri); } else if (streamUri.scheme == "process") { - streams_.push_back(make_shared(pcmListener_, streamUri)); - return streams_.back().get(); + stream = make_shared(pcmListener_, streamUri); } else if (streamUri.scheme == "spotify") { - streams_.push_back(make_shared(pcmListener_, streamUri)); - return streams_.back().get(); + stream = make_shared(pcmListener_, streamUri); } else if (streamUri.scheme == "airplay") { - streams_.push_back(make_shared(pcmListener_, streamUri)); - return streams_.back().get(); + stream = make_shared(pcmListener_, streamUri); } else { throw SnapException("Unknown stream type: " + streamUri.scheme); } - return NULL; + if (stream) + { + for (auto s: streams_) + { + if (s->getName() == stream->getName()) + throw SnapException("Stream with name \"" + stream->getName() + "\" already exists"); + } + streams_.push_back(stream); + } + + return stream; } @@ -108,7 +114,7 @@ const PcmStreamPtr StreamManager::getStream(const std::string& id) { for (auto stream: streams_) { - if (stream->getUri().id() == id) + if (stream->getId() == id) return stream; } return nullptr; diff --git a/server/streamreader/streamManager.h b/server/streamreader/streamManager.h index 2dc8512f..b3755323 100644 --- a/server/streamreader/streamManager.h +++ b/server/streamreader/streamManager.h @@ -13,7 +13,7 @@ class StreamManager public: StreamManager(PcmListener* pcmListener, const std::string& defaultSampleFormat, const std::string& defaultCodec, size_t defaultReadBufferMs = 20); - PcmStream* addStream(const std::string& uri); + PcmStreamPtr addStream(const std::string& uri); void start(); void stop(); const std::vector& getStreams(); diff --git a/server/streamreader/streamUri.cpp b/server/streamreader/streamUri.cpp index f6a70fc0..051c13aa 100644 --- a/server/streamreader/streamUri.cpp +++ b/server/streamreader/streamUri.cpp @@ -41,15 +41,6 @@ StreamUri::StreamUri(const std::string& streamUri) string decodedUri = uriDecode(uri); logD << "StreamUri: " << decodedUri << "\n"; - id_ = decodedUri; - pos = id_.find('?'); - if (pos != string::npos) - id_ = id_.substr(0, pos); - pos = id_.find('#'); - if (pos != string::npos) - id_ = id_.substr(0, pos); - logD << "id: '" << id_ << "'\n"; - string tmp(decodedUri); pos = tmp.find(':'); @@ -98,8 +89,6 @@ StreamUri::StreamUri(const std::string& streamUri) string key = trim_copy(kv.substr(0, pos)); string value = trim_copy(kv.substr(pos+1)); query[key] = value; - if (key == "id") - id_ = value; } } } @@ -119,12 +108,6 @@ json StreamUri::toJson() const } -std::string StreamUri::id() const -{ - return id_; -} - - std::string StreamUri::getQuery(const std::string& key, const std::string& def) const { auto iter = query.find(key); diff --git a/server/streamreader/streamUri.h b/server/streamreader/streamUri.h index 4fdeb2c8..b595f79b 100644 --- a/server/streamreader/streamUri.h +++ b/server/streamreader/streamUri.h @@ -49,9 +49,6 @@ struct StreamUri std::string id() const; json toJson() const; std::string getQuery(const std::string& key, const std::string& def = "") const; - -private: - std::string id_; };