#include "main.h" #include "BoostLog.h" #include "DateTime.h" #include "FFmpegResample.h" #include "IoContext.h" #include "OpusCodec.h" #include "RkAudio.h" #include "WebRTCPublisher.h" #include // #include #include #include #include #include #include #include void signal_handler(const boost::system::error_code &error, int signal_number) { if (!error) { LOG(info) << "Caught signal: " << signal_number << std::endl; LOG(info) << "task finished."; std::exit(0); } } int main(int argc, char **argv) { using namespace Amass; using namespace std::placeholders; boost::program_options::options_description optionsDescription("Allowed options"); // clang-format off optionsDescription.add_options() ("help,h", "produce help message") ("echo", "Self-recording and self-play test") ("record", "Record to file.") ("play", "Play pcm file.") ("dsp", boost::program_options::value(), "vqe, speex, aecm") ("channels", boost::program_options::value(), "set audio channles") ("path", boost::program_options::value(), "file path") ; // clang-format on boost::program_options::variables_map variablesMap; boost::program_options::store(boost::program_options::parse_command_line(argc, argv, optionsDescription), variablesMap); boost::program_options::notify(variablesMap); if (variablesMap.count("help")) { std::cout << optionsDescription << std::endl; return 1; } std::shared_ptr task; if (variablesMap.count("echo")) { Dsp dsp = Vqe; if (variablesMap.count("dsp")) { dsp = dspFromString(variablesMap["dsp"].as()); } int channels = 2; if (variablesMap.count("channels")) { channels = variablesMap["channels"].as(); } auto t = std::make_shared(); t->setDsp(dsp); t->setChannels(channels); task = std::dynamic_pointer_cast(t); } else if (variablesMap.count("record")) { task = std::make_shared(); } else if (variablesMap.count("play")) { std::string path; if (variablesMap.count("path")) { path = variablesMap["path"].as(); } int channels = 2; if (variablesMap.count("channels")) { channels = variablesMap["channels"].as(); } auto t = std::make_shared(); t->setChannels(channels); t->setPath(path); task = std::dynamic_pointer_cast(t); } if (!task) { std::cout << "there is not task." << std::endl << std::endl; std::cout << optionsDescription << std::endl; return 2; } try { LOG(info) << "app start."; RK_MPI_SYS_Init(); initKvsWebRtc(); auto ioConext = Singleton::instance(); boost::asio::signal_set signals(*ioConext->ioContext(), SIGINT, SIGTERM); signals.async_wait(std::bind(&signal_handler, _1, _2)); task->run(); ioConext->run(); } catch (std::exception &e) { LOG(error) << "Exception: " << e.what() << std::endl; } // WebRTCPublisher publisher(true, true); // publisher.start("172.16.103.68", "443", "/index/api/webrtc?app=live&stream=test&type=push"); return 0; } Dsp dspFromString(const std::string &dsp) { Dsp ret = Vqe; if (dsp == "speex") { ret = Speex; } else if (dsp == "aecm") { ret = AecMobile; }else if (dsp == "aec3") { ret = Aec3; } return ret; } std::string dspToString(Dsp dsp) { std::string ret = "none"; if (dsp == Vqe) { ret = "vqe"; } else if (dsp == Speex) { ret = "speex"; } else if (dsp == AecMobile) { ret = "aecm"; } else if (dsp == Aec3) { ret = "aec3"; } return ret; }