X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=src%2Fmain.c;h=95246d870b2559df13e00e837c8fb61efa97aaf5;hb=e4bbeeb0164812d47cf80f0d39fe2ae452edd4da;hp=4397c86bfd150dad098cd4e065dc705b7c8b5efa;hpb=a56831da9f42ad230f3f7cc698067ff7d6b8d16c;p=fdkaac.git diff --git a/src/main.c b/src/main.c index 4397c86..95246d8 100644 --- a/src/main.c +++ b/src/main.c @@ -24,8 +24,13 @@ #if HAVE_UNISTD_H #include #endif +#if HAVE_SIGACTION +#include +#endif #ifdef _WIN32 #include +#define WIN32_LEAN_AND_MEAN +#include #endif #include "compat.h" #include "wav_reader.h" @@ -36,6 +41,40 @@ #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) { @@ -425,7 +464,7 @@ int parse_options(int argc, char **argv, aacenc_param_ex_t *params) }; 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) { @@ -443,7 +482,7 @@ int write_sample(FILE *ofp, m4af_writer_t *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; @@ -462,7 +501,9 @@ int encode(wav_reader_t *wavf, HANDLE_AACENCODER encoder, 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; @@ -525,7 +566,7 @@ 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; @@ -647,7 +688,7 @@ void put_tag_entry(m4af_writer_t *m4af, const aacenc_tag_entry_t *tag) } 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]; @@ -675,7 +716,7 @@ void put_tool_tag(m4af_writer_t *m4af, const aacenc_param_ex_t *params, } 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; @@ -751,8 +792,8 @@ int parse_raw_spec(const char *spec, pcm_sample_description_t *desc) 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; @@ -762,7 +803,7 @@ int main(int argc, char **argv) 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; @@ -821,6 +862,7 @@ int main(int argc, char **argv) strerror(errno)); goto END; } + handle_signals(); if (!params.transport_format) { uint32_t scale; unsigned framelen = aacinfo.frameLength; @@ -831,7 +873,8 @@ int main(int argc, char **argv) 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);