mirror of
https://github.com/radio95-rnt/fm95.git
synced 2026-02-26 19:23:51 +01:00
add reloading on SIGHUP signals, but these will not touch the audio runtime
This commit is contained in:
97
src/fm95.c
97
src/fm95.c
@@ -26,6 +26,7 @@
|
|||||||
#define DEFAULT_RDS_VOLUME_STEP 0.9f // 90%, so RDS2 stream 4 is 90% of stream 3 which is 90% of stream 2, which again is 90% of stream 1...
|
#define DEFAULT_RDS_VOLUME_STEP 0.9f // 90%, so RDS2 stream 4 is 90% of stream 3 which is 90% of stream 2, which again is 90% of stream 1...
|
||||||
|
|
||||||
static volatile sig_atomic_t to_run = 1;
|
static volatile sig_atomic_t to_run = 1;
|
||||||
|
static volatile sig_atomic_t to_reload = 0;
|
||||||
|
|
||||||
inline float hard_clip(float sample, float threshold) { return fmaxf(-threshold, fminf(threshold, sample)); }
|
inline float hard_clip(float sample, float threshold) { return fmaxf(-threshold, fminf(threshold, sample)); }
|
||||||
|
|
||||||
@@ -103,6 +104,12 @@ static void stop(int signum) {
|
|||||||
printf("\nReceived stop signal.\n");
|
printf("\nReceived stop signal.\n");
|
||||||
to_run = 0;
|
to_run = 0;
|
||||||
}
|
}
|
||||||
|
static void reload(int signum) {
|
||||||
|
(void)signum;
|
||||||
|
printf("\nReceived reload signal.\n");
|
||||||
|
to_run = 0;
|
||||||
|
to_reload = 1;
|
||||||
|
}
|
||||||
|
|
||||||
void show_help(char *name) {
|
void show_help(char *name) {
|
||||||
printf(
|
printf(
|
||||||
@@ -113,7 +120,14 @@ void show_help(char *name) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cleanup_runtime(FM95_Runtime *rt, bool mpx_on, bool rds_on) {
|
void cleanup_runtime(FM95_Runtime* runtime, FM95_Config config) {
|
||||||
|
if(config.lpf_cutoff != 0) {
|
||||||
|
iirfilt_rrrf_destroy(runtime->lpf_l);
|
||||||
|
iirfilt_rrrf_destroy(runtime->lpf_r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cleanup_audio_runtime(FM95_Runtime *rt, bool mpx_on, bool rds_on) {
|
||||||
free_PulseInputDevice(&rt->input_device);
|
free_PulseInputDevice(&rt->input_device);
|
||||||
if (mpx_on) free_PulseInputDevice(&rt->mpx_device);
|
if (mpx_on) free_PulseInputDevice(&rt->mpx_device);
|
||||||
if (rds_on) {
|
if (rds_on) {
|
||||||
@@ -128,8 +142,6 @@ int run_fm95(const FM95_Config config, FM95_Runtime* runtime) {
|
|||||||
bool rds_on = (runtime->rds_device.initialized == 1);
|
bool rds_on = (runtime->rds_device.initialized == 1);
|
||||||
|
|
||||||
if(config.calibration != 0) {
|
if(config.calibration != 0) {
|
||||||
init_oscillator(&runtime->osc, (config.calibration == 2) ? 60 : 400, config.sample_rate);
|
|
||||||
|
|
||||||
int pulse_error;
|
int pulse_error;
|
||||||
float output[BUFFER_SIZE];
|
float output[BUFFER_SIZE];
|
||||||
|
|
||||||
@@ -149,30 +161,9 @@ int run_fm95(const FM95_Config config, FM95_Runtime* runtime) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
init_oscillator(&runtime->osc, (config.stereo == 2) ? 7812.5 : 4750, config.sample_rate);
|
|
||||||
|
|
||||||
if(config.lpf_cutoff != 0) {
|
|
||||||
runtime->lpf_l = iirfilt_rrrf_create_prototype(LIQUID_IIRDES_CHEBY2, LIQUID_IIRDES_LOWPASS, LIQUID_IIRDES_SOS, config.lpf_order, (config.lpf_cutoff/config.sample_rate), 0.0f, 1.0f, 60.0f);
|
|
||||||
runtime->lpf_r = iirfilt_rrrf_create_prototype(LIQUID_IIRDES_CHEBY2, LIQUID_IIRDES_LOWPASS, LIQUID_IIRDES_SOS, config.lpf_order, (config.lpf_cutoff/config.sample_rate), 0.0f, 1.0f, 60.0f);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(config.preemphasis != 0) {
|
|
||||||
init_preemphasis(&runtime->preemp_l, config.preemphasis, config.sample_rate, config.preemp_unity_freq);
|
|
||||||
init_preemphasis(&runtime->preemp_r, config.preemphasis, config.sample_rate, config.preemp_unity_freq);
|
|
||||||
}
|
|
||||||
|
|
||||||
init_bs412(&runtime->bs412, config.mpx_deviation, config.mpx_power, config.bs412_attack, config.bs412_release, config.bs412_max, config.sample_rate);
|
|
||||||
|
|
||||||
if(config.tilt != 0) tilt_init(&runtime->tilter, config.tilt);
|
|
||||||
|
|
||||||
init_stereo_encoder(&runtime->stencode, 4.0f, &runtime->osc, (config.stereo == 2), config.volumes.mono, config.volumes.pilot, config.volumes.stereo);
|
|
||||||
|
|
||||||
if(config.agc_max != 0.0) initAGC(&runtime->agc, config.sample_rate, config.agc_target, config.agc_min, config.agc_max, config.agc_attack, config.agc_release);
|
|
||||||
|
|
||||||
int pulse_error;
|
int pulse_error;
|
||||||
|
|
||||||
float audio_stereo_input[BUFFER_SIZE*2]; // Stereo
|
float audio_stereo_input[BUFFER_SIZE*2]; // Stereo
|
||||||
if(rds_on) memset(runtime->rds_in, 0, sizeof(float) * BUFFER_SIZE * config.rds_streams);
|
|
||||||
|
|
||||||
float mpx_in[BUFFER_SIZE] = {0};
|
float mpx_in[BUFFER_SIZE] = {0};
|
||||||
float output[BUFFER_SIZE];
|
float output[BUFFER_SIZE];
|
||||||
@@ -250,10 +241,6 @@ int run_fm95(const FM95_Config config, FM95_Runtime* runtime) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(config.lpf_cutoff != 0) {
|
|
||||||
iirfilt_rrrf_destroy(runtime->lpf_l);
|
|
||||||
iirfilt_rrrf_destroy(runtime->lpf_r);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -439,6 +426,34 @@ int setup_audio(FM95_Runtime* runtime, const FM95_DeviceNames dv_names, const FM
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void init_runtime(FM95_Runtime* runtime, FM95_Config config, bool rds_on) {
|
||||||
|
if(config.calibration != 0) {
|
||||||
|
init_oscillator(&runtime->osc, (config.calibration == 2) ? 60 : 400, config.sample_rate);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else init_oscillator(&runtime->osc, (config.stereo == 2) ? 7812.5 : 4750, config.sample_rate);
|
||||||
|
|
||||||
|
if(config.lpf_cutoff != 0) {
|
||||||
|
runtime->lpf_l = iirfilt_rrrf_create_prototype(LIQUID_IIRDES_CHEBY2, LIQUID_IIRDES_LOWPASS, LIQUID_IIRDES_SOS, config.lpf_order, (config.lpf_cutoff/config.sample_rate), 0.0f, 1.0f, 60.0f);
|
||||||
|
runtime->lpf_r = iirfilt_rrrf_create_prototype(LIQUID_IIRDES_CHEBY2, LIQUID_IIRDES_LOWPASS, LIQUID_IIRDES_SOS, config.lpf_order, (config.lpf_cutoff/config.sample_rate), 0.0f, 1.0f, 60.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(config.preemphasis != 0) {
|
||||||
|
init_preemphasis(&runtime->preemp_l, config.preemphasis, config.sample_rate, config.preemp_unity_freq);
|
||||||
|
init_preemphasis(&runtime->preemp_r, config.preemphasis, config.sample_rate, config.preemp_unity_freq);
|
||||||
|
}
|
||||||
|
|
||||||
|
init_bs412(&runtime->bs412, config.mpx_deviation, config.mpx_power, config.bs412_attack, config.bs412_release, config.bs412_max, config.sample_rate);
|
||||||
|
|
||||||
|
if(config.tilt != 0) tilt_init(&runtime->tilter, config.tilt);
|
||||||
|
|
||||||
|
init_stereo_encoder(&runtime->stencode, 4.0f, &runtime->osc, (config.stereo == 2), config.volumes.mono, config.volumes.pilot, config.volumes.stereo);
|
||||||
|
|
||||||
|
if(config.agc_max != 0.0) initAGC(&runtime->agc, config.sample_rate, config.agc_target, config.agc_min, config.agc_max, config.agc_attack, config.agc_release);
|
||||||
|
|
||||||
|
if(rds_on) memset(runtime->rds_in, 0, sizeof(float) * BUFFER_SIZE * config.rds_streams);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
printf("fm95 (an FM Processor by radio95) version 2.2\n");
|
printf("fm95 (an FM Processor by radio95) version 2.2\n");
|
||||||
|
|
||||||
@@ -521,9 +536,31 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
signal(SIGINT, stop);
|
signal(SIGINT, stop);
|
||||||
signal(SIGTERM, stop);
|
signal(SIGTERM, stop);
|
||||||
|
signal(SIGHUP, reload);
|
||||||
|
|
||||||
int ret = run_fm95(config, &runtime);
|
init_runtime(&runtime, config, rds_on);
|
||||||
|
|
||||||
|
int ret;
|
||||||
|
while(true) {
|
||||||
|
ret = run_fm95(config, &runtime);
|
||||||
|
if(to_reload) {
|
||||||
|
to_reload = 0;
|
||||||
|
printf("Reloading...\n");
|
||||||
|
uint8_t old_streams = config.rds_streams; // keep the rds streams
|
||||||
|
err = parse_config(&config, &dv_names);
|
||||||
|
if(err != 0) {
|
||||||
|
printf("Could not parse the config file. (error code as return code)\n");
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
config.rds_streams = old_streams;
|
||||||
|
cleanup_runtime(&runtime, config);
|
||||||
|
init_runtime(&runtime, config, rds_on);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
printf("Cleaning up...\n");
|
printf("Cleaning up...\n");
|
||||||
cleanup_runtime(&runtime, mpx_on, rds_on);
|
cleanup_runtime(&runtime, config);
|
||||||
|
cleanup_audio_runtime(&runtime, mpx_on, rds_on);
|
||||||
|
break;
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user