ref: f525ec421ab9734de9eeb231c2797baf2ee12c44
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 _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 ********************************/