From: Mike Brady Date: Tue, 16 Apr 2019 08:10:45 +0000 (+0100) Subject: Add code to time soxr_oneshot without playing anything. It's in the wrong place,... X-Git-Tag: 3.3rc4~2^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d0917fc3046a96cd5df2beca21afb7fe595c9f54;p=thirdparty%2Fshairport-sync.git Add code to time soxr_oneshot without playing anything. It's in the wrong place, but it's a start. --- diff --git a/player.c b/player.c index 55cf01a6..31c157e2 100644 --- a/player.c +++ b/player.c @@ -432,6 +432,72 @@ static void free_audio_buffers(rtsp_conn_info *conn) { free(conn->audio_buffer[i].data); } + +void soxr_time_check() { + const int buffer_length = 352; + //int32_t inbuffer[buffer_length*2]; + //int32_t outbuffer[(buffer_length+1)*2]; + + int32_t *outbuffer = (int32_t*)malloc((buffer_length+1)*2*sizeof(int32_t)); + int32_t *inbuffer = (int32_t*)malloc((buffer_length)*2*sizeof(int32_t)); + + // generate a sample signal + const double frequency = 440; // + + int i; + + const int number_of_iterations = 100; + uint64_t soxr_start_time = get_absolute_time_in_fp(); + int j; + for (j = 0; j < number_of_iterations; j++) { + + + for (i = 0; i < buffer_length ; i++) { + double w = sin(i * (frequency + j * 2) * 2 * M_PI/44100); + int32_t wint = (int32_t)(w * INT32_MAX); + inbuffer[i * 2] = wint; + inbuffer[i * 2 + 1] = wint; + } + + + + soxr_io_spec_t io_spec; + io_spec.itype = SOXR_INT32_I; + io_spec.otype = SOXR_INT32_I; + io_spec.scale = 1.0; // this seems to crash if not = 1.0 + io_spec.e = NULL; + io_spec.flags = 0; + + size_t odone; + + soxr_oneshot(buffer_length, buffer_length + 1, 2, // Rates and # of chans. + inbuffer, buffer_length, NULL, // Input. + outbuffer, buffer_length + 1, &odone, // Output. + &io_spec, // Input, output and transfer spec. + NULL, NULL); // Default configuration. + /* + io_spec.itype = SOXR_INT32_I; + io_spec.otype = SOXR_INT32_I; + io_spec.scale = 1.0; // this seems to crash if not = 1.0 + io_spec.e = NULL; + io_spec.flags = 0; + + soxr_oneshot(buffer_length, buffer_length - 1, 2, // Rates and # of chans. + inbuffer, buffer_length, NULL, // Input. + outbuffer, buffer_length - 1, &odone, // Output. + &io_spec, // Input, output and transfer spec. + NULL, NULL); // Default configuration. + */ + } + + + double soxr_execution_time_us = + (((get_absolute_time_in_fp() - soxr_start_time) * 1000000) >> 32) * 1.0; + free(outbuffer); + free(inbuffer); + debug(1,"Execution time for %d soxr interpolations: %10.1f microseconds.", number_of_iterations, soxr_execution_time_us); +} + void player_put_packet(seq_t seqno, uint32_t actual_timestamp, uint8_t *data, int len, rtsp_conn_info *conn) { @@ -1385,6 +1451,7 @@ int stuff_buffer_soxr_32(int32_t *inptr, int32_t *scratchBuffer, int length, double soxr_execution_time_us = (((get_absolute_time_in_fp() - soxr_start_time) * 1000000) >> 32) * 1.0; + // debug(1,"soxr_execution_time_us: %10.1f",soxr_execution_time_us); if (soxr_execution_time_us > longest_soxr_execution_time_us) longest_soxr_execution_time_us = soxr_execution_time_us; stat_n += 1; @@ -1435,10 +1502,10 @@ int stuff_buffer_soxr_32(int32_t *inptr, int32_t *scratchBuffer, int length, }; } - if (packets_processed % 10 == 0) { + if (packets_processed % 500 == 0) { debug(1, "soxr_oneshot execution time in microseconds: mean, standard deviation and max " "for %" PRId32 " interpolations in the last " - "10 packets. %10.1f, %10.1f, %10.1f.", + "500 packets. %10.1f, %10.1f, %10.1f.", stat_n, stat_mean, sqrtf(stat_M2 / (stat_n - 1)), longest_soxr_execution_time_us); stat_n = 0; stat_mean = 0.0; @@ -1531,6 +1598,7 @@ void player_thread_cleanup_handler(void *arg) { } void *player_thread_func(void *arg) { + soxr_time_check(); rtsp_conn_info *conn = (rtsp_conn_info *)arg; // pthread_cleanup_push(player_thread_initial_cleanup_handler, arg); conn->packet_count = 0;