mirror of
https://github.com/ggerganov/ggwave.git
synced 2026-02-07 09:18:01 +08:00
Also, provide a memory-safe overload called ggwave_ndecode() The overload takes an extra parameter that specifies the size of the output buffer and thus limits the size of the Rx payload that can be decoded and stored.
55 lines
1.6 KiB
C
55 lines
1.6 KiB
C
#include "ggwave/ggwave.h"
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#define CHECK(cond) \
|
|
if (!(cond)) { \
|
|
fprintf(stderr, "[%s:%d] Check failed: %s\n", __FILE__, __LINE__, #cond); \
|
|
exit(1); \
|
|
}
|
|
|
|
#define CHECK_T(cond) CHECK(cond)
|
|
#define CHECK_F(cond) CHECK(!(cond))
|
|
|
|
int main() {
|
|
//ggwave_setLogFile(NULL); // disable logging
|
|
ggwave_setLogFile(stdout);
|
|
|
|
ggwave_Parameters parameters = ggwave_getDefaultParameters();
|
|
parameters.sampleFormatInp = GGWAVE_SAMPLE_FORMAT_I16;
|
|
parameters.sampleFormatOut = GGWAVE_SAMPLE_FORMAT_I16;
|
|
|
|
ggwave_Instance instance = ggwave_init(parameters);
|
|
|
|
int ret;
|
|
const char * payload = "test";
|
|
char decoded[16];
|
|
|
|
int n = ggwave_encode(instance, payload, 4, GGWAVE_TX_PROTOCOL_AUDIBLE_FAST, 50, NULL, 1);
|
|
char waveform[n];
|
|
|
|
int ne = ggwave_encode(instance, payload, 4, GGWAVE_TX_PROTOCOL_AUDIBLE_FAST, 50, waveform, 0);
|
|
CHECK(ne > 0);
|
|
|
|
// not enough output buffer size to store the decoded message
|
|
ret = ggwave_ndecode(instance, waveform, sizeof(signed short)*ne, decoded, 3);
|
|
CHECK(ret == -2); // fail
|
|
|
|
// just enough size to store it
|
|
ret = ggwave_ndecode(instance, waveform, sizeof(signed short)*ne, decoded, 4);
|
|
CHECK(ret == 4); // success
|
|
|
|
// unsafe method - will write the decoded output to the output buffer regardless of the size
|
|
ret = ggwave_decode(instance, waveform, sizeof(signed short)*ne, decoded);
|
|
CHECK(ret == 4);
|
|
|
|
decoded[ret] = 0; // null-terminate the received data
|
|
CHECK(strcmp(decoded, payload) == 0);
|
|
|
|
ggwave_free(instance);
|
|
|
|
return 0;
|
|
}
|