/** * @author Edouard DUPIN * * @copyright 2014, Edouard DUPIN, all right reserved * * @license BSD v3 (see license file) */ #include #include #include #include #include eaudiofx::BlockDecoder::BlockDecoder(void) : m_nbSampleIn(0) { setType(eaudiofx::blockTypeDecoder); // set input : m_io.insert( std::pair( "in", eaudiofx::Block::IOProperty( eaudiofx::Block::ioInput, "{ type:'bitstream', format:'file', extention:['wav','ogg'] }" ) ) ); // set output : m_io.insert( std::pair( "out", eaudiofx::Block::IOProperty( eaudiofx::Block::ioOutput, "{ type:'audio', compression:'raw', frequency:48000, channel:2, format:'float' }", new eaudiofx::BufferAudioRaw(*this, 48000, 2, 4096) ) ) ); } int32_t eaudiofx::BlockDecoder::pull(double _currentTime, int32_t _request, float _timeout) { auto itOut = m_io.find("out"); if (itOut == m_io.end()) { EAUDIOFX_WARNING("request to pull data with no output !!!"); return eaudiofx::ERR_FAIL; } auto itIn = m_io.find("in"); if (itIn == m_io.end()) { EAUDIOFX_WARNING("request to pull data with no Input !!!"); return eaudiofx::ERR_FAIL; } eaudiofx::BufferAudioRaw* bufferOut = dynamic_cast(itOut->second.m_buffer); if (bufferOut == NULL) { // !! impossible case => a buffer can not be removed ... EAUDIOFX_ERROR("Buffer has been removed... OR change type ..."); return eaudiofx::ERR_FAIL; } //request outpuffer needed size : bufferOut->setProperty(48000, 2, _request); float* dataOut = bufferOut->getData(); int32_t offset = 0; EAUDIOFX_DEBUG("Request data : " << (_request*2) ); while (1) { int32_t nbSampleToCopy = etk_min(m_nbSampleIn, _request*2 - offset); if (m_nbSampleIn > 0) { // no pull needed ==> just copy data to output ... for (int32_t iii=0; iii < nbSampleToCopy; ++iii) { dataOut[offset + iii] = m_tmpBuffer[iii]; } offset += nbSampleToCopy; m_nbSampleIn -= nbSampleToCopy; if (m_nbSampleIn > 0) { // some data in the buffer ==> move it ... for (int32_t iii=0; iii < MAX_DATA_IN_BUFFER-nbSampleToCopy; ++iii) { m_tmpBuffer[iii] = m_tmpBuffer[nbSampleToCopy+iii]; } } if (offset == _request*2) { FILE* plopppp = fopen("plopDEC.raw", "a"); fwrite(dataOut, sizeof(float), _request*2, plopppp); fflush(plopppp); fclose(plopppp); // putput have enought data return eaudiofx::ERR_NONE; } } // Request block input: int32_t ret = eaudiofx::Block::pull(_currentTime, 256, _timeout); if (ret != eaudiofx::ERR_NONE) { EAUDIOFX_ERROR("can not get data ..."); return -1; } eaudiofx::BufferStream* bufferIn = dynamic_cast(itIn->second.m_buffer); if (bufferIn == NULL) { // !! impossible case => a buffer can not be removed ... EAUDIOFX_ERROR("Buffer has been removed... OR change type ..."); return eaudiofx::ERR_FAIL; } if (bufferIn->setAvaillableSize() == 0) { for (size_t iii=0; iii<64; ++iii) { m_tmpBuffer[m_nbSampleIn] = 0.0f; m_nbSampleIn++; m_tmpBuffer[m_nbSampleIn] = 0.0f; m_nbSampleIn++; } } if (true == true) { // wav input : // TODO : Do it better ... size_t provideData = bufferIn->setAvaillableSize(); int16_t* inputData = (int16_t*)bufferIn->getData(); for (size_t iii=0; iii