From bc47714cff64e5a6aabcbf26f79d1d26d0309838 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Tue, 27 Sep 2016 21:46:47 +0200 Subject: [PATCH] [DEV] add support of the output float,double,int32/64 muxer --- audio/river/io/Manager.cpp | 6 +- audio/river/io/Node.cpp | 167 ++++++++++++++++++++++++++++--- audio/river/io/NodeOrchestra.cpp | 2 +- 3 files changed, 157 insertions(+), 18 deletions(-) diff --git a/audio/river/io/Manager.cpp b/audio/river/io/Manager.cpp index 1449668..514a95e 100644 --- a/audio/river/io/Manager.cpp +++ b/audio/river/io/Manager.cpp @@ -34,7 +34,8 @@ static std::string basicAutoConfig = " 'front-left', 'front-right'\n" " ],\n" " type:'auto',\n" - " nb-chunk:1024\n" + " nb-chunk:1024,\n" + " mux-demux-type:'float'\n" " },\n" " speaker:{\n" " io:'output',\n" @@ -48,7 +49,8 @@ static std::string basicAutoConfig = " ],\n" " type:'auto',\n" " nb-chunk:1024,\n" - " volume-name:'MASTER'\n" + " volume-name:'MASTER',\n" + " mux-demux-type:'float'\n" " }\n" "}\n"; diff --git a/audio/river/io/Node.cpp b/audio/river/io/Node.cpp index e67305d..6814353 100644 --- a/audio/river/io/Node.cpp +++ b/audio/river/io/Node.cpp @@ -79,7 +79,12 @@ audio::river::io::Node::Node(const std::string& _name, const ejson::Object& _con if (m_isInput == true) { // Support all ... } else { - if (muxerFormatType != audio::format_int16_on_int32) { + if ( muxerFormatType != audio::format_int8_on_int16 + && muxerFormatType != audio::format_int16_on_int32 + && muxerFormatType != audio::format_int24_on_int32 + && muxerFormatType != audio::format_int32_on_int64 + && muxerFormatType != audio::format_float + && muxerFormatType != audio::format_double) { RIVER_CRITICAL("not supported demuxer type ... " << muxerFormatType << " for OUTPUT set in file:" << muxerDemuxerConfig); } } @@ -209,15 +214,22 @@ void audio::river::io::Node::newOutput(void* _outputBuffer, if (_outputBuffer == nullptr) { return; } - std::vector output; - RIVER_VERBOSE("resize=" << _nbChunk*m_process.getInputConfig().getMap().size()); - output.resize(_nbChunk*m_process.getInputConfig().getMap().size(), 0); - // TODO : set here the mixer selection ... - if (true) { - const int32_t* outputTmp = nullptr; - std::vector outputTmp2; - RIVER_VERBOSE("resize=" << sizeof(int32_t)*m_process.getInputConfig().getMap().size()*_nbChunk); - outputTmp2.resize(sizeof(int32_t)*m_process.getInputConfig().getMap().size()*_nbChunk, 0); + enum audio::format muxerFormatType = m_process.getInputConfig().getFormat(); + std::vector outputTmp2; + uint32_t nbByteTmpBuffer = audio::getFormatBytes(muxerFormatType)*m_process.getInputConfig().getMap().size()*_nbChunk; + RIVER_VERBOSE("resize=" << nbByteTmpBuffer); + outputTmp2.resize(nbByteTmpBuffer); + + if (muxerFormatType == audio::format_int8_on_int16) { + ////////////////////////////////////////////////////////////////////////////////////////////////// + // process 16 bits + ////////////////////////////////////////////////////////////////////////////////////////////////// + // $$$$ change the int16 + std::vector output; + RIVER_VERBOSE("resize=" << _nbChunk*m_process.getInputConfig().getMap().size()); + output.resize(_nbChunk*m_process.getInputConfig().getMap().size(), 0); + // $$$$ change the int16 + const int16_t* outputTmp = nullptr; for (size_t iii=0; iii< m_list.size(); ++iii) { if (m_list[iii] == nullptr) { continue; @@ -227,19 +239,144 @@ void audio::river::io::Node::newOutput(void* _outputBuffer, } RIVER_VERBOSE(" IO name="<< m_list[iii]->getName() << " " << iii); // clear datas ... - memset(&outputTmp2[0], 0, sizeof(int32_t)*m_process.getInputConfig().getMap().size()*_nbChunk); + memset(&outputTmp2[0], 0, nbByteTmpBuffer); RIVER_VERBOSE(" request Data="<< _nbChunk << " time=" << _time); - m_list[iii]->systemNeedOutputData(_time, &outputTmp2[0], _nbChunk, sizeof(int32_t)*m_process.getInputConfig().getMap().size()); + m_list[iii]->systemNeedOutputData(_time, &outputTmp2[0], _nbChunk, audio::getFormatBytes(muxerFormatType)*m_process.getInputConfig().getMap().size()); + // $$$$ change the int16 + outputTmp = reinterpret_cast(&outputTmp2[0]); + RIVER_VERBOSE(" Mix it ..."); + // Add data to the output tmp buffer: + for (size_t kkk=0; kkk output; + RIVER_VERBOSE("resize=" << _nbChunk*m_process.getInputConfig().getMap().size()); + output.resize(_nbChunk*m_process.getInputConfig().getMap().size(), 0); + const int32_t* outputTmp = nullptr; + for (size_t iii=0; iii< m_list.size(); ++iii) { + if (m_list[iii] == nullptr) { + continue; + } + if (m_list[iii]->getMode() != audio::river::modeInterface_output) { + continue; + } + RIVER_VERBOSE(" IO name="<< m_list[iii]->getName() << " " << iii); + // clear datas ... + memset(&outputTmp2[0], 0, nbByteTmpBuffer); + RIVER_VERBOSE(" request Data="<< _nbChunk << " time=" << _time); + m_list[iii]->systemNeedOutputData(_time, &outputTmp2[0], _nbChunk, audio::getFormatBytes(muxerFormatType)*m_process.getInputConfig().getMap().size()); outputTmp = reinterpret_cast(&outputTmp2[0]); RIVER_VERBOSE(" Mix it ..."); - // Add data to the output tmp buffer : + // Add data to the output tmp buffer: + for (size_t kkk=0; kkk output; + RIVER_VERBOSE("resize=" << _nbChunk*m_process.getInputConfig().getMap().size()); + output.resize(_nbChunk*m_process.getInputConfig().getMap().size(), 0); + const int64_t* outputTmp = nullptr; + for (size_t iii=0; iii< m_list.size(); ++iii) { + if (m_list[iii] == nullptr) { + continue; + } + if (m_list[iii]->getMode() != audio::river::modeInterface_output) { + continue; + } + RIVER_VERBOSE(" IO name="<< m_list[iii]->getName() << " " << iii); + // clear datas ... + memset(&outputTmp2[0], 0, nbByteTmpBuffer); + RIVER_VERBOSE(" request Data="<< _nbChunk << " time=" << _time); + m_list[iii]->systemNeedOutputData(_time, &outputTmp2[0], _nbChunk, audio::getFormatBytes(muxerFormatType)*m_process.getInputConfig().getMap().size()); + outputTmp = reinterpret_cast(&outputTmp2[0]); + RIVER_VERBOSE(" Mix it ..."); + // Add data to the output tmp buffer: + for (size_t kkk=0; kkk output; + RIVER_VERBOSE("resize=" << _nbChunk*m_process.getInputConfig().getMap().size()); + output.resize(_nbChunk*m_process.getInputConfig().getMap().size(), 0); + const float* outputTmp = nullptr; + for (size_t iii=0; iii< m_list.size(); ++iii) { + if (m_list[iii] == nullptr) { + continue; + } + if (m_list[iii]->getMode() != audio::river::modeInterface_output) { + continue; + } + RIVER_VERBOSE(" IO name="<< m_list[iii]->getName() << " " << iii); + // clear datas ... + memset(&outputTmp2[0], 0, nbByteTmpBuffer); + RIVER_VERBOSE(" request Data="<< _nbChunk << " time=" << _time); + m_list[iii]->systemNeedOutputData(_time, &outputTmp2[0], _nbChunk, audio::getFormatBytes(muxerFormatType)*m_process.getInputConfig().getMap().size()); + outputTmp = reinterpret_cast(&outputTmp2[0]); + RIVER_VERBOSE(" Mix it ..."); + // Add data to the output tmp buffer: for (size_t kkk=0; kkk output; + RIVER_VERBOSE("resize=" << _nbChunk*m_process.getInputConfig().getMap().size()); + output.resize(_nbChunk*m_process.getInputConfig().getMap().size(), 0); + const double* outputTmp = nullptr; + for (size_t iii=0; iii< m_list.size(); ++iii) { + if (m_list[iii] == nullptr) { + continue; + } + if (m_list[iii]->getMode() != audio::river::modeInterface_output) { + continue; + } + RIVER_VERBOSE(" IO name="<< m_list[iii]->getName() << " " << iii); + // clear datas ... + memset(&outputTmp2[0], 0, nbByteTmpBuffer); + RIVER_VERBOSE(" request Data="<< _nbChunk << " time=" << _time); + m_list[iii]->systemNeedOutputData(_time, &outputTmp2[0], _nbChunk, audio::getFormatBytes(muxerFormatType)*m_process.getInputConfig().getMap().size()); + outputTmp = reinterpret_cast(&outputTmp2[0]); + RIVER_VERBOSE(" Mix it ..."); + // Add data to the output tmp buffer: + for (size_t kkk=0; kkk then no nneed to specify for each channels RIVER_VERBOSE(" Feedback :"); for (size_t iii=0; iii< m_list.size(); ++iii) { if (m_list[iii] == nullptr) { diff --git a/audio/river/io/NodeOrchestra.cpp b/audio/river/io/NodeOrchestra.cpp index be5440f..7e7a51a 100644 --- a/audio/river/io/NodeOrchestra.cpp +++ b/audio/river/io/NodeOrchestra.cpp @@ -27,7 +27,7 @@ int32_t audio::river::io::NodeOrchestra::playbackCallback(void* _outputBuffer, const std::vector& _status) { std::unique_lock lock(m_mutex); // TODO : Manage status ... - RIVER_INFO("data Output size request :" << _nbChunk << " [BEGIN] status=" << _status << " nbIO=" << m_list.size() << " data=" << uint64_t(_outputBuffer)); + RIVER_VERBOSE("data Output size request :" << _nbChunk << " [BEGIN] status=" << _status << " nbIO=" << m_list.size() << " data=" << uint64_t(_outputBuffer)); newOutput(_outputBuffer, _nbChunk, _timeOutput); return 0; }