/* -*- 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 "audio_encoder.h" #include #include #include "util.h" #include "liblame_wrapper.h" AudioEncoder::AudioEncoder(ThreadSafeQueuePriority *audio_input_queue, ThreadSafeQueuePriority *audio_output_queue) { DEBUG(audio, "AudioEncoder"); running = true; input_queue = audio_input_queue; output_queue = audio_output_queue; } AudioEncoder::~AudioEncoder() { } void AudioEncoder::thread_main() { DEBUG(audio, "AudioEncoder::run"); // Run with slightly lower priority than MovEncoderWriter if(nice(1) == -1) WARN(audio, "AudioEncoder::run could not set nice."); Frame *in_frame = NULL; Frame *out_frame = NULL; LibLAMEWrapper lame; while(running) { in_frame = input_queue->pop(); if(in_frame == NULL) ERR(audio, "AudioEncoder: in_frame == NULL!"); // Check for end of stream if(in_frame->endOfFrameStream == true) { DEBUG(audio, "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); } INFO(audio, "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"); } */