Skip to content

Commit 8c97660

Browse files
committed
io(rdio): support deleting API upload WAVs after success
1 parent c0da291 commit 8c97660

15 files changed

Lines changed: 320 additions & 9 deletions

File tree

docs/cli.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,16 @@ Tip: If paths or names contain spaces, wrap them in single quotes.
125125
- `--rdio-api-key <key>` Set API key for `/api/trunk-recorder-call-upload`
126126
- `--rdio-upload-timeout-ms <ms>` API timeout per call (default 5000 ms)
127127
- `--rdio-upload-retries <n>` API upload attempts per call (default 1)
128+
- `--rdio-api-delete-after-upload` Delete the per-call WAV after a successful API-only upload
128129
- `-r <files>` Play saved MBE files
129130
- `-c <file>` Save symbol captures to a .bin file
130131
- `-d <dir>` Save raw MBE vocoder frames in this folder
131132
- `-J <file>` Append event log output
132133
- `--frame-log <file>` Append frame-level one-line timestamped traces
134+
135+
For rdio-scanner API uploads that should not persist on disk, use API-only mode with a RAM-backed per-call WAV directory
136+
and post-upload deletion, for example `-7 /dev/shm/dsd-neo-rdio -P --rdio-mode api --rdio-api-delete-after-upload`.
137+
DirWatch modes keep the WAV and JSON files because the watcher needs stable files to ingest.
133138
- `-L <file>` Append LRRP (location) data
134139
- `-Q <file>` Write structured DSP or M17 stream data to `./DSP/<file>`
135140
- `-q` Reverse mute: mute clear audio, unmute encrypted audio

