/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/***************************************************************************
 *            audio_encoder.cc
 *
 *  Sat Sep 17 18:38:45 CEST 2005
 *  Copyright  2005 Bent Bisballe Nyeng
 *  deva@aasimon.org
 ****************************************************************************/

/*
 *  This file is part of MIaV.
 *
 *  MIaV is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  MIaV is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with MIaV; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
 */
#include "config.h"
#include "audio_encoder.h"
#include "util.h"

#include "info.h"

#include "liblame_wrapper.h"

AudioEncoder::AudioEncoder(ThreadSafeQueuePriority *audio_input_queue,
                           ThreadSafeQueuePriority *audio_output_queue)
{
  MIaV::info->info("AudioEncoder");

  running = true;

  input_queue = audio_input_queue;
  output_queue = audio_output_queue;
}

AudioEncoder::~AudioEncoder()
{
}

void AudioEncoder::thread_main()
{
  MIaV::info->info("AudioEncoder::run");

  // Run with slightly lower priority than MovEncoderWriter
  nice(1);

  Frame *in_frame = NULL;
  Frame *out_frame = NULL;

  LibLAMEWrapper lame;

  while(running) {
    in_frame = input_queue->pop();

    if(in_frame == NULL) MIaV::info->error("AudioEncoder: in_frame == NULL!");

    // Check for end of stream
    if(in_frame->endOfFrameStream == true) {
      MIaV::info->info("endOfFrameStream in AudioEncoder");
      running = false;
      out_frame = lame.close();
    } else {
      // Encode audio
      out_frame = lame.encode(in_frame);
    }
    out_frame->number = in_frame->number;
    out_frame->endOfFrameStream = in_frame->endOfFrameStream;

    delete in_frame;
    in_frame = NULL;

    output_queue->push(out_frame);
  }

  MIaV::info->info("AudioEncoder::stop");
}














































/*

void AudioEncoder::thread_main()
{
  info->info("AudioEncoder::run");

#ifndef NEW_QUEUE
  unsigned int queuesize = 0;
  Frame *tmpframe;
#endif

  // Run with slightly lower priority than MovEncoderWriter
  nice(2);

  Frame *in_frame = NULL;
  Frame *out_frame = NULL;

  LibLAMEWrapper lame(info);

  while(running) {
    info->info("fisk");
#ifdef NEW_QUEUE
    in_frame = input_queue->pop();
#else
    sem_wait(input_sem);

    // If no frame is in the buffer, get one from the queue
    while( in_frame == NULL ) {

      //      sem_wait(input_sem); 

      // Lock output mutex
      pthread_mutex_lock( input_mutex );
      tmpframe = inputqueue->top();

      if(tmpframe && tmpframe->number == frame_number) {
        inputqueue->pop();
        queuesize = inputqueue->size();
        in_frame = tmpframe;
        frame_number++;
      }

      pthread_mutex_unlock( input_mutex );
      // Unlock output mutex

      sleep_0_2_frame();
    }
#endif

    // Check for end of stream
    if(in_frame->endOfFrameStream == true) {
      info->info("endOfFrameStream in AudioEncoder");
      running = false;
      out_frame = lame.close();
    } else {
      // Encode audio
      out_frame = lame.encode(in_frame);
    }
    out_frame->number = in_frame->number;
    out_frame->endOfFrameStream = in_frame->endOfFrameStream;

    delete in_frame;
    in_frame = NULL;

#ifdef NEW_QUEUE
    output_queue->push(out_frame);
#else
    // Lock output mutex
    pthread_mutex_lock(output_mutex);
    outputqueue->push(out_frame);
    pthread_mutex_unlock(output_mutex);
    // Unlock output mutex
    
    // Kick multiplexer (audio)
    sem_post(output_sem);
#endif
  }

#ifndef NEW_QUEUE
  // Kick multiplexer (audio)
  sem_post(output_sem);
#endif

  info->info("AudioEncoder::stop");
}
*/