forked from xiaozhi/xiaozhi-esp32
v1.8.0: Audio 代码重构与低功耗优化 (#943)
* Reconstruct Audio Code * Remove old IoT implementation * Add MQTT-UDP documentation * OTA升级失败时,可以继续使用
This commit is contained in:
@@ -28,35 +28,35 @@ bool WebsocketProtocol::Start() {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WebsocketProtocol::SendAudio(const AudioStreamPacket& packet) {
|
||||
bool WebsocketProtocol::SendAudio(std::unique_ptr<AudioStreamPacket> packet) {
|
||||
if (websocket_ == nullptr || !websocket_->IsConnected()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (version_ == 2) {
|
||||
std::string serialized;
|
||||
serialized.resize(sizeof(BinaryProtocol2) + packet.payload.size());
|
||||
serialized.resize(sizeof(BinaryProtocol2) + packet->payload.size());
|
||||
auto bp2 = (BinaryProtocol2*)serialized.data();
|
||||
bp2->version = htons(version_);
|
||||
bp2->type = 0;
|
||||
bp2->reserved = 0;
|
||||
bp2->timestamp = htonl(packet.timestamp);
|
||||
bp2->payload_size = htonl(packet.payload.size());
|
||||
memcpy(bp2->payload, packet.payload.data(), packet.payload.size());
|
||||
bp2->timestamp = htonl(packet->timestamp);
|
||||
bp2->payload_size = htonl(packet->payload.size());
|
||||
memcpy(bp2->payload, packet->payload.data(), packet->payload.size());
|
||||
|
||||
return websocket_->Send(serialized.data(), serialized.size(), true);
|
||||
} else if (version_ == 3) {
|
||||
std::string serialized;
|
||||
serialized.resize(sizeof(BinaryProtocol3) + packet.payload.size());
|
||||
serialized.resize(sizeof(BinaryProtocol3) + packet->payload.size());
|
||||
auto bp3 = (BinaryProtocol3*)serialized.data();
|
||||
bp3->type = 0;
|
||||
bp3->reserved = 0;
|
||||
bp3->payload_size = htons(packet.payload.size());
|
||||
memcpy(bp3->payload, packet.payload.data(), packet.payload.size());
|
||||
bp3->payload_size = htons(packet->payload.size());
|
||||
memcpy(bp3->payload, packet->payload.data(), packet->payload.size());
|
||||
|
||||
return websocket_->Send(serialized.data(), serialized.size(), true);
|
||||
} else {
|
||||
return websocket_->Send(packet.payload.data(), packet.payload.size(), true);
|
||||
return websocket_->Send(packet->payload.data(), packet->payload.size(), true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,30 +124,30 @@ bool WebsocketProtocol::OpenAudioChannel() {
|
||||
bp2->timestamp = ntohl(bp2->timestamp);
|
||||
bp2->payload_size = ntohl(bp2->payload_size);
|
||||
auto payload = (uint8_t*)bp2->payload;
|
||||
on_incoming_audio_(AudioStreamPacket{
|
||||
on_incoming_audio_(std::make_unique<AudioStreamPacket>(AudioStreamPacket{
|
||||
.sample_rate = server_sample_rate_,
|
||||
.frame_duration = server_frame_duration_,
|
||||
.timestamp = bp2->timestamp,
|
||||
.payload = std::vector<uint8_t>(payload, payload + bp2->payload_size)
|
||||
});
|
||||
}));
|
||||
} else if (version_ == 3) {
|
||||
BinaryProtocol3* bp3 = (BinaryProtocol3*)data;
|
||||
bp3->type = bp3->type;
|
||||
bp3->payload_size = ntohs(bp3->payload_size);
|
||||
auto payload = (uint8_t*)bp3->payload;
|
||||
on_incoming_audio_(AudioStreamPacket{
|
||||
on_incoming_audio_(std::make_unique<AudioStreamPacket>(AudioStreamPacket{
|
||||
.sample_rate = server_sample_rate_,
|
||||
.frame_duration = server_frame_duration_,
|
||||
.timestamp = 0,
|
||||
.payload = std::vector<uint8_t>(payload, payload + bp3->payload_size)
|
||||
});
|
||||
}));
|
||||
} else {
|
||||
on_incoming_audio_(AudioStreamPacket{
|
||||
on_incoming_audio_(std::make_unique<AudioStreamPacket>(AudioStreamPacket{
|
||||
.sample_rate = server_sample_rate_,
|
||||
.frame_duration = server_frame_duration_,
|
||||
.timestamp = 0,
|
||||
.payload = std::vector<uint8_t>((uint8_t*)data, (uint8_t*)data + len)
|
||||
});
|
||||
}));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -214,9 +214,7 @@ std::string WebsocketProtocol::GetHelloMessage() {
|
||||
#if CONFIG_USE_SERVER_AEC
|
||||
cJSON_AddBoolToObject(features, "aec", true);
|
||||
#endif
|
||||
#if CONFIG_IOT_PROTOCOL_MCP
|
||||
cJSON_AddBoolToObject(features, "mcp", true);
|
||||
#endif
|
||||
cJSON_AddItemToObject(root, "features", features);
|
||||
cJSON_AddStringToObject(root, "transport", "websocket");
|
||||
cJSON* audio_params = cJSON_CreateObject();
|
||||
|
||||
Reference in New Issue
Block a user