mirror of
https://github.com/AlexandreRouma/SDRPlusPlus.git
synced 2025-06-25 12:07:49 +02:00
compression
This commit is contained in:
@ -71,6 +71,10 @@ if (MSVC)
|
||||
# WinSock2
|
||||
target_link_libraries(sdrpp_core PUBLIC wsock32 ws2_32)
|
||||
|
||||
# ZSTD
|
||||
find_package(zstd CONFIG REQUIRED)
|
||||
target_link_libraries(sdrpp_core PRIVATE zstd::libzstd_shared)
|
||||
|
||||
else()
|
||||
find_package(PkgConfig)
|
||||
find_package(OpenGL REQUIRED)
|
||||
|
@ -12,11 +12,16 @@ namespace dsp {
|
||||
public:
|
||||
DynamicRangeCompressor() {}
|
||||
|
||||
DynamicRangeCompressor(stream<complex_t>* in, PCMType pcmType) { init(in, pcmType); }
|
||||
DynamicRangeCompressor(stream<complex_t>* in, PCMType pcmType) {
|
||||
init(in, pcmType);
|
||||
}
|
||||
|
||||
void init(stream<complex_t>* in, PCMType pcmType) {
|
||||
_in = in;
|
||||
_pcmType = pcmType;
|
||||
|
||||
out.setBufferSize((sizeof(dsp::complex_t) * STREAM_BUFFER_SIZE) + 8);
|
||||
|
||||
generic_block<DynamicRangeCompressor>::registerInput(_in);
|
||||
generic_block<DynamicRangeCompressor>::registerOutput(&out);
|
||||
generic_block<DynamicRangeCompressor>::_block_init = true;
|
||||
|
@ -31,6 +31,13 @@ namespace dsp {
|
||||
volk_free(readBuf);
|
||||
}
|
||||
|
||||
void setBufferSize(int samples) {
|
||||
volk_free(writeBuf);
|
||||
volk_free(readBuf);
|
||||
writeBuf = (T*)volk_malloc(samples * sizeof(T), volk_get_alignment());
|
||||
readBuf = (T*)volk_malloc(samples * sizeof(T), volk_get_alignment());
|
||||
}
|
||||
|
||||
bool swap(int size) {
|
||||
{
|
||||
// Wait to either swap or stop
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <gui/smgui.h>
|
||||
#include <utils/optionlist.h>
|
||||
#include <dsp/compression.h>
|
||||
#include <zstd.h>
|
||||
|
||||
namespace server {
|
||||
dsp::stream<dsp::complex_t> dummyInput;
|
||||
@ -35,11 +36,14 @@ namespace server {
|
||||
|
||||
SmGui::DrawListElem dummyElem;
|
||||
|
||||
ZSTD_CCtx* cctx;
|
||||
|
||||
net::Listener listener;
|
||||
|
||||
OptionList<std::string, std::string> sourceList;
|
||||
int sourceId = 0;
|
||||
bool running = false;
|
||||
bool compression = false;
|
||||
double sampleRate = 1000000.0;
|
||||
|
||||
int main() {
|
||||
@ -68,9 +72,9 @@ namespace server {
|
||||
bb_pkt_hdr = (PacketHeader*)bbuf;
|
||||
bb_pkt_data = &bbuf[sizeof(PacketHeader)];
|
||||
|
||||
// Terminate config manager
|
||||
core::configManager.disableAutoSave();
|
||||
core::configManager.save();
|
||||
// Initialize compressor
|
||||
cctx = ZSTD_createCCtx();
|
||||
ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, 1);
|
||||
|
||||
core::configManager.acquire();
|
||||
std::string modulesDir = core::configManager.conf["modulesDirectory"];
|
||||
@ -183,6 +187,7 @@ namespace server {
|
||||
// Perform settings reset
|
||||
sigpath::sourceManager.stop();
|
||||
comp.setPCMType(dsp::PCM_TYPE_I16);
|
||||
compression = false;
|
||||
|
||||
sendSampleRate(sampleRate);
|
||||
|
||||
@ -218,14 +223,20 @@ namespace server {
|
||||
}
|
||||
|
||||
void _testServerHandler(uint8_t* data, int count, void* ctx) {
|
||||
// Build data packet
|
||||
PacketHeader* hdr = (PacketHeader*)bbuf;
|
||||
hdr->type = PACKET_TYPE_BASEBAND;
|
||||
hdr->size = sizeof(PacketHeader) + count;
|
||||
memcpy(&bbuf[sizeof(PacketHeader)], data, count);
|
||||
// Compress data if needed and fill out header fields
|
||||
if (compression) {
|
||||
bb_pkt_hdr->type = PACKET_TYPE_BASEBAND_COMPRESSED;
|
||||
bb_pkt_hdr->size = sizeof(PacketHeader) + (uint32_t)ZSTD_compress2(cctx, &bbuf[sizeof(PacketHeader)], SERVER_MAX_PACKET_SIZE, data, count);
|
||||
|
||||
}
|
||||
else {
|
||||
bb_pkt_hdr->type = PACKET_TYPE_BASEBAND;
|
||||
bb_pkt_hdr->size = sizeof(PacketHeader) + count;
|
||||
memcpy(&bbuf[sizeof(PacketHeader)], data, count);
|
||||
}
|
||||
|
||||
// Write to network
|
||||
if (client && client->isOpen()) { client->write(hdr->size, bbuf); }
|
||||
if (client && client->isOpen()) { client->write(bb_pkt_hdr->size, bbuf); }
|
||||
}
|
||||
|
||||
void setInput(dsp::stream<dsp::complex_t>* stream) {
|
||||
@ -281,6 +292,9 @@ namespace server {
|
||||
dsp::PCMType type = (dsp::PCMType)*(uint8_t*)data;
|
||||
comp.setPCMType(type);
|
||||
}
|
||||
else if (cmd == COMMAND_SET_COMPRESSION && len == 1) {
|
||||
compression = *(uint8_t*)data;
|
||||
}
|
||||
else {
|
||||
spdlog::error("Invalid Command: {0} (len = {1})", cmd, len);
|
||||
sendError(ERROR_INVALID_COMMAND);
|
||||
|
@ -11,6 +11,7 @@ namespace server {
|
||||
PACKET_TYPE_COMMAND,
|
||||
PACKET_TYPE_COMMAND_ACK,
|
||||
PACKET_TYPE_BASEBAND,
|
||||
PACKET_TYPE_BASEBAND_COMPRESSED,
|
||||
PACKET_TYPE_VFO,
|
||||
PACKET_TYPE_FFT,
|
||||
PACKET_TYPE_ERROR
|
||||
@ -25,6 +26,7 @@ namespace server {
|
||||
COMMAND_SET_FREQUENCY,
|
||||
COMMAND_GET_SAMPLERATE,
|
||||
COMMAND_SET_SAMPLE_TYPE,
|
||||
COMMAND_SET_COMPRESSION,
|
||||
|
||||
// Server to client
|
||||
COMMAND_SET_SAMPLERATE = 0x80,
|
||||
|
Reference in New Issue
Block a user