Add a 'stats' function to the audio back ends to replace the 'rate_info' function. Zero all except the alsa back end.
This commit is contained in:
@@ -39,7 +39,7 @@ typedef struct {
|
|||||||
// will change dynamically, so keep watching it. Implemented in ALSA only.
|
// will change dynamically, so keep watching it. Implemented in ALSA only.
|
||||||
// returns a negative error code if there's a problem
|
// returns a negative error code if there's a problem
|
||||||
int (*delay)(long *the_delay); // snd_pcm_sframes_t is a signed long
|
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
|
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
|
// may be NULL, in which case soft volume is applied
|
||||||
|
|||||||
+3
-3
@@ -60,7 +60,7 @@ static int play(void *buf, int samples);
|
|||||||
static void stop(void);
|
static void stop(void);
|
||||||
static void flush(void);
|
static void flush(void);
|
||||||
int delay(long *the_delay);
|
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);
|
// int get_rate_information(uint64_t *elapsed_time, uint64_t *frames_played);
|
||||||
void *alsa_buffer_monitor_thread_code(void *arg);
|
void *alsa_buffer_monitor_thread_code(void *arg);
|
||||||
|
|
||||||
@@ -89,7 +89,7 @@ audio_output audio_alsa = {
|
|||||||
.flush = &flush,
|
.flush = &flush,
|
||||||
.delay = &delay,
|
.delay = &delay,
|
||||||
.play = &play,
|
.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
|
// standby mode
|
||||||
// .rate_info = NULL,
|
// .rate_info = NULL,
|
||||||
.mute = NULL, // a function will be provided if it can, and is allowed to,
|
.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;
|
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
|
// returns 0 if the device is in a valid state -- SND_PCM_STATE_RUNNING or
|
||||||
// SND_PCM_STATE_PREPARED
|
// SND_PCM_STATE_PREPARED
|
||||||
// or SND_PCM_STATE_DRAINING
|
// or SND_PCM_STATE_DRAINING
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ audio_output audio_ao = {.name = "ao",
|
|||||||
.is_running = NULL,
|
.is_running = NULL,
|
||||||
.flush = NULL,
|
.flush = NULL,
|
||||||
.delay = NULL,
|
.delay = NULL,
|
||||||
|
.stats = NULL,
|
||||||
.play = &play,
|
.play = &play,
|
||||||
.volume = NULL,
|
.volume = NULL,
|
||||||
.parameters = NULL,
|
.parameters = NULL,
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ audio_output audio_dummy = {.name = "dummy",
|
|||||||
.is_running = NULL,
|
.is_running = NULL,
|
||||||
.flush = NULL,
|
.flush = NULL,
|
||||||
.delay = NULL,
|
.delay = NULL,
|
||||||
|
.stats = NULL,
|
||||||
.play = &play,
|
.play = &play,
|
||||||
.volume = NULL,
|
.volume = NULL,
|
||||||
.parameters = NULL,
|
.parameters = NULL,
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ audio_output audio_jack = {.name = "jack",
|
|||||||
.is_running = NULL,
|
.is_running = NULL,
|
||||||
.flush = &jack_flush,
|
.flush = &jack_flush,
|
||||||
.delay = &jack_delay,
|
.delay = &jack_delay,
|
||||||
|
.stats = NULL,
|
||||||
.play = &play,
|
.play = &play,
|
||||||
.volume = NULL,
|
.volume = NULL,
|
||||||
.parameters = NULL,
|
.parameters = NULL,
|
||||||
|
|||||||
@@ -315,6 +315,7 @@ audio_output audio_pa = {.name = "pa",
|
|||||||
.is_running = NULL,
|
.is_running = NULL,
|
||||||
.flush = &flush,
|
.flush = &flush,
|
||||||
.delay = &pa_delay,
|
.delay = &pa_delay,
|
||||||
|
.stats = NULL,
|
||||||
.play = &play,
|
.play = &play,
|
||||||
.volume = NULL,
|
.volume = NULL,
|
||||||
.parameters = NULL,
|
.parameters = NULL,
|
||||||
|
|||||||
@@ -151,6 +151,7 @@ audio_output audio_pipe = {.name = "pipe",
|
|||||||
.is_running = NULL,
|
.is_running = NULL,
|
||||||
.flush = NULL,
|
.flush = NULL,
|
||||||
.delay = NULL,
|
.delay = NULL,
|
||||||
|
.stats = NULL,
|
||||||
.play = &play,
|
.play = &play,
|
||||||
.volume = NULL,
|
.volume = NULL,
|
||||||
.parameters = NULL,
|
.parameters = NULL,
|
||||||
|
|||||||
@@ -481,6 +481,7 @@ audio_output audio_pw = {.name = "pw",
|
|||||||
.is_running = NULL,
|
.is_running = NULL,
|
||||||
.flush = &flush,
|
.flush = &flush,
|
||||||
.delay = NULL,
|
.delay = NULL,
|
||||||
|
.stats = NULL,
|
||||||
.play = &play,
|
.play = &play,
|
||||||
.volume = NULL,
|
.volume = NULL,
|
||||||
.parameters = NULL,
|
.parameters = NULL,
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ audio_output audio_sndio = {.name = "sndio",
|
|||||||
.is_running = NULL,
|
.is_running = NULL,
|
||||||
.flush = &flush,
|
.flush = &flush,
|
||||||
.delay = &delay,
|
.delay = &delay,
|
||||||
|
.stats = NULL,
|
||||||
.play = &play,
|
.play = &play,
|
||||||
.volume = NULL,
|
.volume = NULL,
|
||||||
.parameters = NULL,
|
.parameters = NULL,
|
||||||
|
|||||||
@@ -216,6 +216,7 @@ audio_output audio_soundio = {.name = "soundio",
|
|||||||
.is_running = NULL,
|
.is_running = NULL,
|
||||||
.flush = &flush,
|
.flush = &flush,
|
||||||
.delay = NULL,
|
.delay = NULL,
|
||||||
|
.stats = NULL,
|
||||||
.play = &play,
|
.play = &play,
|
||||||
.volume = NULL,
|
.volume = NULL,
|
||||||
.parameters = ¶meters,
|
.parameters = ¶meters,
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ audio_output audio_stdout = {.name = "stdout",
|
|||||||
.is_running = NULL,
|
.is_running = NULL,
|
||||||
.flush = NULL,
|
.flush = NULL,
|
||||||
.delay = NULL,
|
.delay = NULL,
|
||||||
|
.stats = NULL,
|
||||||
.play = &play,
|
.play = &play,
|
||||||
.volume = NULL,
|
.volume = NULL,
|
||||||
.parameters = NULL,
|
.parameters = NULL,
|
||||||
|
|||||||
@@ -2019,7 +2019,7 @@ void *player_thread_func(void *arg) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
#endif
|
#endif
|
||||||
if (config.output->delay) {
|
if (config.output->stats) {
|
||||||
if (config.no_sync == 0)
|
if (config.no_sync == 0)
|
||||||
statistics_print_profile = ap1_synced_statistics_print_profile;
|
statistics_print_profile = ap1_synced_statistics_print_profile;
|
||||||
else
|
else
|
||||||
@@ -2311,15 +2311,15 @@ void *player_thread_func(void *arg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int stats_status = -1;
|
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 frames_sent_for_play;
|
||||||
uint64_t measurement_time;
|
uint64_t measurement_time;
|
||||||
uint64_t actual_delay;
|
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);
|
// 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;
|
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
|
// 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)) {
|
if ((stats_status == 0) && (previous_frames_played_valid)) {
|
||||||
uint64_t frames_played_in_this_interval = frames_played - previous_frames_played;
|
uint64_t frames_played_in_this_interval = frames_played - previous_frames_played;
|
||||||
uint64_t interval = measurement_time - previous_frames_played_time;
|
uint64_t interval = measurement_time - previous_frames_played_time;
|
||||||
|
|||||||
Reference in New Issue
Block a user