ref: b1d957de163081057eac05c26d502f6c28fc6dc8
dir: /aacDECdrop/decthread.c/
/* * function: Decoding thread for aacDECdrop * * This program is distributed under the GNU General Public License, version 2. * A copy of this license is included with this source. * * Copyright (C) 2002 John Edwards * * last mod: aacDecdrop decoder last updated 2002-03-14 */ #include <windows.h> #include <time.h> #include <string.h> #include "wave_out.h" #include "decode.h" #include "misc.h" extern int decoding_done; extern int animate; extern double file_complete; extern int totalfiles; extern int numfiles; int dec_mode; int outputFormat; int fileType; int object_type; extern char* fileName; int stop_decoding; typedef struct enclist_tag { char *filename; struct enclist_tag *next; } enclist_t; enclist_t *head = NULL; CRITICAL_SECTION mutex; DWORD WINAPI decode_thread(LPVOID arg); void decthread_init(void) { int thread_id; HANDLE thand; numfiles = 0; totalfiles = 0; file_complete = 0.0; InitializeCriticalSection(&mutex); thand = CreateThread(NULL, 0, decode_thread, NULL, 0, &thread_id); if (thand == NULL) { // something bad happened, might want to deal with that, maybe... } } void decthread_addfile(char *file) { char *filename; enclist_t *entry, *node; if (file == NULL) return; // create entry filename = strdup(file); entry = (enclist_t *)malloc(sizeof(enclist_t)); entry->filename = filename; entry->next = NULL; EnterCriticalSection(&mutex); // insert entry if (head == NULL) { head = entry; } else { node = head; while (node->next != NULL) node = node->next; node->next = entry; } numfiles++; totalfiles++; LeaveCriticalSection(&mutex); } /* * the caller is responsible for deleting the pointer */ char *_getfile() { char *filename; enclist_t *entry; EnterCriticalSection(&mutex); if (head == NULL) { LeaveCriticalSection(&mutex); return NULL; } // pop entry entry = head; head = head->next; filename = entry->filename; free(entry); LeaveCriticalSection(&mutex); return filename; } void decthread_set_decode_mode(int decode_mode) { dec_mode = decode_mode; } void decthread_set_outputFormat(int output_format) { outputFormat = output_format; } void decthread_set_fileType(int file_type) { fileType = file_type; } void decthread_set_object_type(int object_type) { object_type = object_type; } void _update(long total, long done) { file_complete = (double)done / (double)total; } DWORD WINAPI decode_thread(LPVOID arg) { char *in_file; while (!decoding_done) { while (in_file = _getfile()) { aac_dec_opt dec_opts; animate = 1; if(stop_decoding){ numfiles--; break; } set_filename(in_file); dec_opts.progress_update = _update; dec_opts.filename = in_file; dec_opts.decode_mode = dec_mode; dec_opts.output_format = outputFormat; dec_opts.file_type = fileType; dec_opts.object_type = object_type; fileName = in_file; aac_decode(&dec_opts); numfiles--; } /* Finished this file, loop around to next... */ file_complete = 0.0; animate = 0; totalfiles = 0; numfiles = 0; Sleep(500); } DeleteCriticalSection(&mutex); return 0; } /******************************** end of decthread.c ********************************/