Chris@41: /* Chris@41: ** Copyright (c) 2002-2016, Erik de Castro Lopo Chris@41: ** All rights reserved. Chris@41: ** Chris@41: ** This code is released under 2-clause BSD license. Please see the Chris@41: ** file at : https://github.com/erikd/libsamplerate/blob/master/COPYING Chris@41: */ Chris@41: Chris@41: #include "config.h" Chris@41: Chris@41: #include Chris@41: #include Chris@41: #include Chris@41: #include Chris@41: Chris@41: #if HAVE_ALARM && HAVE_SIGNAL && HAVE_SIGALRM Chris@41: Chris@41: #include Chris@41: Chris@41: #include Chris@41: Chris@41: #include "util.h" Chris@41: Chris@41: #define SHORT_BUFFER_LEN 512 Chris@41: #define LONG_BUFFER_LEN (1 << 14) Chris@41: Chris@41: typedef struct Chris@41: { double ratio ; Chris@41: int count ; Chris@41: } SRC_PAIR ; Chris@41: Chris@41: static void callback_hang_test (int converter) ; Chris@41: Chris@41: static void alarm_handler (int number) ; Chris@41: static long input_callback (void *cb_data, float **data) ; Chris@41: Chris@41: Chris@41: int Chris@41: main (void) Chris@41: { Chris@41: /* Set up SIGALRM handler. */ Chris@41: signal (SIGALRM, alarm_handler) ; Chris@41: Chris@41: puts ("") ; Chris@41: callback_hang_test (SRC_ZERO_ORDER_HOLD) ; Chris@41: callback_hang_test (SRC_LINEAR) ; Chris@41: callback_hang_test (SRC_SINC_FASTEST) ; Chris@41: puts ("") ; Chris@41: Chris@41: return 0 ; Chris@41: } /* main */ Chris@41: Chris@41: Chris@41: static void Chris@41: callback_hang_test (int converter) Chris@41: { static float output [LONG_BUFFER_LEN] ; Chris@41: static SRC_PAIR pairs [] = Chris@41: { Chris@41: { 1.2, 5 }, { 1.1, 1 }, { 1.0, 1 }, { 3.0, 1 }, { 2.0, 1 }, { 0.3, 1 }, Chris@41: { 1.2, 0 }, { 1.1, 10 }, { 1.0, 1 } Chris@41: } ; Chris@41: Chris@41: Chris@41: SRC_STATE *src_state ; Chris@41: Chris@41: double src_ratio = 1.0 ; Chris@41: int k, error ; Chris@41: Chris@41: printf ("\tcallback_hang_test (%-28s) ....... ", src_get_name (converter)) ; Chris@41: fflush (stdout) ; Chris@41: Chris@41: /* Perform sample rate conversion. */ Chris@41: src_state = src_callback_new (input_callback, converter, 1, &error, NULL) ; Chris@41: if (src_state == NULL) Chris@41: { printf ("\n\nLine %d : src_callback_new () failed : %s\n\n", __LINE__, src_strerror (error)) ; Chris@41: exit (1) ; Chris@41: } ; Chris@41: Chris@41: for (k = 0 ; k < ARRAY_LEN (pairs) ; k++) Chris@41: { alarm (1) ; Chris@41: src_ratio = pairs [k].ratio ; Chris@41: src_callback_read (src_state, src_ratio, pairs [k].count, output) ; Chris@41: } ; Chris@41: Chris@41: src_state = src_delete (src_state) ; Chris@41: Chris@41: alarm (0) ; Chris@41: puts ("ok") ; Chris@41: Chris@41: return ; Chris@41: } /* callback_hang_test */ Chris@41: Chris@41: static void Chris@41: alarm_handler (int number) Chris@41: { Chris@41: (void) number ; Chris@41: printf ("\n\n Error : Hang inside src_callback_read() detected. Exiting!\n\n") ; Chris@41: exit (1) ; Chris@41: } /* alarm_handler */ Chris@41: Chris@41: static long Chris@41: input_callback (void *cb_data, float **data) Chris@41: { Chris@41: static float buffer [20] ; Chris@41: Chris@41: (void) cb_data ; Chris@41: *data = buffer ; Chris@41: Chris@41: return ARRAY_LEN (buffer) ; Chris@41: } /* input_callback */ Chris@41: Chris@41: #else Chris@41: Chris@41: int Chris@41: main (void) Chris@41: { Chris@41: puts ("\tCan't run this test on this platform.") ; Chris@41: return 0 ; Chris@41: } /* main */ Chris@41: Chris@41: #endif