Files
Alicho/examples/communication_demo.cpp
2025-10-28 10:27:49 +08:00

250 lines
9.4 KiB
C++

// ================================================================================================
// Audio Backend - 通信系统使用示例
// ================================================================================================
// 描述: 演示通信系统的基本使用方法
// ================================================================================================
#include "communication.h"
#include <iostream>
#include <thread>
#include <chrono>
#include <memory>
#include <string>
using namespace audio_backend;
// ================================================================================================
// 示例消息类型
// ================================================================================================
class AudioControlMessage : public communication::Message {
public:
enum class Command { Start, Stop, Pause, Resume, SetVolume };
AudioControlMessage(Command cmd, float value = 0.0f)
: Message("AudioControl"), command_(cmd), value_(value) {}
Command command() const { return command_; }
float value() const { return value_; }
size_t estimated_size() const override {
return sizeof(*this);
}
Priority priority() const override {
return command_ == Command::Stop ? Priority::High : Priority::Normal;
}
TransportChannel preferred_channel() const override {
return TransportChannel::ZeroMQ;
}
private:
Command command_;
float value_;
};
// ================================================================================================
// 音频数据缓冲区消息
// ================================================================================================
class AudioBufferMessage : public communication::Message {
public:
AudioBufferMessage(const std::vector<float>& samples)
: Message("AudioBuffer"), samples_(samples) {}
const std::vector<float>& samples() const { return samples_; }
size_t estimated_size() const override {
return sizeof(float) * samples_.size();
}
Priority priority() const override { return Priority::High; }
TransportChannel preferred_channel() const override {
// 大音频缓冲区使用共享内存
return samples_.size() > 1024 ? TransportChannel::SharedMemory : TransportChannel::ZeroMQ;
}
private:
std::vector<float> samples_;
};
// ================================================================================================
// 通信事件监听器
// ================================================================================================
class DemoEventListener : public ICommunicationEventListener {
public:
void on_message_sent(const std::string& message_type, size_t size, const std::string& transport) override {
std::cout << "[EVENT] 消息已发送: " << message_type
<< " (大小: " << size << " 字节, 传输: " << transport << ")\n";
}
void on_message_received(const std::string& message_type, size_t size, const std::string& transport) override {
std::cout << "[EVENT] 消息已接收: " << message_type
<< " (大小: " << size << " 字节, 传输: " << transport << ")\n";
}
void on_transport_connected(const std::string& transport_name) override {
std::cout << "[EVENT] 传输已连接: " << transport_name << "\n";
}
void on_transport_disconnected(const std::string& transport_name) override {
std::cout << "[EVENT] 传输已断开: " << transport_name << "\n";
}
void on_communication_error(CommError error, const std::string& description) override {
std::cout << "[ERROR] 通信错误: " << description
<< " (错误代码: " << static_cast<int>(error) << ")\n";
}
void on_statistics_updated(const CommunicationStatistics& stats) override {
std::cout << "[STATS] 统计更新 - 发送: " << stats.total_messages_sent.load()
<< ", 接收: " << stats.total_messages_received.load() << "\n";
}
};
// ================================================================================================
// 共享内存演示
// ================================================================================================
void shared_memory_demo() {
std::cout << "\n=== 共享内存演示 ===\n";
// 配置共享内存
ShmConfig config;
config.segment_name = "demo_shm";
config.segment_size = 1024 * 1024; // 1MB
config.create_if_not_exists = true;
config.remove_on_destroy = true;
// 创建共享内存管理器
auto shm_manager = std::make_unique<ShmManager>(config);
if (shm_manager->initialize() != ShmError::Success) {
std::cerr << "共享内存初始化失败\n";
return;
}
std::cout << "共享内存初始化成功\n";
// 创建环形缓冲区用于音频数据
const size_t buffer_size = 1024;
RingBuffer<float> audio_ring(*shm_manager, "audio_samples", buffer_size);
// 模拟生产者
std::thread producer([&audio_ring]() {
std::cout << "生产者开始工作...\n";
for (int i = 0; i < 100; ++i) {
float sample = std::sin(2.0f * 3.14159f * 440.0f * i / 44100.0f);
while (!audio_ring.try_push(sample)) {
std::this_thread::sleep_for(std::chrono::microseconds(1));
}
if (i % 20 == 0) {
std::cout << "生产者已产生 " << (i + 1) << " 个样本\n";
}
}
std::cout << "生产者完成\n";
});
// 模拟消费者
std::thread consumer([&audio_ring]() {
std::cout << "消费者开始工作...\n";
float sample;
int consumed = 0;
while (consumed < 100) {
if (audio_ring.try_pop(sample)) {
consumed++;
if (consumed % 20 == 0) {
std::cout << "消费者已消费 " << consumed << " 个样本\n";
}
} else {
std::this_thread::sleep_for(std::chrono::microseconds(1));
}
}
std::cout << "消费者完成\n";
});
producer.join();
consumer.join();
// 打印统计信息
auto stats = shm_manager->get_statistics();
std::cout << "共享内存统计:\n";
std::cout << " 总大小: " << stats.total_size << " 字节\n";
std::cout << " 已用大小: " << stats.used_size << " 字节\n";
std::cout << " 空闲大小: " << stats.free_size << " 字节\n";
shm_manager->shutdown();
std::cout << "共享内存演示完成\n";
}
// ================================================================================================
// 主函数
// ================================================================================================
int main() {
std::cout << "====================================\n";
std::cout << "Audio Backend 通信系统演示\n";
std::cout << "====================================\n";
try {
// 初始化通信系统
communication_init::initialize_communication_system();
std::cout << "\n1. 基础通信演示\n";
std::cout << "====================\n";
// 创建和测试基础通信功能
auto manager = communication_utils::create_communication_manager("demo_main");
if (manager->initialize() == CommError::Success) {
std::cout << "通信管理器初始化成功\n";
std::cout << "进程名称: " << manager->config().process_name << "\n";
std::cout << "路由策略: " << static_cast<int>(manager->config().routing_strategy) << "\n";
std::cout << "ZeroMQ支持: " << (manager->config().enable_zmq ? "" : "") << "\n";
std::cout << "共享内存支持: " << (manager->config().enable_shm ? "" : "") << "\n";
manager->shutdown();
} else {
std::cerr << "通信管理器初始化失败\n";
}
std::cout << "\n2. 工厂方法演示\n";
std::cout << "====================\n";
// 演示不同类型的通信管理器
auto zmq_manager = CommManagerFactory::create_zmq_only("zmq_demo", {});
if (zmq_manager) {
std::cout << "ZeroMQ专用管理器创建成功\n";
}
ShmConfig shm_config;
shm_config.segment_name = "demo_segment";
shm_config.segment_size = 1024 * 1024;
auto shm_manager = CommManagerFactory::create_shm_only("shm_demo", shm_config);
if (shm_manager) {
std::cout << "共享内存专用管理器创建成功\n";
}
auto hybrid_manager = CommManagerFactory::create_hybrid("hybrid_demo", {}, shm_config);
if (hybrid_manager) {
std::cout << "混合模式管理器创建成功\n";
}
std::cout << "\n3. 共享内存演示\n";
std::cout << "====================\n";
// 运行共享内存演示
shared_memory_demo();
// 关闭通信系统
communication_init::shutdown_communication_system();
std::cout << "\n====================================\n";
std::cout << "演示完成\n";
std::cout << "====================================\n";
} catch (const std::exception& e) {
std::cerr << "演示过程中发生错误: " << e.what() << "\n";
return 1;
}
return 0;
}