telephone_audio_initializer.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * telephone_audio_initializer.cpp
  3. *
  4. * Created on: 2022年6月27日
  5. * Author: pengzc
  6. */
  7. #include "telephone_audio_initializer.h"
  8. #include <sstream>
  9. #include <fstream>
  10. #include <utils/Log.h>
  11. #include <json/json.h>
  12. #include "zkaudio.h"
  13. static int GetInt(Json::Value& json_object, const std::string& key, int def) {
  14. if (json_object.isObject() && json_object.isMember(key)
  15. && json_object[key].isInt()) {
  16. return json_object[key].asInt();
  17. }
  18. return def;
  19. }
  20. #define LOG_TAG "TelephoneAudioInitializer"
  21. int TelephoneAudioInitializer::Setup(voip::Telephone* telephone,
  22. const std::string& filename) {
  23. if (telephone == NULL) {
  24. LOGE("telephone must not be null");
  25. return -1;
  26. }
  27. std::string str;
  28. {
  29. std::ifstream ifs(filename, std::ios::in | std::ios::binary);
  30. if (!ifs.is_open()) {
  31. LOGE("can not open file, %s", filename.c_str());
  32. return -1;
  33. }
  34. std::stringstream ss;
  35. ss << ifs.rdbuf();
  36. str = ss.str();
  37. ifs.close();
  38. }
  39. Json::Value obj;
  40. {
  41. Json::Reader reader;
  42. if (!reader.parse(str.c_str(), str.c_str() + str.length(), obj, false)) {
  43. LOGE("invalid json string");
  44. return -1;
  45. }
  46. }
  47. if(obj.isMember("input_volume")) {
  48. auto input = obj["input_volume"];
  49. int ch_0_vol = GetInt(input, "channel_0", 0);
  50. int ch_1_vol = GetInt(input, "channel_1", 0);
  51. zk_audio_input_set_volume_native(0, ch_0_vol);
  52. zk_audio_input_set_volume_native(1, ch_1_vol);
  53. LOGD("input volume [%d,%d]", ch_0_vol, ch_1_vol);
  54. } else {
  55. LOGE("not found input_volume");
  56. }
  57. int out_vol = GetInt(obj, "output_volume", 0);
  58. zk_audio_output_set_volume_native(out_vol);
  59. LOGD("output volume %d", out_vol);
  60. const char* AEC_KEY = "acoustic_echo_cancellater";
  61. base::AcousticEchoCancellater::Configuration aec_conf;
  62. if (obj.isMember(AEC_KEY)) {
  63. aec_conf = aec_conf.FromString(
  64. obj[AEC_KEY].toStyledString());
  65. } else {
  66. LOGE("not found acoustic_echo_cancellater");
  67. }
  68. const char* APC_KEY = "audio_process_chain";
  69. base::AudioProcessChain::Configuration apc_conf;
  70. if (obj.isMember(APC_KEY)) {
  71. apc_conf = apc_conf.FromString(obj[APC_KEY].toStyledString());
  72. } else {
  73. LOGE("not found audio_process_chain");
  74. }
  75. LOGD("aec configuration\n%s", aec_conf.ToString().c_str());
  76. LOGD("apc configuration\n%s",apc_conf.ToString().c_str());
  77. telephone->SetInputAecApcConfig(aec_conf, apc_conf);
  78. return 0;
  79. }