From 50c6a857bb3114d9c6e3198c465689ad866f8dea Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Sat, 11 Jul 2026 22:54:40 +0200 Subject: [PATCH] runtime changable streams --- src/fs.c | 6 +++--- src/lua_api.c | 5 +++-- src/rds.c | 2 ++ src/rds.h | 4 ++-- src/rds95.c | 24 +++++++----------------- 5 files changed, 17 insertions(+), 24 deletions(-) diff --git a/src/fs.c b/src/fs.c index c509277..9dc9110 100644 --- a/src/fs.c +++ b/src/fs.c @@ -15,9 +15,9 @@ void encoder_saveToFile(RDSEncoder *enc) { memcpy(tempEncoder.data, enc->data, sizeof(RDSData) * PROGRAMS); tempEncoder.program = enc->program; - tempEncoder.enabled_streams = enc->enabled_streams; + tempEncoder.streams = enc->streams; - RDSEncoderFile rdsEncoderfile = {.file_starter = 225, .file_middle = 160, .file_ender = 95, .program = tempEncoder.program, .enabled_streams = tempEncoder.enabled_streams}; + RDSEncoderFile rdsEncoderfile = {.file_starter = 225, .file_middle = 160, .file_ender = 95, .program = tempEncoder.program, .streams = tempEncoder.streams}; memcpy(&rdsEncoderfile.data, &tempEncoder.data, sizeof(RDSData)*PROGRAMS); rdsEncoderfile.crc = crc16_ccitt((char *)&rdsEncoderfile, offsetof(RDSEncoderFile, crc)); @@ -57,6 +57,6 @@ int encoder_loadFromFile(RDSEncoder *enc) { memcpy(&(enc->data), &(rdsEncoderfile.data), sizeof(RDSData)*PROGRAMS); enc->program = rdsEncoderfile.program; - enc->enabled_streams = rdsEncoderfile.enabled_streams; + enc->streams = rdsEncoderfile.streams; return 0; } \ No newline at end of file diff --git a/src/lua_api.c b/src/lua_api.c index 5b55f6f..26085b4 100644 --- a/src/lua_api.c +++ b/src/lua_api.c @@ -125,12 +125,13 @@ int lua_get_rds_##name(lua_State *L) { \ } int lua_set_rds_streams(lua_State *L) { - enc->enabled_streams = luaL_checkinteger(L, 1); + if(enc->streams > 4) return luaL_error(L, "more than 4"); + enc->streams = luaL_checkinteger(L, 1); return 0; } int lua_get_rds_streams(lua_State *L) { - lua_pushinteger(L, enc->enabled_streams); + lua_pushinteger(L, enc->streams); return 1; } diff --git a/src/rds.c b/src/rds.c index e8900b6..9abe622 100644 --- a/src/rds.c +++ b/src/rds.c @@ -242,6 +242,8 @@ void set_rds_defaults(RDSEncoder* enc, uint8_t program) { enc->data[program].pi = 0xFFFF; strcpy((char *)enc->data[program].ps, "* RDS * "); enc->data[program].rt_enabled = 1; + + enc->streams = 1; memset(enc->data[program].rt, ' ', 64); diff --git a/src/rds.h b/src/rds.h index 061cc77..5a0a931 100644 --- a/src/rds.h +++ b/src/rds.h @@ -131,14 +131,14 @@ typedef struct { RDSData data[PROGRAMS]; RDSState state[PROGRAMS]; uint8_t program : 3; - uint8_t enabled_streams : 3; + uint8_t streams : 3; } RDSEncoder; typedef struct { uint8_t file_starter; // Always is 225 first polish radio programme am frequency RDSData data[PROGRAMS]; uint8_t file_middle; // Always is 160, average of both uint8_t program : 3; - uint8_t enabled_streams : 3; + uint8_t streams : 3; uint8_t file_ender; // Always is 95 my freq uint16_t crc; } RDSEncoderFile; diff --git a/src/rds95.c b/src/rds95.c index 2037dcf..ffd7a89 100644 --- a/src/rds95.c +++ b/src/rds95.c @@ -13,8 +13,6 @@ #include "lib.h" #define DEFAULT_CONFIG_PATH "/etc/rds95.conf" -#define DEFAULT_STREAMS 1 -#define MAX_STREAMS 4 static struct timespec next_deadline; static int deadline_initialized = 0; @@ -69,7 +67,6 @@ static inline void show_help(char *name) { typedef struct { uint16_t udp_port; uint16_t tcp_port; - uint8_t num_streams : 3; uint8_t asciig : 1; } RDS95_Config; @@ -80,15 +77,11 @@ static int config_handler(void* user, const char* section, const char* name, con if (MATCH("rds95", "udp_port")) config->udp_port = (uint16_t)atoi(value); else if (MATCH("rds95", "tcp_port")) config->tcp_port = (uint16_t)atoi(value); - else if (MATCH("rds95", "streams")) { - int streams = atoi(value); - if (streams > MAX_STREAMS || streams == 0) return 0; - config->num_streams = (uint8_t)streams; - } else if (MATCH("rds95", "asciig")) { + else if (MATCH("rds95", "asciig")) { int asciig = atoi(value); if (asciig > 1 || asciig < 0) return 0; config->asciig = (uint8_t)asciig; - } else return 0; + } return 1; } @@ -99,7 +92,6 @@ int main(int argc, char **argv) { RDS95_Config config = { .udp_port = 0, .tcp_port = 0, - .num_streams = DEFAULT_STREAMS, .asciig = 0 }; @@ -141,8 +133,6 @@ int main(int argc, char **argv) { return res; } - printf("Using %d RDS stream(s)\n", config.num_streams); - pthread_attr_init(&attr); struct sigaction sa_stop; @@ -188,15 +178,15 @@ int main(int argc, char **argv) { IPC_Client client; if (ipc_connect(&client, "/etc/fm95/ctl.socket") < 0) goto exit; - uint8_t sent_num = config.num_streams; ipc_send_streams(&client, sent_num); + uint8_t sent_num = rdsEncoder.streams; ipc_send_streams(&client, sent_num); while (!stop_rds) { - for (uint8_t s = 0; s < config.num_streams; s++) { + for (uint8_t s = 0; s < rdsEncoder.streams; s++) { ipc_send_bits(&client, &rdsEncoder, s); } sleep_until_next_group(BITS_PER_GROUP, 1187.5); - if(config.num_streams != sent_num) { - sent_num = config.num_streams; ipc_send_streams(&client, sent_num); + if(rdsEncoder.streams != sent_num) { + sent_num = rdsEncoder.streams; ipc_send_streams(&client, sent_num); } } @@ -211,7 +201,7 @@ int main(int argc, char **argv) { while(!stop_rds) { if (is_tcp_server_running()) accept_tcp_clients(); - for(uint8_t i = 0; i < config.num_streams; i++) { + for(uint8_t i = 0; i < rdsEncoder.streams; i++) { get_rds_group(&rdsEncoder, &group, i); int offset = 0;