/* -*- 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" AudioEncoder::AudioEncoder(FramePriorityQueue *in, pthread_mutex_t *in_mutex, sem_t *in_sem, FramePriorityQueue *out, pthread_mutex_t *out_mutex, sem_t *out_sem, Info *i) { info = i; info->info("AudioEncoder"); running = true; // Queues inputqueue = in; outputqueue = out; // Queue mutexes input_mutex = in_mutex; output_mutex = out_mutex; input_sem = in_sem; output_sem = out_sem; frame_number = 0; } AudioEncoder::~AudioEncoder() { } void AudioEncoder::thread_main() { info->info("AudioEncoder::run"); unsigned int queuesize = 0; // Run with slightly lower priority than MovEncoderWriter nice(2); Frame *in_frame = NULL; Frame *out_frame = NULL; Frame *tmpframe; LibLAMEWrapper lame(info); while(running) { 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_1_frame(); } // 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; // 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); } // Kick multiplexer (audio) sem_post(output_sem); info->info("AudioEncoder::stop"); }