mainform.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534
  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. #define COMBOX_AUDIO_INPUT_HANDFREE 0
  188. #define COMBOX_AUDIO_OUTPUT_HANDFREE 1
  189. #define COMBOX_AUDIO_INPUT_PICKUP 2
  190. #define COMBOX_AUDIO_OUTPUT_PICKUP 3
  191. #define COMBOX_CAMERA_FRONT_UP 4
  192. #define COMBOX_CAMERA_BACK_BOTTOM 5
  193. #define COMBOX_CAMERA_EWS 6
  194. DevMode MainForm::convertIdx2Mode(int idx)
  195. {
  196. DevMode result = DevMode::MediaALL;
  197. switch (idx) {
  198. case COMBOX_AUDIO_INPUT_HANDFREE:
  199. result = DevMode::AudioInput_HandFree;
  200. break;
  201. case COMBOX_AUDIO_OUTPUT_HANDFREE:
  202. result = DevMode::AudioOutput_HandFree;
  203. break;
  204. case COMBOX_AUDIO_INPUT_PICKUP:
  205. result = DevMode::AudioInput_PickUp;
  206. break;
  207. case COMBOX_AUDIO_OUTPUT_PICKUP:
  208. result = DevMode::AudioOutput_PickUp;
  209. break;
  210. case COMBOX_CAMERA_FRONT_UP:
  211. result = DevMode::VideoDevice_Env;
  212. break;
  213. case COMBOX_CAMERA_BACK_BOTTOM:
  214. result = DevMode::VideoDevice_Opt;
  215. break;
  216. case COMBOX_CAMERA_EWS:
  217. result = DevMode::VideoDevice_Ews;
  218. break;
  219. default:
  220. break;
  221. }
  222. return result;
  223. }
  224. void MainForm::modeChanged(int idx)
  225. {
  226. ui->deviceBox->clear();
  227. DevMode mode = convertIdx2Mode(idx);
  228. if (deviceInfoLib != nullptr || loadExportFunctions()) {
  229. for (auto& deviceInfo : availableDevices(mode))
  230. ui->deviceBox->addItem(deviceInfo.name, QVariant::fromValue(deviceInfo));
  231. }
  232. ui->deviceBox->setCurrentIndex(0);
  233. deviceChanged(0);
  234. }
  235. void MainForm::deviceChanged(int idx)
  236. {
  237. if (ui->deviceBox->count() == 0)
  238. return;
  239. if (idx == -1) {
  240. int newIdx = 0;
  241. const int selectIdx = ui->modeBox->currentIndex();
  242. DevMode mode = convertIdx2Mode(selectIdx);
  243. QVariant curName = getCurrentActiveDev(mode);
  244. for (int i = 0; i < ui->deviceBox->count() && curName.isValid(); ++i) {
  245. AudioDeviceInfo item = ui->deviceBox->itemData(i).value<AudioDeviceInfo>();
  246. qDebug() << "devicechange: " << item.name << " vs " << curName.toString();
  247. if (item.name == curName.toString()) {
  248. newIdx = i;
  249. break;
  250. }
  251. }
  252. ui->deviceBox->setCurrentIndex(newIdx);
  253. qDebug() << "pre deviceChanged -1 with " << newIdx;
  254. deviceChanged(newIdx);
  255. qDebug() << "return deviceChanged -1 with " << newIdx;
  256. return;
  257. }
  258. qDebug() << "pre pre deviceChanged normal with " << idx;
  259. ui->deviceBox->itemData(idx).value<AudioDeviceInfo>();
  260. // device has changed
  261. qDebug() << "pre deviceChanged normal with " << idx;
  262. m_deviceInfo = ui->deviceBox->itemData(idx).value<AudioDeviceInfo>();
  263. qDebug() << "return deviceChanged normal with " << idx;
  264. }
  265. void MainForm::on_loadBtn_clicked()
  266. {
  267. qDebug() << "Enter " << __FUNCTION__;
  268. const int selectIdx = ui->modeBox->currentIndex();
  269. modeChanged(selectIdx);
  270. }
  271. void MainForm::on_saveBtn_clicked()
  272. {
  273. qDebug() << "Enter " << __FUNCTION__;
  274. const int selectIdx = ui->modeBox->currentIndex();
  275. DevMode mode = convertIdx2Mode(selectIdx);
  276. if (!setCurrentActiveDevThirdParty(mode, m_deviceInfo.name)) {
  277. QMessageBox::critical(this, "错误", "写入失败!请重试");
  278. } else {
  279. QMessageBox::information(this, "提示", "已应用!");
  280. }
  281. }
  282. QVariant MainForm::getCurrentActiveDev(DevMode mode)
  283. {
  284. QString configPath = getRootIniPath();
  285. QSettings settings(configPath, QSettings::IniFormat);
  286. settings.setIniCodec("UTF-8");
  287. QVariant result;
  288. switch (mode) {
  289. case AudioInput_HandFree:
  290. settings.beginGroup("Audio");
  291. result = settings.value("handfree_in_dev");
  292. settings.endGroup();
  293. break;
  294. case AudioOutput_HandFree:
  295. settings.beginGroup("Audio");
  296. result = settings.value("handfree_out_dev");
  297. settings.endGroup();
  298. break;
  299. case AudioInput_PickUp:
  300. settings.beginGroup("Audio");
  301. result = settings.value("pickup_in_dev");
  302. settings.endGroup();
  303. break;
  304. case AudioOutput_PickUp:
  305. settings.beginGroup("Audio");
  306. result = settings.value("pickup_out_dev");
  307. settings.endGroup();
  308. break;
  309. case VideoDevice_Env:
  310. settings.beginGroup("Video");
  311. result = settings.value("EnvCamera");
  312. settings.endGroup();
  313. break;
  314. case VideoDevice_Opt:
  315. settings.beginGroup("Video");
  316. result = settings.value("OptCamera");
  317. settings.endGroup();
  318. break;
  319. case VideoDevice_Ews:
  320. settings.beginGroup("Video");
  321. result = settings.value("EwsCamera");
  322. settings.endGroup();
  323. break;
  324. case MediaALL:
  325. break;
  326. default:
  327. break;
  328. }
  329. qDebug() << "get " << mode << " " << result;
  330. return result;
  331. }
  332. bool MainForm::setCurrentActiveDevThirdParty(DevMode mode, QVariant value)
  333. {
  334. QString configPath = getRootIniPath();
  335. CSimpleIniA ini;
  336. ini.SetUnicode(true);
  337. QByteArray ba = configPath.toLatin1();
  338. const char* str = ba.data();
  339. SI_Error rc = ini.LoadFile(str);
  340. if (rc != SI_OK) {
  341. qDebug() << "Load file " << configPath << " failed: " << rc;
  342. return false;
  343. };
  344. ini.SetSpaces(false);
  345. ini.SetMultiLine(false);
  346. const char* newValue = value.toByteArray().data();
  347. bool result = false;
  348. switch (mode) {
  349. case AudioInput_HandFree:
  350. rc = ini.SetValue("Audio", "handfree_in_dev", newValue);
  351. if(rc == SI_INSERTED) rc = ini.SetValue("Audio", "handfree_in_dev", newValue);
  352. result = !(rc < 0);
  353. break;
  354. case AudioOutput_HandFree:
  355. rc = ini.SetValue("Audio", "handfree_out_dev", newValue);
  356. if (rc == SI_INSERTED) rc = ini.SetValue("Audio", "handfree_out_dev", newValue);
  357. result = !(rc < 0);
  358. break;
  359. case AudioInput_PickUp:
  360. rc = ini.SetValue("Audio", "pickup_in_dev", newValue);
  361. if (rc == SI_INSERTED) rc = ini.SetValue("Audio", "pickup_in_dev", newValue);
  362. result = !(rc < 0);
  363. break;
  364. case AudioOutput_PickUp:
  365. rc = ini.SetValue("Audio", "pickup_out_dev", newValue);
  366. if (rc == SI_INSERTED) rc = ini.SetValue("Audio", "pickup_out_dev", newValue);
  367. result = !(rc < 0);
  368. break;
  369. case VideoDevice_Env:
  370. rc = ini.SetValue("Video", "EnvCamera", newValue);
  371. if (rc == SI_INSERTED) rc = ini.SetValue("Video", "EnvCamera", newValue);
  372. result = !(rc < 0);
  373. break;
  374. case VideoDevice_Opt:
  375. rc = ini.SetValue("Video", "OptCamera", newValue);
  376. if (rc == SI_INSERTED) rc = ini.SetValue("Video", "OptCamera", newValue);
  377. result = !(rc < 0);
  378. break;
  379. case VideoDevice_Ews:
  380. rc = ini.SetValue("Video", "EwsCamera", newValue);
  381. if (rc == SI_INSERTED) rc = ini.SetValue("Video", "EwsCamera", newValue);
  382. result = !(rc < 0);
  383. break;
  384. case MediaALL:
  385. break;
  386. default:
  387. break;
  388. }
  389. if (result && (rc = ini.SaveFile(str, false)) < 0) {
  390. if (result) {
  391. qDebug() << "SaveFile failed: " << rc;
  392. result = false;
  393. }
  394. }
  395. if (result) {
  396. QVariant newValue = getCurrentActiveDev(mode);
  397. if (newValue != value) {
  398. qDebug() << "newValue: " << newValue << " vs " << value;
  399. result = false;
  400. }
  401. }
  402. return result;
  403. }
  404. bool MainForm::setCurrentActiveDev(DevMode mode, QVariant value)
  405. {
  406. QString configPath = getRootIniPath();
  407. QSettings settings(configPath, QSettings::IniFormat);
  408. settings.setIniCodec("UTF-8");
  409. //QVariant persistentValue(value);
  410. QString persistentValue = QString::fromLocal8Bit(value.toByteArray());
  411. QTextCodec* codec = QTextCodec::codecForName("UTF8");
  412. persistentValue = codec->fromUnicode(value.toString());
  413. qDebug() << "fromUnicode: " << persistentValue;
  414. bool result = false;
  415. switch (mode) {
  416. case AudioInput_HandFree:
  417. settings.beginGroup("Audio");
  418. settings.setValue("handfree_in_dev", persistentValue);
  419. settings.endGroup();
  420. result = true;
  421. break;
  422. case AudioOutput_HandFree:
  423. settings.beginGroup("Audio");
  424. settings.setValue("handfree_out_dev", persistentValue);
  425. settings.endGroup();
  426. result = true;
  427. break;
  428. case AudioInput_PickUp:
  429. settings.beginGroup("Audio");
  430. settings.setValue("pickup_in_dev", persistentValue);
  431. settings.endGroup();
  432. result = true;
  433. break;
  434. case AudioOutput_PickUp:
  435. settings.beginGroup("Audio");
  436. settings.setValue("pickup_out_dev", persistentValue);
  437. settings.endGroup();
  438. result = true;
  439. break;
  440. case VideoDevice_Env:
  441. settings.beginGroup("Video");
  442. settings.setValue("EnvCamera", persistentValue);
  443. settings.endGroup();
  444. result = true;
  445. break;
  446. case VideoDevice_Opt:
  447. settings.beginGroup("Video");
  448. settings.setValue("OptCamera", persistentValue);
  449. settings.endGroup();
  450. result = true;
  451. break;
  452. case VideoDevice_Ews:
  453. settings.beginGroup("Video");
  454. settings.setValue("EwsCamera", persistentValue);
  455. settings.endGroup();
  456. result = true;
  457. break;
  458. case MediaALL:
  459. break;
  460. default:
  461. break;
  462. }
  463. if (result) {
  464. QVariant newValue = getCurrentActiveDev(mode);
  465. if (newValue != value) {
  466. qDebug() << "newValue: " << newValue << " vs " << value;
  467. result = false;
  468. }
  469. }
  470. return result;
  471. }
  472. QString MainForm::getRootIniPath()
  473. {
  474. if (rootFilePath.isEmpty()) {
  475. QString appDir = QCoreApplication::applicationDirPath();
  476. QDir dir(appDir); //bin
  477. dir.cdUp(); //1.2.3.4
  478. dir.cdUp(); //version
  479. dir.cdUp(); //Run
  480. dir.cd("hardwarecfg");
  481. QString rootIniPath = dir.absolutePath() + "/root.ini";
  482. //QFileInfoList rootInis = dir.entryInfoList(QStringList() << "root.ini", QDir::Files);
  483. qDebug() << "root path at media page: " << rootIniPath;
  484. rootFilePath = rootIniPath;
  485. }
  486. return rootFilePath;
  487. }