From: Mike Brady <4265913+mikebrady@users.noreply.github.com> Date: Sat, 20 Nov 2021 13:59:16 +0000 (+0000) Subject: Add a 'stats' function to the audio back ends to replace the 'rate_info' function... X-Git-Tag: 4.1-rc1~24^2~375 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cd9da86fc30de35cc5f32640c9a2a83f787ed8ce;p=thirdparty%2Fshairport-sync.git Add a 'stats' function to the audio back ends to replace the 'rate_info' function. Zero all except the alsa back end. --- diff --git a/audio.h b/audio.h index f6ddcd9e..ad574adb 100644 --- a/audio.h +++ b/audio.h @@ -39,7 +39,7 @@ typedef struct { // will change dynamically, so keep watching it. Implemented in ALSA only. // returns a negative error code if there's a problem int (*delay)(long *the_delay); // snd_pcm_sframes_t is a signed long - int (*rate_info)(uint64_t *measurement_time, uint64_t *delay, + int (*stats)(uint64_t *measurement_time, uint64_t *delay, uint64_t *frames_sent_to_dac); // use this to get the true rate of the DAC // may be NULL, in which case soft volume is applied diff --git a/audio_alsa.c b/audio_alsa.c index 0e4268ed..3fcbde66 100644 --- a/audio_alsa.c +++ b/audio_alsa.c @@ -60,7 +60,7 @@ static int play(void *buf, int samples); static void stop(void); static void flush(void); int delay(long *the_delay); -int play_stats(uint64_t *the_time, uint64_t *the_delay, uint64_t *frames_sent_to_dac); +int stats(uint64_t *the_time, uint64_t *the_delay, uint64_t *frames_sent_to_dac); // int get_rate_information(uint64_t *elapsed_time, uint64_t *frames_played); void *alsa_buffer_monitor_thread_code(void *arg); @@ -89,7 +89,7 @@ audio_output audio_alsa = { .flush = &flush, .delay = &delay, .play = &play, - .rate_info = &play_stats, // will also include frames of silence sent to stop + .stats = &stats, // will also include frames of silence sent to stop // standby mode // .rate_info = NULL, .mute = NULL, // a function will be provided if it can, and is allowed to, @@ -1629,7 +1629,7 @@ int delay(long *the_delay) { return ret; } -int play_stats(uint64_t *the_time, uint64_t *the_delay, uint64_t *frames_sent_to_dac) { +int stats(uint64_t *the_time, uint64_t *the_delay, uint64_t *frames_sent_to_dac) { // returns 0 if the device is in a valid state -- SND_PCM_STATE_RUNNING or // SND_PCM_STATE_PREPARED // or SND_PCM_STATE_DRAINING diff --git a/audio_ao.c b/audio_ao.c index 38953b69..40a94fdc 100644 --- a/audio_ao.c +++ b/audio_ao.c @@ -135,6 +135,7 @@ audio_output audio_ao = {.name = "ao", .is_running = NULL, .flush = NULL, .delay = NULL, + .stats = NULL, .play = &play, .volume = NULL, .parameters = NULL, diff --git a/audio_dummy.c b/audio_dummy.c index 5d16bf95..70ea755e 100644 --- a/audio_dummy.c +++ b/audio_dummy.c @@ -58,6 +58,7 @@ audio_output audio_dummy = {.name = "dummy", .is_running = NULL, .flush = NULL, .delay = NULL, + .stats = NULL, .play = &play, .volume = NULL, .parameters = NULL, diff --git a/audio_jack.c b/audio_jack.c index 21c3e543..e87e16a3 100644 --- a/audio_jack.c +++ b/audio_jack.c @@ -63,6 +63,7 @@ audio_output audio_jack = {.name = "jack", .is_running = NULL, .flush = &jack_flush, .delay = &jack_delay, + .stats = NULL, .play = &play, .volume = NULL, .parameters = NULL, diff --git a/audio_pa.c b/audio_pa.c index 951860be..9d37bc60 100644 --- a/audio_pa.c +++ b/audio_pa.c @@ -315,6 +315,7 @@ audio_output audio_pa = {.name = "pa", .is_running = NULL, .flush = &flush, .delay = &pa_delay, + .stats = NULL, .play = &play, .volume = NULL, .parameters = NULL, diff --git a/audio_pipe.c b/audio_pipe.c index a7925fbc..fcece96b 100644 --- a/audio_pipe.c +++ b/audio_pipe.c @@ -151,6 +151,7 @@ audio_output audio_pipe = {.name = "pipe", .is_running = NULL, .flush = NULL, .delay = NULL, + .stats = NULL, .play = &play, .volume = NULL, .parameters = NULL, diff --git a/audio_pw.c b/audio_pw.c index f25c0456..52e6a882 100644 --- a/audio_pw.c +++ b/audio_pw.c @@ -481,6 +481,7 @@ audio_output audio_pw = {.name = "pw", .is_running = NULL, .flush = &flush, .delay = NULL, + .stats = NULL, .play = &play, .volume = NULL, .parameters = NULL, diff --git a/audio_sndio.c b/audio_sndio.c index f8582c8a..e32c1f4d 100644 --- a/audio_sndio.c +++ b/audio_sndio.c @@ -49,6 +49,7 @@ audio_output audio_sndio = {.name = "sndio", .is_running = NULL, .flush = &flush, .delay = &delay, + .stats = NULL, .play = &play, .volume = NULL, .parameters = NULL, diff --git a/audio_soundio.c b/audio_soundio.c index 501c6db2..28108a9f 100644 --- a/audio_soundio.c +++ b/audio_soundio.c @@ -216,6 +216,7 @@ audio_output audio_soundio = {.name = "soundio", .is_running = NULL, .flush = &flush, .delay = NULL, + .stats = NULL, .play = &play, .volume = NULL, .parameters = ¶meters, diff --git a/audio_stdout.c b/audio_stdout.c index 8b37883e..61fdc744 100644 --- a/audio_stdout.c +++ b/audio_stdout.c @@ -84,6 +84,7 @@ audio_output audio_stdout = {.name = "stdout", .is_running = NULL, .flush = NULL, .delay = NULL, + .stats = NULL, .play = &play, .volume = NULL, .parameters = NULL, diff --git a/player.c b/player.c index c6e360e8..bc2956e0 100644 --- a/player.c +++ b/player.c @@ -2019,7 +2019,7 @@ void *player_thread_func(void *arg) { } } else { #endif - if (config.output->delay) { + if (config.output->stats) { if (config.no_sync == 0) statistics_print_profile = ap1_synced_statistics_print_profile; else @@ -2311,15 +2311,15 @@ void *player_thread_func(void *arg) { } int stats_status = -1; - if ((config.output->delay) && (config.no_sync == 0) && (config.output->rate_info)) { + if ((config.output->delay) && (config.no_sync == 0) && (config.output->stats)) { uint64_t frames_sent_for_play; uint64_t measurement_time; uint64_t actual_delay; - stats_status = config.output->rate_info(&measurement_time, &actual_delay, &frames_sent_for_play); + stats_status = config.output->stats(&measurement_time, &actual_delay, &frames_sent_for_play); // debug(1,"actual_delay: %" PRIu64 ", frames_sent_for_play: %" PRIu64 ", frames_played: %" PRIu64 ".", actual_delay, frames_sent_for_play, frames_sent_for_play - actual_delay); uint64_t frames_played = frames_sent_for_play - actual_delay; // If the status is zero, it means that there were no output problems since the - // last time the rate_info call was made. Thus, the frame rate should be valid. + // last time the stats call was made. Thus, the frame rate should be valid. if ((stats_status == 0) && (previous_frames_played_valid)) { uint64_t frames_played_in_this_interval = frames_played - previous_frames_played; uint64_t interval = measurement_time - previous_frames_played_time;