mirror of
https://github.com/radio95-rnt/rds95.git
synced 2026-02-27 04:43:52 +01:00
some optimalizations
This commit is contained in:
@@ -7,7 +7,7 @@ project(rds95 VERSION 1.0)
|
|||||||
option(ODA_RTP "Enable ODA (RT+)" ON)
|
option(ODA_RTP "Enable ODA (RT+)" ON)
|
||||||
|
|
||||||
# Set compiler and flags
|
# Set compiler and flags
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror -Wextra -pedantic -O2 -std=c18 -DVERSION=\"${PROJECT_VERSION}\"")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror -Wextra -pedantic -O2 -std=c18 -march=native -DVERSION=\"${PROJECT_VERSION}\"")
|
||||||
|
|
||||||
# Define sources
|
# Define sources
|
||||||
set(SOURCES
|
set(SOURCES
|
||||||
|
|||||||
@@ -79,5 +79,5 @@ float get_rds_sample() {
|
|||||||
rds->sample_buffer[rds->out_sample_index++] = 0;
|
rds->sample_buffer[rds->out_sample_index++] = 0;
|
||||||
if (rds->out_sample_index == SAMPLE_BUFFER_SIZE)
|
if (rds->out_sample_index == SAMPLE_BUFFER_SIZE)
|
||||||
rds->out_sample_index = 0;
|
rds->out_sample_index = 0;
|
||||||
return sample;
|
return fminf(1.0f, fmaxf(-1.0f, sample));
|
||||||
}
|
}
|
||||||
|
|||||||
62
src/rds95.c
62
src/rds95.c
@@ -12,10 +12,10 @@
|
|||||||
|
|
||||||
#define NUM_MPX_FRAMES 512
|
#define NUM_MPX_FRAMES 512
|
||||||
|
|
||||||
static uint8_t stop_rds;
|
static volatile uint8_t stop_rds;
|
||||||
|
|
||||||
static void stop() {
|
static void stop() {
|
||||||
printf("Received an stopping signal\n");
|
printf("Received a stopping signal\n");
|
||||||
stop_rds = 1;
|
stop_rds = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,6 +62,7 @@ static void show_help(char *name) {
|
|||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
char control_pipe[51] = "\0";
|
char control_pipe[51] = "\0";
|
||||||
|
|
||||||
struct rds_params_t rds_params = {
|
struct rds_params_t rds_params = {
|
||||||
.ps = "radio95",
|
.ps = "radio95",
|
||||||
.rt1 = "",
|
.rt1 = "",
|
||||||
@@ -76,7 +77,6 @@ int main(int argc, char **argv) {
|
|||||||
/* pthread */
|
/* pthread */
|
||||||
pthread_attr_t attr;
|
pthread_attr_t attr;
|
||||||
pthread_t control_pipe_thread;
|
pthread_t control_pipe_thread;
|
||||||
pthread_cond_t control_pipe_cond;
|
|
||||||
|
|
||||||
const char *short_opt = "R:i:s:r:p:T:A:P:l:e:L:d:C:h";
|
const char *short_opt = "R:i:s:r:p:T:A:P:l:e:L:d:C:h";
|
||||||
|
|
||||||
@@ -154,22 +154,12 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize pthread stuff */
|
|
||||||
pthread_cond_init(&control_pipe_cond, NULL);
|
|
||||||
pthread_attr_init(&attr);
|
|
||||||
|
|
||||||
/* Gracefully stop the encoder on SIGINT or SIGTERM */
|
|
||||||
signal(SIGINT, stop);
|
|
||||||
signal(SIGTERM, stop);
|
|
||||||
|
|
||||||
/* Initialize the RDS modulator */
|
|
||||||
init_rds_encoder(rds_params);
|
|
||||||
|
|
||||||
/* PASIMPLE format */
|
/* PASIMPLE format */
|
||||||
format.format = PA_SAMPLE_FLOAT32NE;
|
format.format = PA_SAMPLE_FLOAT32NE;
|
||||||
format.channels = 1;
|
format.channels = 1;
|
||||||
format.rate = RDS_SAMPLE_RATE;
|
format.rate = RDS_SAMPLE_RATE;
|
||||||
|
|
||||||
|
int pulse_error;
|
||||||
device = pa_simple_new(
|
device = pa_simple_new(
|
||||||
NULL, // Default PulseAudio server
|
NULL, // Default PulseAudio server
|
||||||
"rds95", // Application name
|
"rds95", // Application name
|
||||||
@@ -179,26 +169,35 @@ int main(int argc, char **argv) {
|
|||||||
&format, // Sample format
|
&format, // Sample format
|
||||||
NULL, // Default channel map
|
NULL, // Default channel map
|
||||||
NULL, // Default buffering attributes
|
NULL, // Default buffering attributes
|
||||||
NULL // Error variable
|
&pulse_error // Error variable
|
||||||
);
|
);
|
||||||
if (device == NULL) {
|
if (device == NULL) {
|
||||||
fprintf(stderr, "Error: cannot open sound device.\n");
|
fprintf(stderr, "Error: cannot open sound device. (%s : %d)\n", pa_strerror(pulse_error), pulse_error);
|
||||||
goto exit;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the control pipe reader */
|
pthread_attr_init(&attr);
|
||||||
|
|
||||||
|
signal(SIGINT, stop);
|
||||||
|
signal(SIGTERM, stop);
|
||||||
|
|
||||||
|
init_rds_encoder(rds_params);
|
||||||
|
|
||||||
if (control_pipe[0]) {
|
if (control_pipe[0]) {
|
||||||
if (open_control_pipe(control_pipe) == 0) {
|
if (open_control_pipe(control_pipe) == 0) {
|
||||||
fprintf(stderr, "Reading control commands on %s.\n", control_pipe);
|
fprintf(stdout, "Reading control commands on %s.\n", control_pipe);
|
||||||
/* Create control pipe polling worker */
|
|
||||||
int r;
|
int r;
|
||||||
r = pthread_create(&control_pipe_thread, &attr, control_pipe_worker, NULL);
|
r = pthread_create(&control_pipe_thread, &attr, control_pipe_worker, NULL);
|
||||||
if (r < 0) {
|
if (r != 0) {
|
||||||
fprintf(stderr, "Could not create control pipe thread.\n");
|
fprintf(stderr, "Could not create control pipe thread.\n");
|
||||||
control_pipe[0] = 0;
|
control_pipe[0] = 0;
|
||||||
goto exit;
|
|
||||||
|
pthread_attr_destroy(&attr);
|
||||||
|
exit_rds_encoder();
|
||||||
|
pa_simple_free(device);
|
||||||
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Created control pipe thread.\n");
|
fprintf(stdout, "Created control pipe thread.\n");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Failed to open control pipe: %s.\n", control_pipe);
|
fprintf(stderr, "Failed to open control pipe: %s.\n", control_pipe);
|
||||||
@@ -206,37 +205,24 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int pulse_error;
|
|
||||||
|
|
||||||
float mpx_buffer[NUM_MPX_FRAMES];
|
float mpx_buffer[NUM_MPX_FRAMES];
|
||||||
|
|
||||||
for (;;) {
|
while (!stop_rds) {
|
||||||
for (size_t i = 0; i < NUM_MPX_FRAMES; i++) {
|
for (size_t i = 0; i < NUM_MPX_FRAMES; i++) {
|
||||||
mpx_buffer[i] = fminf(1.0f, fmaxf(-1.0f, get_rds_sample()));
|
mpx_buffer[i] = get_rds_sample();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* num_bytes = audio frames( * channels) * bytes per sample */
|
|
||||||
if (pa_simple_write(device, mpx_buffer, sizeof(mpx_buffer), &pulse_error) != 0) {
|
if (pa_simple_write(device, mpx_buffer, sizeof(mpx_buffer), &pulse_error) != 0) {
|
||||||
fprintf(stderr, "Error: could not play audio. (%s : %d)\n", pa_strerror(pulse_error), pulse_error);
|
fprintf(stderr, "Error: could not play audio. (%s : %d)\n", pa_strerror(pulse_error), pulse_error);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stop_rds) {
|
|
||||||
fprintf(stderr, "Stopping the loop...\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
exit:
|
|
||||||
if (control_pipe[0]) {
|
if (control_pipe[0]) {
|
||||||
/* shut down threads */
|
/* shut down threads */
|
||||||
fprintf(stderr, "Waiting for pipe thread to shut down.\n");
|
fprintf(stderr, "Waiting for pipe thread to shut down.\n");
|
||||||
pthread_cond_signal(&control_pipe_cond);
|
|
||||||
pthread_join(control_pipe_thread, NULL);
|
pthread_join(control_pipe_thread, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_attr_destroy(&attr);
|
|
||||||
exit_rds_encoder();
|
|
||||||
pa_simple_free(device);
|
pa_simple_free(device);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user