AC_SYS_LARGEFILE
AC_FUNC_FSEEKO
-AC_CHECK_FUNCS([gettimeofday nl_langinfo strdup _vscprintf])
+AC_CHECK_FUNCS([sigaction gettimeofday nl_langinfo strdup _vscprintf])
AC_CHECK_FUNC(getopt_long)
AM_CONDITIONAL([FDK_NO_GETOPT_LONG],[test "$ac_cv_func_getopt_long" != "yes"])
AC_SEARCH_LIBS([aacEncOpen],[fdk-aac],[],[],[])
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
+#if HAVE_SIGACTION
+#include <signal.h>
+#endif
#ifdef _WIN32
#include <io.h>
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
#endif
#include "compat.h"
#include "wav_reader.h"
#define PROGNAME "fdkaac"
+static volatile g_interrupted = 0;
+
+#if HAVE_SIGACTION
+static void signal_handler(int signum)
+{
+ g_interrupted = 1;
+}
+static void handle_signals(void)
+{
+ int i, sigs[] = { SIGINT, SIGHUP, SIGTERM };
+ for (i = 0; i < sizeof(sigs)/sizeof(sigs[0]); ++i) {
+ struct sigaction sa = { 0 };
+ sa.sa_handler = signal_handler;
+ sa.sa_flags |= SA_RESTART;
+ sigaction(sigs[i], &sa, 0);
+ }
+}
+#elif defined(_WIN32)
+static BOOL WINAPI signal_handler(DWORD type)
+{
+ g_interrupted = 1;
+ return TRUE;
+}
+
+static void handle_signals(void)
+{
+ SetConsoleCtrlHandler(signal_handler, TRUE);
+}
+#else
+static void handle_signals(void)
+{
+}
+#endif
+
static
int read_callback(void *cookie, void *data, uint32_t size)
{
ibuf = malloc(frame_length * format->bytes_per_frame);
aacenc_progress_init(&progress, wav_get_length(wavf), format->sample_rate);
do {
- if (nread) {
+ if (g_interrupted)
+ nread = 0;
+ else if (nread) {
if ((nread = wav_read_frames(wavf, ibuf, frame_length)) < 0) {
fprintf(stderr, "ERROR: read failed\n");
goto END;
strerror(errno));
goto END;
}
+ handle_signals();
if (!params.transport_format) {
uint32_t scale;
unsigned framelen = aacinfo.frameLength;