mainform.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. #include "mainform.h"
  2. #include "ui_mainform.h"
  3. #include <QMessageBox>
  4. #include <QCoreApplication>
  5. #include <QDir>
  6. #include <QSettings>
  7. #include <QTextCodec>
  8. #include "SimpleIni.h"
  9. #include "imediadeviceinfo.h"
  10. #ifndef MAX_STR_LEN
  11. #define MAX_STR_LEN 512
  12. #endif // !MAX_STR_LEN
  13. #ifndef MAX_PATH
  14. #define MAX_PATH 260
  15. #endif // !MAX_PATH
  16. typedef int (*lpfn_get_cameracountfun)();
  17. typedef int (*lpfn_get_videodevice_namefun)(int device_id, char* buf, int len);
  18. typedef int (*lpfn_get_videodevice_infofun)(int device_id, char* namebuf, int namelen, char* pathbuf, int pathlen);
  19. typedef int (*lpfn_get_videodeviceid)(const char* dev_name);
  20. static lpfn_get_cameracountfun get_cameracount = NULL;
  21. static lpfn_get_videodevice_namefun get_videodevice_name = NULL;
  22. static lpfn_get_videodevice_infofun get_videodevice_info = NULL;
  23. static lpfn_get_videodevice_namefun get_device_fullpathname = NULL;
  24. static lpfn_get_videodeviceid get_videodeviceid = NULL;
  25. static QList<AudioDeviceInfo> show_audio_dev(IAudioMgr* m_pAudioMgr, DevMode flag)
  26. {
  27. int icnt, ocnt;
  28. QList< AudioDeviceInfo> result;
  29. if (flag & AudioInput) {
  30. icnt = m_pAudioMgr->audio_get_device_count(true);
  31. qDebug() << "audio input devices: " << icnt;
  32. for (int i = 0; i < icnt; ++i) {
  33. char strname[MAX_PATH] = { 0 };
  34. m_pAudioMgr->audio_get_device_name(strname, MAX_PATH, true, i);
  35. qDebug() << i << "=" << strname;
  36. AudioDeviceInfo info;
  37. info.name = strname;
  38. info.mod = AudioInput;
  39. result << info;
  40. }
  41. }
  42. if (flag & AudioOutput) {
  43. ocnt = m_pAudioMgr->audio_get_device_count(false);
  44. qDebug() << "audio output devices: " << ocnt;
  45. for (int i = 0; i < ocnt; ++i) {
  46. char strname[MAX_PATH] = { 0 };
  47. m_pAudioMgr->audio_get_device_name(strname, MAX_PATH, false, i);
  48. AudioDeviceInfo info;
  49. info.name = strname;
  50. info.mod = AudioOutput;
  51. result << info;
  52. }
  53. }
  54. return result;
  55. }
  56. static QList<AudioDeviceInfo> show_video_dev()
  57. {
  58. int icount = get_cameracount();
  59. qDebug() << "video devices:" << icount;
  60. QList< AudioDeviceInfo> result;
  61. int inumber = 0;
  62. for (int i = 0; i < 2 * icount; ++i) {
  63. char strcamera[2 * MAX_PATH] = { 0 };
  64. char strpath[MAX_PATH] = { 0 };
  65. if (0 == get_device_fullpathname(i, strcamera, 2 * MAX_PATH)) {
  66. qDebug() << inumber++ << " " << strcamera;
  67. AudioDeviceInfo info;
  68. info.name = strcamera;
  69. info.mod = VideoDevice;
  70. result << info;
  71. }
  72. }
  73. return result;
  74. }
  75. QList<AudioDeviceInfo> MainForm::availableDevices(DevMode mode)
  76. {
  77. qDebug() << "Enter " << __FUNCTION__ << " " << mode;
  78. QList<AudioDeviceInfo> devList;
  79. if (mode & VideoDevice) {
  80. devList.append(show_video_dev());
  81. } else {
  82. if (mode & AudioInput || mode & AudioOutput) {
  83. devList.append(show_audio_dev(m_pAudioMgr, mode));
  84. }
  85. }
  86. return devList;
  87. }
  88. MainForm::MainForm(QWidget *parent) :
  89. QWidget(parent),
  90. ui(new Ui::MainForm), deviceInfoLib(nullptr), rootFilePath(), m_pAudioMgr(NULL)
  91. {
  92. ui->setupUi(this);
  93. ui->tabWidget->setVisible(false);
  94. connect(ui->modeBox, QOverload<int>::of(&QComboBox::activated), this, &MainForm::modeChanged);
  95. connect(ui->deviceBox, QOverload<int>::of(&QComboBox::activated), this, &MainForm::deviceChanged);
  96. ui->modeBox->setCurrentIndex(0);
  97. modeChanged(0);
  98. ui->deviceBox->setCurrentIndex(0);
  99. deviceChanged(0);
  100. }
  101. MainForm::~MainForm()
  102. {
  103. delete ui;
  104. if (m_pAudioMgr != NULL) {
  105. m_pAudioMgr->audio_mgr_terminate();
  106. DestroyIAudioMgrObj(m_pAudioMgr);
  107. m_pAudioMgr = NULL;
  108. }
  109. if (deviceInfoLib != nullptr) {
  110. deviceInfoLib->unload();
  111. delete deviceInfoLib;
  112. }
  113. }
  114. bool MainForm::loadExportFunctions()
  115. {
  116. QString appDir = QCoreApplication::applicationDirPath();
  117. QString libAbsolutePath = appDir + "/libmediadeviceinfo.so";
  118. qDebug() << "Enter loadExportFunctions" << " " << libAbsolutePath;
  119. if (m_pAudioMgr == NULL) {
  120. m_pAudioMgr = CreateAudioMgrObj(NULL);
  121. if (m_pAudioMgr == NULL) {
  122. qDebug() << "Initialize AudioMgr failed";
  123. return false;
  124. } else {
  125. qDebug() << "Initialize AudioMgr succ";
  126. const int res = m_pAudioMgr->audio_mgr_initialize();
  127. if (res != 0) {
  128. qDebug() << "audio_mgr_initialize failed " << res;
  129. DestroyIAudioMgrObj(m_pAudioMgr);
  130. m_pAudioMgr = NULL;
  131. return false;
  132. } else {
  133. qDebug() << "audio_mgr_initialize succ";
  134. }
  135. }
  136. }
  137. bool result = false;
  138. if (deviceInfoLib != nullptr) {
  139. return true;
  140. }
  141. qDebug() << "to load " << libAbsolutePath;
  142. deviceInfoLib = new QLibrary(libAbsolutePath);
  143. deviceInfoLib->load();
  144. do
  145. {
  146. if (!deviceInfoLib->isLoaded()) {
  147. qDebug() << "Load libmediadeviceinfo.so failed: " << deviceInfoLib->errorString() << endl;
  148. break;
  149. }
  150. get_cameracount = (lpfn_get_cameracountfun)deviceInfoLib->resolve("rvc_videocap_get_device_count");
  151. if (!get_cameracount) {
  152. qDebug() << "Load rvc_videocap_get_device_count failed: " << deviceInfoLib->errorString() << endl;
  153. break;
  154. }
  155. get_videodevice_name = (lpfn_get_videodevice_namefun)deviceInfoLib->resolve("rvc_videocap_get_device_name");
  156. if (!get_videodevice_name) {
  157. qDebug() << "Load rvc_videocap_get_device_name failed: " << deviceInfoLib->errorString() << endl;
  158. break;
  159. }
  160. get_videodevice_info = (lpfn_get_videodevice_infofun)deviceInfoLib->resolve("rvc_videocap_get_device_info");
  161. if (!get_videodevice_info) {
  162. qDebug() << "Load rvc_videocap_get_device_info failed: " << deviceInfoLib->errorString() << endl;
  163. break;
  164. }
  165. get_device_fullpathname = (lpfn_get_videodevice_namefun)deviceInfoLib->resolve("rvc_videocap_get_device_fullpathname");
  166. if (!get_device_fullpathname) {
  167. qDebug() << "Load rvc_videocap_get_device_fullpathname failed: " << deviceInfoLib->errorString() << endl;
  168. break;
  169. }
  170. get_videodeviceid = (lpfn_get_videodeviceid)deviceInfoLib->resolve("rvc_videocap_get_video_device_id");
  171. if (!get_videodeviceid) {
  172. qDebug() << "Load rvc_videocap_get_video_device_id failed: " << deviceInfoLib->errorString() << endl;
  173. break;
  174. }
  175. result = true;
  176. } while (false);
  177. if (!result) {
  178. if (deviceInfoLib != nullptr) {
  179. deviceInfoLib->unload();
  180. delete deviceInfoLib;
  181. deviceInfoLib = nullptr;
  182. }
  183. }
  184. qDebug() << "Leave loadExportFunctions" << " " << result;
  185. return result;
  186. }
  187. DevMode MainForm::convertIdx2Mode(int idx)
  188. {
  189. DevMode result = DevMode::MediaALL;
  190. switch (idx) {
  191. case 0:
  192. result = DevMode::AudioInput;
  193. break;
  194. case 1:
  195. result = DevMode::AudioOutput;
  196. break;
  197. case 2:
  198. result = DevMode::VideoDevice_Env;
  199. break;
  200. case 3:
  201. result = DevMode::VideoDevice_Opt;
  202. break;
  203. case 4:
  204. result = DevMode::VideoDevice_Ews;
  205. break;
  206. default:
  207. break;
  208. }
  209. return result;
  210. }
  211. void MainForm::modeChanged(int idx)
  212. {
  213. ui->deviceBox->clear();
  214. DevMode mode = convertIdx2Mode(idx);
  215. if (deviceInfoLib != nullptr || loadExportFunctions()) {
  216. for (auto& deviceInfo : availableDevices(mode))
  217. ui->deviceBox->addItem(deviceInfo.name, QVariant::fromValue(deviceInfo));
  218. }
  219. ui->deviceBox->setCurrentIndex(0);
  220. deviceChanged(0);
  221. }
  222. void MainForm::deviceChanged(int idx)
  223. {
  224. if (ui->deviceBox->count() == 0)
  225. return;
  226. if (idx == -1) {
  227. int newIdx = 0;
  228. const int selectIdx = ui->modeBox->currentIndex();
  229. DevMode mode = convertIdx2Mode(selectIdx);
  230. QVariant curName = getCurrentActiveDev(mode);
  231. for (int i = 0; i < ui->deviceBox->count() && curName.isValid(); ++i) {
  232. AudioDeviceInfo item = ui->deviceBox->itemData(i).value<AudioDeviceInfo>();
  233. qDebug() << "devicechange: " << item.name << " vs " << curName.toString();
  234. if (item.name == curName.toString()) {
  235. newIdx = i;
  236. break;
  237. }
  238. }
  239. ui->deviceBox->setCurrentIndex(newIdx);
  240. qDebug() << "pre deviceChanged -1 with " << newIdx;
  241. deviceChanged(newIdx);
  242. qDebug() << "return deviceChanged -1 with " << newIdx;
  243. return;
  244. }
  245. qDebug() << "pre pre deviceChanged normal with " << idx;
  246. ui->deviceBox->itemData(idx).value<AudioDeviceInfo>();
  247. // device has changed
  248. qDebug() << "pre deviceChanged normal with " << idx;
  249. m_deviceInfo = ui->deviceBox->itemData(idx).value<AudioDeviceInfo>();
  250. qDebug() << "return deviceChanged normal with " << idx;
  251. }
  252. void MainForm::on_loadBtn_clicked()
  253. {
  254. qDebug() << "Enter " << __FUNCTION__;
  255. const int selectIdx = ui->modeBox->currentIndex();
  256. modeChanged(selectIdx);
  257. }
  258. void MainForm::on_saveBtn_clicked()
  259. {
  260. qDebug() << "Enter " << __FUNCTION__;
  261. const int selectIdx = ui->modeBox->currentIndex();
  262. DevMode mode = convertIdx2Mode(selectIdx);
  263. if (!setCurrentActiveDevThirdParty(mode, m_deviceInfo.name)) {
  264. QMessageBox::critical(this, "错误", "写入失败!请重试");
  265. } else {
  266. QMessageBox::information(this, "提示", "已应用!");
  267. }
  268. }
  269. QVariant MainForm::getCurrentActiveDev(DevMode mode)
  270. {
  271. QString configPath = getRootIniPath();
  272. QSettings settings(configPath, QSettings::IniFormat);
  273. settings.setIniCodec("UTF-8");
  274. QVariant result;
  275. switch (mode) {
  276. case AudioInput:
  277. settings.beginGroup("Audio");
  278. result = settings.value("handfree_in_dev");
  279. settings.endGroup();
  280. break;
  281. case AudioOutput:
  282. settings.beginGroup("Audio");
  283. result = settings.value("handfree_out_dev");
  284. settings.endGroup();
  285. break;
  286. case VideoDevice_Env:
  287. settings.beginGroup("Video");
  288. result = settings.value("EnvCamera");
  289. settings.endGroup();
  290. break;
  291. case VideoDevice_Opt:
  292. settings.beginGroup("Video");
  293. result = settings.value("OptCamera");
  294. settings.endGroup();
  295. break;
  296. case VideoDevice_Ews:
  297. settings.beginGroup("Video");
  298. result = settings.value("EwsCamera");
  299. settings.endGroup();
  300. break;
  301. case MediaALL:
  302. break;
  303. default:
  304. break;
  305. }
  306. qDebug() << "get " << mode << " " << result;
  307. return result;
  308. }
  309. bool MainForm::setCurrentActiveDevThirdParty(DevMode mode, QVariant value)
  310. {
  311. QString configPath = getRootIniPath();
  312. CSimpleIniA ini;
  313. ini.SetUnicode(true);
  314. QByteArray ba = configPath.toLatin1();
  315. const char* str = ba.data();
  316. SI_Error rc = ini.LoadFile(str);
  317. if (rc != SI_OK) {
  318. qDebug() << "Load file " << configPath << " failed: " << rc;
  319. return false;
  320. };
  321. const char* newValue = value.toByteArray().data();
  322. bool result = false;
  323. switch (mode) {
  324. case AudioInput:
  325. rc = ini.SetValue("Audio", "handfree_in_dev", newValue);
  326. if(rc == SI_INSERTED) rc = ini.SetValue("Audio", "handfree_in_dev", newValue);
  327. result = !(rc < 0);
  328. break;
  329. case AudioOutput:
  330. rc = ini.SetValue("Audio", "handfree_out_dev", newValue);
  331. if (rc == SI_INSERTED) rc = ini.SetValue("Audio", "handfree_out_dev", newValue);
  332. result = !(rc < 0);
  333. break;
  334. case VideoDevice_Env:
  335. rc = ini.SetValue("Video", "EnvCamera", newValue);
  336. if (rc == SI_INSERTED) rc = ini.SetValue("Video", "EnvCamera", newValue);
  337. result = !(rc < 0);
  338. break;
  339. case VideoDevice_Opt:
  340. rc = ini.SetValue("Video", "OptCamera", newValue);
  341. if (rc == SI_INSERTED) rc = ini.SetValue("Video", "OptCamera", newValue);
  342. result = !(rc < 0);
  343. break;
  344. case VideoDevice_Ews:
  345. rc = ini.SetValue("Video", "EwsCamera", newValue);
  346. if (rc == SI_INSERTED) rc = ini.SetValue("Video", "EwsCamera", newValue);
  347. result = !(rc < 0);
  348. break;
  349. case MediaALL:
  350. break;
  351. default:
  352. break;
  353. }
  354. if (result && (rc = ini.SaveFile(str, false)) < 0) {
  355. if (result) {
  356. qDebug() << "SaveFile failed: " << rc;
  357. result = false;
  358. }
  359. }
  360. if (result) {
  361. QVariant newValue = getCurrentActiveDev(mode);
  362. if (newValue != value) {
  363. qDebug() << "newValue: " << newValue << " vs " << value;
  364. result = false;
  365. }
  366. }
  367. return result;
  368. }
  369. bool MainForm::setCurrentActiveDev(DevMode mode, QVariant value)
  370. {
  371. QString configPath = getRootIniPath();
  372. QSettings settings(configPath, QSettings::IniFormat);
  373. settings.setIniCodec("UTF-8");
  374. //QVariant persistentValue(value);
  375. QString persistentValue = QString::fromLocal8Bit(value.toByteArray());
  376. QTextCodec* codec = QTextCodec::codecForName("UTF8");
  377. persistentValue = codec->fromUnicode(value.toString());
  378. qDebug() << "fromUnicode: " << persistentValue;
  379. bool result = false;
  380. switch (mode) {
  381. case AudioInput:
  382. settings.beginGroup("Audio");
  383. settings.setValue("handfree_in_dev", persistentValue);
  384. settings.endGroup();
  385. result = true;
  386. break;
  387. case AudioOutput:
  388. settings.beginGroup("Audio");
  389. settings.setValue("handfree_out_dev", persistentValue);
  390. settings.endGroup();
  391. result = true;
  392. break;
  393. case VideoDevice_Env:
  394. settings.beginGroup("Video");
  395. settings.setValue("EnvCamera", persistentValue);
  396. settings.endGroup();
  397. result = true;
  398. break;
  399. case VideoDevice_Opt:
  400. settings.beginGroup("Video");
  401. settings.setValue("OptCamera", persistentValue);
  402. settings.endGroup();
  403. result = true;
  404. break;
  405. case VideoDevice_Ews:
  406. settings.beginGroup("Video");
  407. settings.setValue("EwsCamera", persistentValue);
  408. settings.endGroup();
  409. result = true;
  410. break;
  411. case MediaALL:
  412. break;
  413. default:
  414. break;
  415. }
  416. if (result) {
  417. QVariant newValue = getCurrentActiveDev(mode);
  418. if (newValue != value) {
  419. qDebug() << "newValue: " << newValue << " vs " << value;
  420. result = false;
  421. }
  422. }
  423. return result;
  424. }
  425. QString MainForm::getRootIniPath()
  426. {
  427. if (rootFilePath.isEmpty()) {
  428. QString appDir = QCoreApplication::applicationDirPath();
  429. QDir dir(appDir); //bin
  430. dir.cdUp(); //1.2.3.4
  431. dir.cdUp(); //version
  432. dir.cdUp(); //Run
  433. dir.cd("hardwarecfg");
  434. QString rootIniPath = dir.absolutePath() + "/root.ini";
  435. //QFileInfoList rootInis = dir.entryInfoList(QStringList() << "root.ini", QDir::Files);
  436. qDebug() << "root path at media page: " << rootIniPath;
  437. rootFilePath = rootIniPath;
  438. }
  439. return rootFilePath;
  440. }