docs/config-system.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,8 +317,11 @@ small subset is exposed as config keys for convenience (for example
317317
| `rdio_api_key` | STRING | rdio API key | (empty) |
318318
| `rdio_upload_timeout_ms` | INT | rdio API timeout per call in ms | `5000` |
319319
| `rdio_upload_retries` | INT | rdio API upload attempts per call | `1` |
320+
| `rdio_api_delete_after_upload` | BOOL | Delete per-call WAV after successful API-only upload | `false` |
320321

321322
Note: `per_call_wav` and `static_wav` are mutually exclusive (same as `-P` vs `-w` on the CLI).
323+
For RAM-backed rdio API staging, set `per_call_wav_dir` to a tmpfs/RAM-disk path and enable
324+
`rdio_api_delete_after_upload`. DirWatch modes keep files for watcher ingestion.
322325

323326
**[dsp] section:**
324327
| Key | Type | Description | Default |

include/dsd-neo/core/opts.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ struct dsd_opts {
104104
int rdio_system_id; //rdio-scanner system id used for API upload
105105
int rdio_upload_timeout_ms;
106106
int rdio_upload_retries;
107+
int rdio_api_delete_after_upload; //delete per-call WAV after successful API-only upload
107108
int serial_baud;
108109
int serial_fd;
109110
int resume;

include/dsd-neo/runtime/config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,7 @@ typedef struct dsdneoUserConfig {
691691
char rdio_api_key[256];
692692
int rdio_upload_timeout_ms;
693693
int rdio_upload_retries;
694+
int rdio_api_delete_after_upload; /* bool */
694695

695696
/* [dsp] */
696697
int has_dsp;

src/core/util/dsd_init.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ initOpts(dsd_opts* opts) {
125125
opts->rdio_system_id = 0;
126126
opts->rdio_upload_timeout_ms = 5000;
127127
opts->rdio_upload_retries = 1;
128+
opts->rdio_api_delete_after_upload = 0;
128129
opts->rdio_api_key[0] = 0;
129130
snprintf(opts->rdio_api_url, sizeof opts->rdio_api_url, "%s", "http://127.0.0.1:3000");
130131
//opts->wav_out_fd = -1;

src/runtime/cli/args.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ dsd_parse_args(int argc, char** argv, dsd_opts* opts, dsd_state* state, int* out
175175
const char* rdio_api_key_cli = NULL;
176176
const char* rdio_upload_timeout_cli = NULL;
177177
const char* rdio_upload_retries_cli = NULL;
178+
int rdio_api_delete_after_upload_cli = 0;
178179
const char* dmr_baofeng_pc5_cli = NULL;
179180
const char* dmr_csi_ee72_cli = NULL;
180181
const char* dmr_vertex_ks_csv_cli = NULL;
@@ -461,6 +462,10 @@ dsd_parse_args(int argc, char** argv, dsd_opts* opts, dsd_state* state, int* out
461462
rdio_upload_retries_cli = argv[++i];
462463
continue;
463464
}
465+
if (strcmp(argv[i], "--rdio-api-delete-after-upload") == 0) {
466+
rdio_api_delete_after_upload_cli = 1;
467+
continue;
468+
}
464469
if (strcmp(argv[i], "--dmr-baofeng-pc5") == 0) {
465470
if (i + 1 >= argc) {
466471
LOG_ERROR("--dmr-baofeng-pc5 requires a hex key value\n");
@@ -820,6 +825,10 @@ dsd_parse_args(int argc, char** argv, dsd_opts* opts, dsd_state* state, int* out
820825
opts->rdio_upload_retries = retries;
821826
LOG_NOTICE("Rdio upload retries: %d\n", opts->rdio_upload_retries);
822827
}
828+
if (rdio_api_delete_after_upload_cli) {
829+
opts->rdio_api_delete_after_upload = 1;
830+
LOG_NOTICE("Rdio API delete-after-upload enabled\n");
831+
}
823832

824833
if (dmr_baofeng_pc5_cli) {
825834
if (baofeng_ap_pc5_keystream_creation(state, dmr_baofeng_pc5_cli) != 0) {

src/runtime/cli/compact.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ dsd_cli_compact_args(int argc, char** argv) {
147147
}
148148
continue;
149149
}
150+
if (strcmp(arg, "--rdio-api-delete-after-upload") == 0) {
151+
continue;
152+
}
150153
if (strcmp(arg, "--dmr-baofeng-pc5") == 0) {
151154
if (i + 1 < argc) {
152155
i++;

src/runtime/cli/usage.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ dsd_cli_usage(void) {
114114
printf(" --rdio-api-key <key> rdio-scanner API key for trunk-recorder-call-upload\n");
115115
printf(" --rdio-upload-timeout-ms <ms> API upload timeout per call (default 5000)\n");
116116
printf(" --rdio-upload-retries <n> API upload retry attempts per call (default 1)\n");
117+
printf(" --rdio-api-delete-after-upload Delete per-call WAV after successful API-only upload\n");
117118
printf(" -a Enable Call Alert Beep\n");
118119
printf(" (Warning! Might be annoying.)\n");
119120
printf(" -J <file> Specify Filename for Event Log Output.\n");

src/runtime/config_schema.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ static const dsdcfg_schema_entry_t s_schema[] = {
8383
{"recording", "rdio_upload_timeout_ms", "rdio API upload timeout in milliseconds", "5000", NULL, DSDCFG_TYPE_INT,
8484
100, 120000, 0},
8585
{"recording", "rdio_upload_retries", "rdio API upload attempts per call", "1", NULL, DSDCFG_TYPE_INT, 0, 10, 0},
86+
{"recording", "rdio_api_delete_after_upload", "Delete per-call WAV after successful API-only upload", "false", NULL,
87+
DSDCFG_TYPE_BOOL, 0, 0, 0},
8688

8789
/* [dsp] section */
8890
{"dsp", "iq_balance", "Enable RTL IQ balance (image suppression)", "false", NULL, DSDCFG_TYPE_BOOL, 0, 0, 0},

src/runtime/config_user.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ user_cfg_reset(dsdneoUserConfig* cfg) {
9797
cfg->rdio_api_key[0] = '\0';
9898
cfg->rdio_upload_timeout_ms = 5000;
9999
cfg->rdio_upload_retries = 1;
100+
cfg->rdio_api_delete_after_upload = 0;
100101

101102
// DSP defaults (match runtime defaults)
102103
cfg->iq_balance = 0;
@@ -711,6 +712,7 @@ dsd_user_config_render_ini(const dsdneoUserConfig* cfg, FILE* out) {
711712
if (cfg->rdio_upload_retries >= 0) {
712713
fprintf(out, "rdio_upload_retries = %d\n", cfg->rdio_upload_retries);
713714
}
715+
fprintf(out, "rdio_api_delete_after_upload = %s\n", cfg->rdio_api_delete_after_upload ? "true" : "false");
714716
fprintf(out, "\n");
715717
}
716718

@@ -943,6 +945,7 @@ dsd_apply_user_config_to_opts_impl(const dsdneoUserConfig* cfg, dsd_opts* opts,
943945
opts->rdio_system_id = cfg->rdio_system_id;
944946
opts->rdio_upload_timeout_ms = cfg->rdio_upload_timeout_ms;
945947
opts->rdio_upload_retries = cfg->rdio_upload_retries;
948+
opts->rdio_api_delete_after_upload = cfg->rdio_api_delete_after_upload;
946949
if (cfg->rdio_api_url[0]) {
947950
snprintf(opts->rdio_api_url, sizeof opts->rdio_api_url, "%s", cfg->rdio_api_url);
948951
opts->rdio_api_url[sizeof opts->rdio_api_url - 1] = '\0';
@@ -1136,6 +1139,7 @@ dsd_snapshot_opts_to_user_config(const dsd_opts* opts, const dsd_state* state, d
11361139
cfg->rdio_api_key[sizeof cfg->rdio_api_key - 1] = '\0';
11371140
cfg->rdio_upload_timeout_ms = opts->rdio_upload_timeout_ms;
11381141
cfg->rdio_upload_retries = opts->rdio_upload_retries;
1142+
cfg->rdio_api_delete_after_upload = opts->rdio_api_delete_after_upload ? 1 : 0;
11391143

11401144
// DSP snapshot (persist runtime toggles via env for the next run)
11411145
cfg->has_dsp = 1;

0 commit comments

Comments
 (0)