Logo Search packages:      
Sourcecode: faad2 version File versions  Download package

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;

00032 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 ********************************/


Generated by  Doxygen 1.6.0   Back to index