/**************************************************************************** Copyright 2006 Virginia Polytechnic Institute and State University This file is part of the OSSIE AudioPlayback. OSSIE AudioPlayback 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. OSSIE AudioPlayback 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 OSSIE AudioPlayback; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ****************************************************************************/ #include #include "AudioPlayback.h" #include "ossie/cf.h" //#include "port_impl.h" AudioPlayback_i::AudioPlayback_i(const char *uuid, omni_condition *con) : Resource_impl(uuid) { soundIn_port = new standardInterfaces_i::complexShort_p("soundIn"); soundOut_port = new standardInterfaces_i::complexShort_u("soundOut"); component_running = con; //inPort0_servant = new dataIn_complexShort_i(this); //inPort0_var = inPort0_servant->_this(); //outPort0_servant = new dataOut_complexShort_i(this); //outPort0_var = outPort0_servant->_this(); //outPort0_active = false; component_alive = true; //---------------------- // set mutexes process_input.acquire(); wait_for_input.release(); // start the thread processing_thread = new omni_thread(run_audioplayback, (void*) this); processing_thread->start(); } AudioPlayback_i::~AudioPlayback_i(void) { //delete inPort0_servant; //delete outPort0_servant; } CORBA::Object_ptr AudioPlayback_i::getPort( const char* portName) throw (CORBA::SystemException, CF::PortSupplier::UnknownPort) { std::cout << "AudioPlayback_i::getPort() invoked: portName=" << portName << std::endl; CORBA::Object_var p; p = soundIn_port->getPort(portName); if (!CORBA::is_nil(p)) return p._retn(); p = soundOut_port->getPort(portName); if (!CORBA::is_nil(p)) return p._retn(); throw CF::PortSupplier::UnknownPort(); /* if (strcmp(_id,"AudioIn") == 0) { return inPort0_var; } if (strcmp(_id,"AudioOut") == 0) { outPort0_active = true; return CF::Port::_duplicate(outPort0_var); } return NULL; */ } void AudioPlayback_i::start() throw (CORBA::SystemException, CF::Resource::StartError) { std::cout << "AudioPlayback_i::start() invoked" << std::endl; } void AudioPlayback_i::stop() throw (CORBA::SystemException, CF::Resource::StopError) { std::cout << "AudioPlayback_i::stop() invoked" << std::endl; } void AudioPlayback_i::releaseObject() throw (CORBA::SystemException, CF::LifeCycle::ReleaseError) { // Clear the component running condition so main shuts down everything component_alive = false; component_running->signal(); } void AudioPlayback_i::initialize() throw (CF::LifeCycle::InitializeError, CORBA::SystemException) { } void AudioPlayback_i::configure(const CF::Properties& props) throw (CORBA::SystemException, CF::PropertySet::InvalidConfiguration, CF::PropertySet::PartialConfiguration) { std::cout << "AudioPlayback_i::configure() invoked" << std::endl; //TODO: read sampling frequency from properties file sampling_frequency = 16000; } void run_audioplayback (void *data) { AudioPlayback_i * mem = (AudioPlayback_i *) data; std::cout << "run_audioplayback invoked" << std::endl; //std::vector outPorts; PortTypes::ShortSequence *I_in(NULL), *Q_in(NULL); unsigned int len, i; while (1) { // process data // get data from port //mem->process_input.acquire(); mem->soundIn_port->getData(I_in, Q_in); len = I_in->length(); mem->I_out.length(len); mem->Q_out.length(len); for (i=0; iI_in[i] << " " << mem->Q_in[i] << std::endl; //mem->I_out[i] = I_in[i]; //mem->Q_out[i] = Q_in[i]; } // empty input buffer //mem->inPort0_var->bufferEmptied(); /* std::cout << "pushing packet..." << std::endl; // Port vectors are finicky outPorts = mem->outPort0_servant->get_ports(); if (!CORBA::is_nil(outPorts[0].port_var)) outPorts[0].port_var->pushPacket(mem->I_out, mem->Q_out); */ mem->soundIn_port->bufferEmptied(); mem->soundOut_port->pushPacket(*I_in, *Q_in); } }