summaryrefslogtreecommitdiff
path: root/faad2/src/aacDECdrop/decthread.c
diff options
context:
space:
mode:
Diffstat (limited to 'faad2/src/aacDECdrop/decthread.c')
-rw-r--r--faad2/src/aacDECdrop/decthread.c194
1 files changed, 194 insertions, 0 deletions
diff --git a/faad2/src/aacDECdrop/decthread.c b/faad2/src/aacDECdrop/decthread.c
new file mode 100644
index 0000000..7ffc3dc
--- /dev/null
+++ b/faad2/src/aacDECdrop/decthread.c
@@ -0,0 +1,194 @@
+/*
+ * 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 _error(char *errormessage)
+{
+ // do nothing
+}
+
+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 ********************************/
+