/****************************************************************************Copyright 2006 Virginia Polytechnic Institute and State UniversityThis file is part of the OSSIE AudioPlayback.OSSIE AudioPlayback is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe 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 ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with OSSIE AudioPlayback; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA****************************************************************************/#include <iostream>#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 <dataOut_complexShort_i::PortInfo> 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; i<len; i++) { //std::cout << "AudioPlayback: " << mem->I_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); }}