The following changes enable support for RTCP client persistent connections used to receive RTSP server ANNOUNCE messages. These in turn update the remote sources in the Browser. - added new process static method to RtspClient class to receive and update source SDP files via DESCRIBE and ANNOUNCE methods. This method can handle persistent connections with the RTSP server and triggers an observer callback when a source SDP file is received or updated. A map is used to track all active RTSP clients. - added new stop and stop_all static methods to RtspClient class respectively to stop a specific RTCP client and to stop all clients. - modified MDNSClient class to call RtspClient::process method when a new Ravenna service is added and the RtspClient::stop method when a service is removed. The RtspClient::stop_all method is called when the daemon terminates. - modified Browser class to receive and handle remote RTSP sources SDP file add and change notifications. This class receives the updates via the RtspClient observer callback - updated documentation
103 lines
3.6 KiB
C++
103 lines
3.6 KiB
C++
//
|
|
// mdns_client.hpp
|
|
//
|
|
// Copyright (c) 2019 2020 Andrea Bondavalli. All rights reserved.
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
//
|
|
|
|
#ifndef _MDNS_CLIENT_HPP_
|
|
#define _MDNS_CLIENT_HPP_
|
|
|
|
#ifdef _USE_AVAHI_
|
|
#include <avahi-client/client.h>
|
|
#include <avahi-client/lookup.h>
|
|
#include <avahi-common/error.h>
|
|
#include <avahi-common/malloc.h>
|
|
#include <avahi-common/thread-watch.h>
|
|
#endif
|
|
|
|
#include <future>
|
|
#include <list>
|
|
#include <shared_mutex>
|
|
#include <thread>
|
|
|
|
#include "config.hpp"
|
|
#include "rtsp_client.hpp"
|
|
|
|
class MDNSClient {
|
|
public:
|
|
MDNSClient(std::shared_ptr<Config> config): config_(config){};
|
|
MDNSClient() = delete;
|
|
MDNSClient(const MDNSClient&) = delete;
|
|
MDNSClient& operator=(const MDNSClient&) = delete;
|
|
virtual ~MDNSClient() { terminate(); };
|
|
|
|
virtual bool init();
|
|
virtual bool terminate();
|
|
|
|
protected:
|
|
virtual void on_change_rtsp_source(const std::string& name,
|
|
const std::string& domain,
|
|
const RtspSource& source){};
|
|
virtual void on_remove_rtsp_source(const std::string& name,
|
|
const std::string& domain){};
|
|
|
|
void process_results();
|
|
std::list<std::future<void> > sources_res_;
|
|
std::mutex sources_res_mutex_;
|
|
|
|
std::atomic_bool running_{false};
|
|
std::shared_ptr<Config> config_;
|
|
|
|
#ifdef _USE_AVAHI_
|
|
/* order is important here */
|
|
std::unique_ptr<AvahiThreadedPoll, decltype(&avahi_threaded_poll_free)>
|
|
poll_{nullptr, &avahi_threaded_poll_free};
|
|
std::unique_ptr<AvahiClient, decltype(&avahi_client_free)>
|
|
client_{nullptr, &avahi_client_free};
|
|
std::unique_ptr<AvahiServiceBrowser, decltype(&avahi_service_browser_free)>
|
|
sb_{nullptr, &avahi_service_browser_free};
|
|
|
|
static void resolve_callback(AvahiServiceResolver* r,
|
|
AvahiIfIndex interface,
|
|
AvahiProtocol protocol,
|
|
AvahiResolverEvent event,
|
|
const char* name,
|
|
const char* type,
|
|
const char* domain,
|
|
const char* host_name,
|
|
const AvahiAddress* address,
|
|
uint16_t port,
|
|
AvahiStringList* txt,
|
|
AvahiLookupResultFlags flags,
|
|
void* userdata);
|
|
static void browse_callback(AvahiServiceBrowser* b,
|
|
AvahiIfIndex interface,
|
|
AvahiProtocol protocol,
|
|
AvahiBrowserEvent event,
|
|
const char* name,
|
|
const char* type,
|
|
const char* domain,
|
|
AvahiLookupResultFlags flags,
|
|
void* userdata);
|
|
static void client_callback(AvahiClient* c,
|
|
AvahiClientState state,
|
|
void* userdata);
|
|
|
|
#endif
|
|
};
|
|
|
|
#endif
|