#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)
{
};
static
-int write_sample(FILE *ofp, m4af_writer_t *m4af,
+int write_sample(FILE *ofp, m4af_ctx_t *m4af,
const void *data, uint32_t size, uint32_t duration)
{
if (!m4af) {
static
int encode(wav_reader_t *wavf, HANDLE_AACENCODER encoder,
- uint32_t frame_length, FILE *ofp, m4af_writer_t *m4af,
+ uint32_t frame_length, FILE *ofp, m4af_ctx_t *m4af,
int show_progress)
{
uint8_t *ibuf = 0;
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;
}
static
-void put_tag_entry(m4af_writer_t *m4af, const aacenc_tag_entry_t *tag)
+void put_tag_entry(m4af_ctx_t *m4af, const aacenc_tag_entry_t *tag)
{
unsigned m, n = 0;
const char *data = tag->data;
}
static
-void put_tool_tag(m4af_writer_t *m4af, const aacenc_param_ex_t *params,
+void put_tool_tag(m4af_ctx_t *m4af, const aacenc_param_ex_t *params,
HANDLE_AACENCODER encoder)
{
char tool_info[256];
}
static
-int finalize_m4a(m4af_writer_t *m4af, const aacenc_param_ex_t *params,
+int finalize_m4a(m4af_ctx_t *m4af, const aacenc_param_ex_t *params,
HANDLE_AACENCODER encoder)
{
unsigned i;
int main(int argc, char **argv)
{
wav_io_context_t wav_io = { read_callback, seek_callback, tell_callback };
- m4af_io_callbacks_t m4af_io = {
- write_callback, seek_callback, tell_callback };
+ m4af_io_callbacks_t
+ m4af_io = { 0, write_callback, seek_callback, tell_callback };
aacenc_param_ex_t params = { 0 };
int result = 2;
wav_reader_t *wavf = 0;
HANDLE_AACENCODER encoder = 0;
AACENC_InfoStruct aacinfo = { 0 };
- m4af_writer_t *m4af = 0;
+ m4af_ctx_t *m4af = 0;
const pcm_sample_description_t *sample_format;
int downsampled_timescale = 0;
int frame_count = 0;
strerror(errno));
goto END;
}
+ handle_signals();
if (!params.transport_format) {
uint32_t scale;
unsigned framelen = aacinfo.frameLength;
scale = sample_format->sample_rate >> downsampled_timescale;
if ((m4af = m4af_create(M4AF_CODEC_MP4A, scale, &m4af_io, ofp)) < 0)
goto END;
- m4af_decoder_specific_info(m4af, 0, aacinfo.confBuf, aacinfo.confSize);
+ m4af_set_decoder_specific_info(m4af, 0, aacinfo.confBuf,
+ aacinfo.confSize);
m4af_set_fixed_frame_duration(m4af, 0,
framelen >> downsampled_timescale);
m4af_begin_write(m4af);