mainform.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  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 < 64 && inumber < icount; ++i) {
  63. char strcamera[2 * MAX_PATH] = { 0 };
  64. if (0 == get_device_fullpathname(i, strcamera, 2 * MAX_PATH)) {
  65. qDebug() << inumber++ << " " << strcamera;
  66. AudioDeviceInfo info;
  67. info.name = strcamera;
  68. info.mod = VideoDevice;
  69. result << info;
  70. }
  71. }
  72. return result;
  73. }
  74. QList<AudioDeviceInfo> MainForm::availableDevices(DevMode mode)
  75. {
  76. qDebug() << "Enter " << __FUNCTION__ << " " << mode;
  77. QList<AudioDeviceInfo> devList;
  78. if (mode & VideoDevice) {
  79. devList.append(show_video_dev());
  80. } else {
  81. if (mode & AudioInput || mode & AudioOutput) {
  82. devList.append(show_audio_dev(m_pAudioMgr, mode));
  83. }
  84. }
  85. return devList;
  86. }
  87. static void __audiomgrlog(void* user_data, const char* fmt, va_list arg)
  88. {
  89. }
  90. MainForm::MainForm(QWidget *parent):
  91. QWidget(parent),
  92. ui(new Ui::MainForm), deviceInfoLib(nullptr), rootFilePath(), m_pAudioMgr(NULL)
  93. {
  94. ui->setupUi(this);
  95. ui->tabWidget->setVisible(false);
  96. connect(ui->modeBox, QOverload<int>::of(&QComboBox::activated), this, &MainForm::modeChanged);
  97. connect(ui->deviceBox, QOverload<int>::of(&QComboBox::activated), this, &MainForm::deviceChanged);
  98. ui->modeBox->setCurrentIndex(0);
  99. modeChanged(0);
  100. ui->deviceBox->setCurrentIndex(0);
  101. deviceChanged(0);
  102. }
  103. MainForm::~MainForm()
  104. {
  105. delete ui;
  106. if (m_pAudioMgr != NULL) {
  107. m_pAudioMgr->audio_mgr_terminate();
  108. DestroyIAudioMgrObj(m_pAudioMgr);
  109. m_pAudioMgr = NULL;
  110. }
  111. if (deviceInfoLib != nullptr) {
  112. deviceInfoLib->unload();
  113. delete deviceInfoLib;
  114. }
  115. }
  116. bool MainForm::loadExportFunctions()
  117. {
  118. QString appDir = QCoreApplication::applicationDirPath();
  119. QString libAbsolutePath = appDir + "/libmediadeviceinfo.so";
  120. qDebug() << "Enter loadExportFunctions" << " " << libAbsolutePath;
  121. if (m_pAudioMgr == NULL) {
  122. audiomgr_callback_t t_callback = { 0 };
  123. t_callback.debug = &__audiomgrlog;
  124. m_pAudioMgr = CreateAudioMgrObj(&t_callback);
  125. if (m_pAudioMgr == NULL) {
  126. qDebug() << "Initialize AudioMgr failed";
  127. return false;
  128. } else {
  129. qDebug() << "Initialize AudioMgr succ";
  130. const int res = m_pAudioMgr->audio_mgr_initialize();
  131. if (res != 0) {
  132. qDebug() << "audio_mgr_initialize failed " << res;
  133. DestroyIAudioMgrObj(m_pAudioMgr);
  134. m_pAudioMgr = NULL;
  135. return false;
  136. } else {
  137. qDebug() << "audio_mgr_initialize succ";
  138. }
  139. }
  140. }
  141. bool result = false;
  142. if (deviceInfoLib != nullptr) {
  143. return true;
  144. }
  145. qDebug() << "to load " << libAbsolutePath;
  146. deviceInfoLib = new QLibrary(libAbsolutePath);
  147. deviceInfoLib->load();
  148. do
  149. {
  150. if (!deviceInfoLib->isLoaded()) {
  151. qDebug() << "Load libmediadeviceinfo.so failed: " << deviceInfoLib->errorString() << endl;
  152. break;
  153. }
  154. get_cameracount = (lpfn_get_cameracountfun)deviceInfoLib->resolve("rvc_videocap_get_device_count");
  155. if (!get_cameracount) {
  156. qDebug() << "Load rvc_videocap_get_device_count failed: " << deviceInfoLib->errorString() << endl;
  157. break;
  158. }
  159. get_videodevice_name = (lpfn_get_videodevice_namefun)deviceInfoLib->resolve("rvc_videocap_get_device_name");
  160. if (!get_videodevice_name) {
  161. qDebug() << "Load rvc_videocap_get_device_name failed: " << deviceInfoLib->errorString() << endl;
  162. break;
  163. }
  164. get_videodevice_info = (lpfn_get_videodevice_infofun)deviceInfoLib->resolve("rvc_videocap_get_device_info");
  165. if (!get_videodevice_info) {
  166. qDebug() << "Load rvc_videocap_get_device_info failed: " << deviceInfoLib->errorString() << endl;
  167. break;
  168. }
  169. get_device_fullpathname = (lpfn_get_videodevice_namefun)deviceInfoLib->resolve("rvc_videocap_get_device_fullpathname");
  170. if (!get_device_fullpathname) {
  171. qDebug() << "Load rvc_videocap_get_device_fullpathname failed: " << deviceInfoLib->errorString() << endl;
  172. break;
  173. }
  174. get_videodeviceid = (lpfn_get_videodeviceid)deviceInfoLib->resolve("rvc_videocap_get_video_device_id");
  175. if (!get_videodeviceid) {
  176. qDebug() << "Load rvc_videocap_get_video_device_id failed: " << deviceInfoLib->errorString() << endl;
  177. break;
  178. }
  179. result = true;
  180. } while (false);
  181. if (!result) {
  182. if (deviceInfoLib != nullptr) {
  183. deviceInfoLib->unload();
  184. delete deviceInfoLib;
  185. deviceInfoLib = nullptr;
  186. }
  187. }
  188. qDebug() << "Leave loadExportFunctions" << " " << result;
  189. return result;
  190. }
  191. #define COMBOX_AUDIO_INPUT_HANDFREE 0
  192. #define COMBOX_AUDIO_OUTPUT_HANDFREE 1
  193. #define COMBOX_AUDIO_INPUT_PICKUP 2
  194. #define COMBOX_AUDIO_OUTPUT_PICKUP 3
  195. #define COMBOX_CAMERA_FRONT_UP 4
  196. #define COMBOX_CAMERA_BACK_BOTTOM 5
  197. #define COMBOX_CAMERA_EWS 6
  198. DevMode MainForm::convertIdx2Mode(int idx)
  199. {
  200. DevMode result = DevMode::MediaALL;
  201. switch (idx) {
  202. case COMBOX_AUDIO_INPUT_HANDFREE:
  203. result = DevMode::AudioInput_HandFree;
  204. break;
  205. case COMBOX_AUDIO_OUTPUT_HANDFREE:
  206. result = DevMode::AudioOutput_HandFree;
  207. break;
  208. case COMBOX_AUDIO_INPUT_PICKUP:
  209. result = DevMode::AudioInput_PickUp;
  210. break;
  211. case COMBOX_AUDIO_OUTPUT_PICKUP:
  212. result = DevMode::AudioOutput_PickUp;
  213. break;
  214. case COMBOX_CAMERA_FRONT_UP:
  215. result = DevMode::VideoDevice_Env;
  216. break;
  217. case COMBOX_CAMERA_BACK_BOTTOM:
  218. result = DevMode::VideoDevice_Opt;
  219. break;
  220. case COMBOX_CAMERA_EWS:
  221. result = DevMode::VideoDevice_Ews;
  222. break;
  223. default:
  224. break;
  225. }
  226. return result;
  227. }
  228. void MainForm::modeChanged(int idx)
  229. {
  230. ui->deviceBox->clear();
  231. DevMode mode = convertIdx2Mode(idx);
  232. if (deviceInfoLib != nullptr || loadExportFunctions()) {
  233. for (auto& deviceInfo : availableDevices(mode))
  234. ui->deviceBox->addItem(deviceInfo.name, QVariant::fromValue(deviceInfo));
  235. }
  236. ui->deviceBox->setCurrentIndex(0);
  237. deviceChanged(0);
  238. }
  239. void MainForm::deviceChanged(int idx)
  240. {
  241. if (ui->deviceBox->count() == 0)
  242. return;
  243. if (idx == -1) {
  244. int newIdx = 0;
  245. const int selectIdx = ui->modeBox->currentIndex();
  246. DevMode mode = convertIdx2Mode(selectIdx);
  247. QVariant curName = getCurrentActiveDev(mode);
  248. for (int i = 0; i < ui->deviceBox->count() && curName.isValid(); ++i) {
  249. AudioDeviceInfo item = ui->deviceBox->itemData(i).value<AudioDeviceInfo>();
  250. qDebug() << "devicechange: " << item.name << " vs " << curName.toString();
  251. if (item.name == curName.toString()) {
  252. newIdx = i;
  253. break;
  254. }
  255. }
  256. ui->deviceBox->setCurrentIndex(newIdx);
  257. qDebug() << "pre deviceChanged -1 with " << newIdx;
  258. deviceChanged(newIdx);
  259. qDebug() << "return deviceChanged -1 with " << newIdx;
  260. return;
  261. }
  262. qDebug() << "pre pre deviceChanged normal with " << idx;
  263. ui->deviceBox->itemData(idx).value<AudioDeviceInfo>();
  264. // device has changed
  265. qDebug() << "pre deviceChanged normal with " << idx;
  266. m_deviceInfo = ui->deviceBox->itemData(idx).value<AudioDeviceInfo>();
  267. qDebug() << "return deviceChanged normal with " << idx;
  268. }
  269. void MainForm::on_loadBtn_clicked()
  270. {
  271. qDebug() << "Enter " << __FUNCTION__;
  272. const int selectIdx = ui->modeBox->currentIndex();
  273. modeChanged(selectIdx);
  274. }
  275. void MainForm::on_saveBtn_clicked()
  276. {
  277. qDebug() << "Enter " << __FUNCTION__;
  278. const int selectIdx = ui->modeBox->currentIndex();
  279. DevMode mode = convertIdx2Mode(selectIdx);
  280. if (!setCurrentActiveDevThirdParty(mode, m_deviceInfo.name)) {
  281. QMessageBox::critical(this, "错误", "写入失败!请重试");
  282. } else {
  283. QMessageBox::information(this, "提示", "已应用!");
  284. }
  285. }
  286. QVariant MainForm::getCurrentActiveDev(DevMode mode)
  287. {
  288. QString configPath = getRootIniPath();
  289. QSettings settings(configPath, QSettings::IniFormat);
  290. settings.setIniCodec("UTF-8");
  291. QVariant result;
  292. switch (mode) {
  293. case AudioInput_HandFree:
  294. settings.beginGroup("Audio");
  295. result = settings.value("handfree_in_dev");
  296. settings.endGroup();
  297. break;
  298. case AudioOutput_HandFree:
  299. settings.beginGroup("Audio");
  300. result = settings.value("handfree_out_dev");
  301. settings.endGroup();
  302. break;
  303. case AudioInput_PickUp:
  304. settings.beginGroup("Audio");
  305. result = settings.value("pickup_in_dev");
  306. settings.endGroup();
  307. break;
  308. case AudioOutput_PickUp:
  309. settings.beginGroup("Audio");
  310. result = settings.value("pickup_out_dev");
  311. settings.endGroup();
  312. break;
  313. case VideoDevice_Env:
  314. settings.beginGroup("Video");
  315. result = settings.value("EnvCamera");
  316. settings.endGroup();
  317. break;
  318. case VideoDevice_Opt:
  319. settings.beginGroup("Video");
  320. result = settings.value("OptCamera");
  321. settings.endGroup();
  322. break;
  323. case VideoDevice_Ews:
  324. settings.beginGroup("Video");
  325. result = settings.value("EwsCamera");
  326. settings.endGroup();
  327. break;
  328. case MediaALL:
  329. break;
  330. default:
  331. break;
  332. }
  333. qDebug() << "get " << mode << " " << result;
  334. return result;
  335. }
  336. bool MainForm::setCurrentActiveDevThirdParty(DevMode mode, QVariant value)
  337. {
  338. QString configPath = getRootIniPath();
  339. CSimpleIniA ini;
  340. ini.SetUnicode(true);
  341. QByteArray ba = configPath.toLatin1();
  342. const char* str = ba.data();
  343. SI_Error rc = ini.LoadFile(str);
  344. if (rc != SI_OK) {
  345. qDebug() << "Load file " << configPath << " failed: " << rc;
  346. return false;
  347. };
  348. ini.SetSpaces(false);
  349. ini.SetMultiLine(false);
  350. const char* newValue = value.toByteArray().data();
  351. bool result = false;
  352. switch (mode) {
  353. case AudioInput_HandFree:
  354. rc = ini.SetValue("Audio", "handfree_in_dev", newValue);
  355. if(rc == SI_INSERTED) rc = ini.SetValue("Audio", "handfree_in_dev", newValue);
  356. result = !(rc < 0);
  357. break;
  358. case AudioOutput_HandFree:
  359. rc = ini.SetValue("Audio", "handfree_out_dev", newValue);
  360. if (rc == SI_INSERTED) rc = ini.SetValue("Audio", "handfree_out_dev", newValue);
  361. result = !(rc < 0);
  362. break;
  363. case AudioInput_PickUp:
  364. rc = ini.SetValue("Audio", "pickup_in_dev", newValue);
  365. if (rc == SI_INSERTED) rc = ini.SetValue("Audio", "pickup_in_dev", newValue);
  366. result = !(rc < 0);
  367. break;
  368. case AudioOutput_PickUp:
  369. rc = ini.SetValue("Audio", "pickup_out_dev", newValue);
  370. if (rc == SI_INSERTED) rc = ini.SetValue("Audio", "pickup_out_dev", newValue);
  371. result = !(rc < 0);
  372. break;
  373. case VideoDevice_Env:
  374. rc = ini.SetValue("Video", "EnvCamera", newValue);
  375. if (rc == SI_INSERTED) rc = ini.SetValue("Video", "EnvCamera", newValue);
  376. result = !(rc < 0);
  377. break;
  378. case VideoDevice_Opt:
  379. rc = ini.SetValue("Video", "OptCamera", newValue);
  380. if (rc == SI_INSERTED) rc = ini.SetValue("Video", "OptCamera", newValue);
  381. result = !(rc < 0);
  382. break;
  383. case VideoDevice_Ews:
  384. rc = ini.SetValue("Video", "EwsCamera", newValue);
  385. if (rc == SI_INSERTED) rc = ini.SetValue("Video", "EwsCamera", newValue);
  386. result = !(rc < 0);
  387. break;
  388. case MediaALL:
  389. break;
  390. default:
  391. break;
  392. }
  393. if (result && (rc = ini.SaveFile(str, false)) < 0) {
  394. if (result) {
  395. qDebug() << "SaveFile failed: " << rc;
  396. result = false;
  397. }
  398. }
  399. if (result) {
  400. QVariant newValue = getCurrentActiveDev(mode);
  401. if (newValue != value) {
  402. qDebug() << "newValue: " << newValue << " vs " << value;
  403. result = false;
  404. }
  405. }
  406. return result;
  407. }
  408. bool MainForm::setCurrentActiveDev(DevMode mode, QVariant value)
  409. {
  410. QString configPath = getRootIniPath();
  411. QSettings settings(configPath, QSettings::IniFormat);
  412. settings.setIniCodec("UTF-8");
  413. //QVariant persistentValue(value);
  414. QString persistentValue = QString::fromLocal8Bit(value.toByteArray());
  415. QTextCodec* codec = QTextCodec::codecForName("UTF8");
  416. persistentValue = codec->fromUnicode(value.toString());
  417. qDebug() << "fromUnicode: " << persistentValue;
  418. bool result = false;
  419. switch (mode) {
  420. case AudioInput_HandFree:
  421. settings.beginGroup("Audio");
  422. settings.setValue("handfree_in_dev", persistentValue);
  423. settings.endGroup();
  424. result = true;
  425. break;
  426. case AudioOutput_HandFree:
  427. settings.beginGroup("Audio");
  428. settings.setValue("handfree_out_dev", persistentValue);
  429. settings.endGroup();
  430. result = true;
  431. break;
  432. case AudioInput_PickUp:
  433. settings.beginGroup("Audio");
  434. settings.setValue("pickup_in_dev", persistentValue);
  435. settings.endGroup();
  436. result = true;
  437. break;
  438. case AudioOutput_PickUp:
  439. settings.beginGroup("Audio");
  440. settings.setValue("pickup_out_dev", persistentValue);
  441. settings.endGroup();
  442. result = true;
  443. break;
  444. case VideoDevice_Env:
  445. settings.beginGroup("Video");
  446. settings.setValue("EnvCamera", persistentValue);
  447. settings.endGroup();
  448. result = true;
  449. break;
  450. case VideoDevice_Opt:
  451. settings.beginGroup("Video");
  452. settings.setValue("OptCamera", persistentValue);
  453. settings.endGroup();
  454. result = true;
  455. break;
  456. case VideoDevice_Ews:
  457. settings.beginGroup("Video");
  458. settings.setValue("EwsCamera", persistentValue);
  459. settings.endGroup();
  460. result = true;
  461. break;
  462. case MediaALL:
  463. break;
  464. default:
  465. break;
  466. }
  467. if (result) {
  468. QVariant newValue = getCurrentActiveDev(mode);
  469. if (newValue != value) {
  470. qDebug() << "newValue: " << newValue << " vs " << value;
  471. result = false;
  472. }
  473. }
  474. return result;
  475. }
  476. QString MainForm::getRootIniPath()
  477. {
  478. if (rootFilePath.isEmpty()) {
  479. QString appDir = QCoreApplication::applicationDirPath();
  480. QDir dir(appDir); //bin
  481. dir.cdUp(); //1.2.3.4
  482. dir.cdUp(); //version
  483. dir.cdUp(); //Run
  484. dir.cd("hardwarecfg");
  485. QString rootIniPath = dir.absolutePath() + "/root.ini";
  486. //QFileInfoList rootInis = dir.entryInfoList(QStringList() << "root.ini", QDir::Files);
  487. qDebug() << "root path at media page: " << rootIniPath;
  488. rootFilePath = rootIniPath;
  489. }
  490. return rootFilePath;
  491. }