80 lines
3.0 KiB
C++
80 lines
3.0 KiB
C++
#pragma once
|
|
|
|
#include <memory>
|
|
#include <optional>
|
|
#include <string>
|
|
|
|
namespace ts::server {
|
|
class SpeakingClient;
|
|
}
|
|
|
|
namespace ts::rtc {
|
|
typedef uint32_t RTCClientId;
|
|
typedef uint32_t RTCChannelId;
|
|
typedef uint32_t RTCStreamId;
|
|
|
|
extern std::string_view version();
|
|
extern bool initialize(std::string& /* error */);
|
|
|
|
enum struct ChannelAssignResult {
|
|
Success,
|
|
ClientUnknown,
|
|
TargetChannelUnknown,
|
|
UnknownError
|
|
};
|
|
|
|
enum struct BroadcastStartResult {
|
|
Success,
|
|
InvalidClient,
|
|
ClientHasNoChannel,
|
|
InvalidBroadcastType,
|
|
InvalidStreamId,
|
|
UnknownError
|
|
};
|
|
|
|
class NativeAudioSourceSupplier;
|
|
class Server {
|
|
public:
|
|
Server();
|
|
~Server();
|
|
|
|
RTCClientId create_rtp_client(const std::shared_ptr<server::SpeakingClient>& /* client */);
|
|
RTCClientId create_native_client(const std::shared_ptr<server::SpeakingClient>& /* client */);
|
|
void destroy_client(RTCClientId /* client id */);
|
|
|
|
/* RTC client actions */
|
|
void reset_rtp_session(RTCClientId /* client */);
|
|
bool apply_remote_description(std::string& /* error */, RTCClientId /* client id */, uint32_t /* mode */, const std::string_view& /* description */);
|
|
bool generate_local_description(RTCClientId /* client id */, std::string& /* result */);
|
|
bool add_ice_candidate(std::string& /* error */, RTCClientId /* client id */, uint32_t /* media line */, const std::string_view& /* description */);
|
|
void ice_candidates_finished(RTCClientId /* client id */);
|
|
|
|
/* Native client actions */
|
|
std::optional<NativeAudioSourceSupplier> create_audio_source_supplier_sender(RTCClientId /* client id */);
|
|
|
|
/* channel actions */
|
|
uint32_t create_channel();
|
|
ChannelAssignResult assign_channel(RTCClientId /* client id */, RTCChannelId /* channel id */);
|
|
BroadcastStartResult start_broadcast(RTCClientId /* client id */, uint8_t /* broadcast type */, RTCStreamId /* stream id */);
|
|
void destroy_channel(RTCChannelId /* channel id */);
|
|
private:
|
|
void* server_ptr{nullptr};
|
|
};
|
|
|
|
class NativeAudioSourceSupplier {
|
|
public:
|
|
explicit NativeAudioSourceSupplier() : sender_ptr{nullptr} {}
|
|
explicit NativeAudioSourceSupplier(void*);
|
|
virtual ~NativeAudioSourceSupplier() noexcept;
|
|
|
|
NativeAudioSourceSupplier(const NativeAudioSourceSupplier&) = delete;
|
|
NativeAudioSourceSupplier(NativeAudioSourceSupplier&& other) noexcept;
|
|
|
|
inline void reset(NativeAudioSourceSupplier& other) {
|
|
std::swap(other.sender_ptr, this->sender_ptr);
|
|
}
|
|
void send_audio(uint16_t /* seq no */, bool /* marked */, uint32_t /* timestamp */, uint8_t /* codec */, const std::string_view& /* data */);
|
|
private:
|
|
void* sender_ptr;
|
|
};
|
|
} |