Audio.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. #include "Audio.h"
  2. #include "AutoConnect.h"
  3. #include "AudioServiceProxy.h"
  4. #include "Utility.h"
  5. #include "UserInterfaceUtility.h"
  6. #include <QDBusConnection>
  7. #include <QProcess>
  8. //#include <QGuiApplication>
  9. #include "ArkApplication.h"
  10. #include <QSettings>
  11. #include <QFile>
  12. static const QString audiofilepath("/data/Audio.ini");
  13. static const QString audioStart("/data/AudioStart.ini");
  14. class AudioPrivate
  15. {
  16. public:
  17. explicit AudioPrivate(Audio* parent);
  18. ~AudioPrivate();
  19. void initialize();
  20. void connectAllSlots();
  21. AudioSource m_Multimedia;
  22. AudioSource m_Aux;
  23. AudioSource m_Phone;
  24. Local::DbusServer::Audio* m_AudioServiceProxy;
  25. MuteItem m_MuteItem;
  26. EqualizerItem m_EqualizerItem;
  27. private:
  28. Audio* m_Parent;
  29. };
  30. bool Audio::requestAudioSource(const AudioSource source)
  31. {
  32. qDebug() << "Audio::requestAudioSource" << source ;
  33. initializePrivate();
  34. static bool flag(false);
  35. bool ret = true;
  36. if(flag){
  37. QFile filename(audioStart);
  38. if(filename.exists()){
  39. QSettings *volume_configfile = new QSettings(audioStart,QSettings::IniFormat);
  40. flag = volume_configfile->value("audioStatus").toInt();
  41. delete volume_configfile;
  42. }else{
  43. qDebug()<<audioStart<<" is not exist";
  44. }
  45. }
  46. if (!flag) {
  47. flag = true;
  48. QStringList cmd;
  49. cmd << QString("-t") << AudioApplication;
  50. bool result = QProcess::startDetached(ArkApplication::applicationFilePath(), cmd);
  51. qDebug() << __PRETTY_FUNCTION__ << __LINE__ << "result" << result;
  52. QFile BTcfgFile(audioStart);
  53. QSettings *BTcfgsetFile = new QSettings(audioStart,QSettings::IniFormat);
  54. if(!BTcfgFile.exists())
  55. {
  56. qDebug()<< __PRETTY_FUNCTION__ << __LINE__<<"Wificonfig is not exist, creating...";
  57. system(QString((QString("touch ")+ audioStart)).toLocal8Bit().constData());
  58. system("sync");
  59. }
  60. BTcfgsetFile->setValue("audioStatus", QString::number(flag));
  61. BTcfgsetFile->sync();
  62. system("sync");
  63. delete BTcfgsetFile;
  64. } else {
  65. if ((AS_BluetoothPhone != source)
  66. && (AS_CarplayPhone != source)
  67. && (AS_CarlifePhone != source)
  68. && (AS_AutoPhone != source)) {
  69. if (AS_Idle == m_Private->m_Phone) {
  70. qDebug() << __PRETTY_FUNCTION__ << __LINE__;
  71. if (AS_Idle == m_Private->m_Aux) {
  72. if (source != m_Private->m_Multimedia) {
  73. qDebug() << __PRETTY_FUNCTION__ << __LINE__;
  74. AudioSource multimedia = m_Private->m_Multimedia;
  75. if (AS_Aux == source) {
  76. m_Private->m_Aux = AS_Aux;
  77. } else {
  78. m_Private->m_Aux = AS_Idle;
  79. m_Private->m_Multimedia = source;
  80. }
  81. qDebug() << __PRETTY_FUNCTION__ << __LINE__;
  82. onHolderChange(multimedia, source);
  83. }
  84. QDBusPendingReply<> reply = m_Private->m_AudioServiceProxy->requestAudioSource(source);
  85. reply.waitForFinished();
  86. if (reply.isError()) {
  87. qDebug() << "method call" << __PRETTY_FUNCTION__ << __LINE__ << " failed" << reply.error();
  88. }
  89. } else {
  90. if (AS_Aux != source) {
  91. m_Private->m_Multimedia = source;
  92. ret = false;
  93. }
  94. }
  95. } else {
  96. qDebug() << __PRETTY_FUNCTION__ << __LINE__;
  97. if (AS_Aux == source) {
  98. m_Private->m_Aux = AS_Aux;
  99. } else {
  100. m_Private->m_Multimedia = source;
  101. }
  102. ret = false;
  103. }
  104. } else {
  105. qDebug() << __PRETTY_FUNCTION__ << __LINE__;
  106. if ((AS_BluetoothPhone == source)
  107. && (AS_BluetoothPhone != m_Private->m_Phone)) {
  108. qDebug() << __PRETTY_FUNCTION__ << __LINE__;
  109. m_Private->m_Phone = AS_BluetoothPhone;
  110. onHolderChange(m_Private->m_Multimedia, source);
  111. QDBusPendingReply<> reply = m_Private->m_AudioServiceProxy->requestAudioSource(source);
  112. reply.waitForFinished();
  113. if (reply.isError()) {
  114. qDebug() << "method call" << __PRETTY_FUNCTION__ << __LINE__ << " failed" << reply.error();
  115. }
  116. } else if ((AS_CarplayPhone == source)
  117. && (AS_CarplayPhone != m_Private->m_Phone)) {
  118. m_Private->m_Phone = AS_CarplayPhone;
  119. onHolderChange(m_Private->m_Multimedia, source);
  120. QDBusPendingReply<> reply = m_Private->m_AudioServiceProxy->requestAudioSource(source);
  121. reply.waitForFinished();
  122. if (reply.isError()) {
  123. qDebug() << "method call" << __PRETTY_FUNCTION__ << __LINE__ << " failed" << reply.error();
  124. }
  125. } else if ((AS_CarlifePhone == source)
  126. && (AS_CarlifePhone != m_Private->m_Phone)) {
  127. qDebug() << __PRETTY_FUNCTION__ << __LINE__;
  128. m_Private->m_Phone = AS_CarlifePhone;
  129. onHolderChange(m_Private->m_Multimedia, source);
  130. QDBusPendingReply<> reply = m_Private->m_AudioServiceProxy->requestAudioSource(source);
  131. reply.waitForFinished();
  132. if (reply.isError()) {
  133. qDebug() << "method call" << __PRETTY_FUNCTION__ << __LINE__ << " failed" << reply.error();
  134. }
  135. } else if ((AS_AutoPhone == source)
  136. && (AS_AutoPhone != m_Private->m_Phone)) {
  137. qDebug() << __PRETTY_FUNCTION__ << __LINE__;
  138. m_Private->m_Phone = AS_AutoPhone;
  139. onHolderChange(m_Private->m_Multimedia, source);
  140. QDBusPendingReply<> reply = m_Private->m_AudioServiceProxy->requestAudioSource(source);
  141. reply.waitForFinished();
  142. if (reply.isError()) {
  143. qDebug() << "method call" << __PRETTY_FUNCTION__ << __LINE__ << " failed" << reply.error().message();
  144. }
  145. }
  146. }
  147. }
  148. if (!ret) {
  149. qDebug() << "Audio::requestAudioSource fail" << source << m_Private->m_Phone << m_Private->m_Multimedia;
  150. }
  151. return ret;
  152. }
  153. void Audio::releaseAudioSource(const AudioSource source)
  154. {
  155. qDebug() << "Audio::releaseAudioSource" << source << m_Private->m_Multimedia;
  156. if ((AS_BluetoothPhone == source)
  157. || (AS_CarplayPhone == source)
  158. || (AS_CarlifePhone == source)
  159. || (AS_AutoPhone == source)) {
  160. qDebug() << __PRETTY_FUNCTION__ << __LINE__ ;
  161. if ((AS_BluetoothPhone == m_Private->m_Phone)
  162. || (AS_CarplayPhone == m_Private->m_Phone)
  163. || (AS_CarlifePhone == m_Private->m_Phone)
  164. || (AS_AutoPhone == m_Private->m_Phone)) {
  165. m_Private->m_Phone = AS_Idle;
  166. qDebug() << __PRETTY_FUNCTION__ << __LINE__ ;
  167. if (AS_Aux == m_Private->m_Aux) {
  168. qDebug() << __PRETTY_FUNCTION__ << __LINE__ ;
  169. onHolderChange(source, AS_Aux);
  170. } else {
  171. qDebug() << __PRETTY_FUNCTION__ << __LINE__ ;
  172. if (AS_Idle != m_Private->m_Multimedia) {
  173. qDebug() << __PRETTY_FUNCTION__ << __LINE__ << m_Private->m_Multimedia;
  174. onHolderChange(source, m_Private->m_Multimedia);
  175. }
  176. }
  177. }
  178. } else if (AS_Aux == source) {
  179. qDebug() << __PRETTY_FUNCTION__ << __LINE__ ;
  180. if (AS_Aux == m_Private->m_Aux) {
  181. m_Private->m_Aux = AS_Idle;
  182. qDebug() << __PRETTY_FUNCTION__ << __LINE__ ;
  183. if (AS_Idle != m_Private->m_Multimedia) {
  184. qDebug() << __PRETTY_FUNCTION__ << __LINE__ << m_Private->m_Multimedia;
  185. onHolderChange(source, m_Private->m_Multimedia);
  186. }
  187. }
  188. }
  189. return ;
  190. }
  191. //调用amixer重新释放系统音量
  192. void Audio::releaseVolume()
  193. {
  194. /*system("amixer cset numid=24,iface=MIXER,name='PA Volume' 52");
  195. system("amixer cset numid=13,iface=MIXER,name='PA Input-Gain' 3");*/
  196. }
  197. int Audio::getcurrentvolumevalue()
  198. {
  199. QFile filename(audiofilepath);
  200. int value = 0;
  201. if(filename.exists()){
  202. QSettings *volume_configfile = new QSettings(audiofilepath,QSettings::IniFormat);
  203. value = volume_configfile->value("Volume").toInt();
  204. delete volume_configfile;
  205. }else{
  206. qDebug()<<audiofilepath<<" is not exist";
  207. }
  208. qDebug()<< __PRETTY_FUNCTION__ << __LINE__<<"volume value :"<<value;
  209. return value;
  210. }
  211. void Audio::reset()
  212. {
  213. initializePrivate();
  214. QDBusPendingReply<> reply = m_Private->m_AudioServiceProxy->reqesetReset();
  215. reply.waitForFinished();
  216. if (reply.isError()) {
  217. qDebug() << "method call customEvent failed" << reply.error();
  218. }
  219. }
  220. void Audio::setvolumebalance()
  221. {
  222. pid_t status = system("kmem 0xe4000008 0x7474");//调整音量增益幅度
  223. if (-1 == status)
  224. {
  225. qDebug("system error!");
  226. }
  227. else
  228. {
  229. qDebug("exit status value = [0x%x]\n", status);
  230. if (WIFEXITED(status))
  231. {
  232. if (0 == WEXITSTATUS(status))
  233. {
  234. qDebug("'kmem 0xe4000008 0x7474' run shell script successfully.\n");
  235. }
  236. else
  237. {
  238. qDebug("run shell script fail, script exit code: %d\n", WEXITSTATUS(status));
  239. }
  240. }
  241. else
  242. {
  243. qDebug("exit status = [%d]\n", WEXITSTATUS(status));
  244. }
  245. }
  246. }
  247. void Audio::requestMuteToggole()
  248. {
  249. initializePrivate();
  250. QDBusPendingReply<> reply = m_Private->m_AudioServiceProxy->requestMuteToggole();
  251. reply.waitForFinished();
  252. if (reply.isError()) {
  253. qDebug() << __PRETTY_FUNCTION__ << reply.error();
  254. }
  255. }
  256. void Audio::requestSpeaker(const int item)
  257. {
  258. initializePrivate();
  259. QDBusPendingReply<> reply = m_Private->m_AudioServiceProxy->requestSpeaker(item);
  260. reply.waitForFinished();
  261. if (reply.isError()) {
  262. qDebug() << __PRETTY_FUNCTION__ << reply.error();
  263. }
  264. }
  265. void Audio::requestMute(const int item)
  266. {
  267. initializePrivate();
  268. QDBusPendingReply<> reply = m_Private->m_AudioServiceProxy->requestMute(item);
  269. reply.waitForFinished();
  270. if (reply.isError()) {
  271. qDebug() << __PRETTY_FUNCTION__ << reply.error();
  272. }
  273. }
  274. void Audio::requestIncreaseVolume()
  275. {
  276. initializePrivate();
  277. QDBusPendingReply<> reply = m_Private->m_AudioServiceProxy->requestIncreaseVolume();
  278. reply.waitForFinished();
  279. if (reply.isError()) {
  280. qDebug() << "method call customEvent failed" << reply.error();
  281. }
  282. }
  283. void Audio::requestDecreaseVolume()
  284. {
  285. initializePrivate();
  286. QDBusPendingReply<> reply = m_Private->m_AudioServiceProxy->requestDecreaseVolume();
  287. //reply.waitForFinished();
  288. if (reply.isError()) {
  289. qDebug() << "method call customEvent failed" << reply.error();
  290. }
  291. }
  292. void Audio::requestSetVolume(const int volume)
  293. {
  294. initializePrivate();
  295. QDBusPendingReply<> reply = m_Private->m_AudioServiceProxy->requestSetVolume(volume);
  296. //reply.waitForFinished();
  297. if (reply.isError()) {
  298. qDebug() << "method call customEvent failed" << reply.error();
  299. }
  300. }
  301. void Audio::setEqualizerItem(const int item, const int bass, const int middle, const int treble)
  302. {
  303. initializePrivate();
  304. QDBusPendingReply<> reply = m_Private->m_AudioServiceProxy->setEqualizerItem(item, bass, middle, treble);
  305. reply.waitForFinished();
  306. if (reply.isError()) {
  307. qDebug() << "method call customEvent failed" << reply.error();
  308. }
  309. }
  310. void Audio::EqualizerItemTogglePrevious()
  311. {
  312. initializePrivate();
  313. if (EI_Undefine == m_Private->m_EqualizerItem) {
  314. m_Private->m_EqualizerItem = AudioPersistent::getEqualizerItem(true);
  315. }
  316. EqualizerItem desireItem = EI_Undefine;
  317. switch (m_Private->m_EqualizerItem) {
  318. case EI_Standard: {
  319. desireItem = EI_Custom;
  320. break;
  321. }
  322. case EI_Popular: {
  323. desireItem = EI_Standard;
  324. break;
  325. }
  326. case EI_Classic: {
  327. desireItem = EI_Popular;
  328. break;
  329. }
  330. case EI_Jazz: {
  331. desireItem = EI_Classic;
  332. break;
  333. }
  334. default: {
  335. desireItem = EI_Jazz;
  336. break;
  337. }
  338. }
  339. g_Audio->setEqualizerItem(desireItem, EI_Undefine, EI_Undefine, EI_Undefine);
  340. }
  341. void Audio::EqualizerItemToggleNext()
  342. {
  343. initializePrivate();
  344. if (EI_Undefine == m_Private->m_EqualizerItem) {
  345. m_Private->m_EqualizerItem = AudioPersistent::getEqualizerItem(true);
  346. }
  347. EqualizerItem desireItem = EI_Undefine;
  348. switch (m_Private->m_EqualizerItem) {
  349. case EI_Standard: {
  350. desireItem = EI_Popular;
  351. break;
  352. }
  353. case EI_Popular: {
  354. desireItem = EI_Classic;
  355. break;
  356. }
  357. case EI_Classic: {
  358. desireItem = EI_Jazz;
  359. break;
  360. }
  361. case EI_Jazz: {
  362. desireItem = EI_Custom;
  363. break;
  364. }
  365. default: {
  366. desireItem = EI_Standard;
  367. break;
  368. }
  369. }
  370. g_Audio->setEqualizerItem(desireItem, EI_Undefine, EI_Undefine, EI_Undefine);
  371. }
  372. void Audio::setSoundItem(const int item, const int left, const int right)
  373. {
  374. initializePrivate();
  375. QDBusPendingReply<> reply = m_Private->m_AudioServiceProxy->setSoundItem(item, left, right);
  376. reply.waitForFinished();
  377. if (reply.isError()) {
  378. qDebug() << "method call customEvent failed" << reply.error();
  379. }
  380. }
  381. AudioSource Audio::getPhoneSource()
  382. {
  383. return m_Private->m_Phone;
  384. }
  385. AudioSource Audio::getMultimediaSource()
  386. {
  387. return m_Private->m_Multimedia;
  388. }
  389. AudioSource Audio::getAudioSource()
  390. {
  391. bool ret1 = (AS_BluetoothPhone == m_Private->m_Phone)
  392. || (AS_CarplayPhone == m_Private->m_Phone)
  393. || (AS_CarlifePhone == m_Private->m_Phone)
  394. || (AS_AutoPhone == m_Private->m_Phone);
  395. bool ret2 = (!ret1) && (AS_Aux == m_Private->m_Aux);
  396. // qDebug()<<"++++++++ret1+++++++"<<ret1;
  397. // qDebug()<<"++++++++ret2+++++++"<<ret2;
  398. // qDebug()<<"++++++++m_Private->m_Phone+++++++"<<m_Private->m_Phone;
  399. // qDebug()<<"++++++++m_Private->m_Aux+++++++"<<m_Private->m_Aux;
  400. // qDebug()<<"++++++++m_Private->m_Multimedia+++++++"<<m_Private->m_Multimedia;
  401. AudioSource ret = (ret1? m_Private->m_Phone: (ret2? m_Private->m_Aux: m_Private->m_Multimedia));
  402. // qDebug()<<"++++++++ret+++++++"<<ret;
  403. return ret;
  404. }
  405. MuteItem Audio::getMute()
  406. {
  407. return m_Private->m_MuteItem;
  408. }
  409. void Audio::faderOut()
  410. {
  411. initializePrivate();
  412. QDBusPendingReply<> reply = m_Private->m_AudioServiceProxy->faderOut();
  413. reply.waitForFinished();
  414. if (reply.isError()) {
  415. qDebug() << "method call faderOut failed" << reply.error();
  416. }
  417. }
  418. int Audio::open_amixer_mode(int stream_name, int ctrlname)
  419. {
  420. initializePrivate();
  421. QDBusPendingReply<> reply = m_Private->m_AudioServiceProxy->open_amixer_mode(stream_name,ctrlname);
  422. reply.waitForFinished();
  423. if (reply.isError()) {
  424. qDebug() << "method call customEvent failed" << reply.error();
  425. }
  426. }
  427. void Audio::close_amixer_mode()
  428. {
  429. initializePrivate();
  430. QDBusPendingReply<> reply = m_Private->m_AudioServiceProxy->close_amixer_mode();
  431. reply.waitForFinished();
  432. if (reply.isError()) {
  433. qDebug() << "method call faderOut failed" << reply.error();
  434. }
  435. }
  436. int Audio::get_amixersoftmaster_volume()
  437. {
  438. initializePrivate();
  439. QDBusPendingReply<> reply = m_Private->m_AudioServiceProxy->get_amixersoftmaster_volume();
  440. reply.waitForFinished();
  441. if (reply.isError()) {
  442. qDebug() << "method call faderOut failed" << reply.error();
  443. }
  444. }
  445. void Audio::set_amixersoftmaster_volume(int volume)
  446. {
  447. initializePrivate();
  448. QDBusPendingReply<> reply = m_Private->m_AudioServiceProxy->set_amixersoftmaster_volume(volume);
  449. reply.waitForFinished();
  450. if (reply.isError()) {
  451. qDebug() << "method call customEvent failed" << reply.error();
  452. }
  453. }
  454. void Audio::onServiceUnregistered(const QString &service)
  455. {
  456. // qDebug() << "Audio::onServiceUnregistered" << service;
  457. // if (ArkMicroAudioService == service) {
  458. // g_DbusService->startService(ArkMicroAudioService);
  459. // }
  460. }
  461. void Audio::onMuteChangeHandler(const MuteItem mute)
  462. {
  463. m_Private->m_MuteItem = mute;
  464. onMuteChange(m_Private->m_MuteItem);
  465. }
  466. void Audio::onEqualizerItemChangeHandler(const int item, const int bass, const int middle, const int treble)
  467. {
  468. m_Private->m_EqualizerItem = item;
  469. }
  470. Audio::Audio(QObject *parent)
  471. : QObject(parent)
  472. , m_Private(new AudioPrivate(this))
  473. {
  474. }
  475. Audio::~Audio()
  476. {
  477. }
  478. void Audio::initializePrivate()
  479. {
  480. if (NULL == m_Private) {
  481. m_Private.reset(new AudioPrivate(this));
  482. }
  483. }
  484. AudioPrivate::AudioPrivate(Audio *parent)
  485. : m_Parent(parent)
  486. {
  487. #if defined(ENTER_HOME_FIRST)
  488. m_Multimedia = AS_Idle;
  489. #else
  490. m_Multimedia = AS_Radio;
  491. #endif
  492. //m_Multimedia = AS_Radio;AS_Idle
  493. m_Aux = AS_Idle;
  494. m_Phone = AS_Idle;
  495. m_AudioServiceProxy = NULL;
  496. m_MuteItem = MI_Unmute;
  497. m_EqualizerItem = EI_Undefine;
  498. initialize();
  499. connectAllSlots();
  500. }
  501. AudioPrivate::~AudioPrivate()
  502. {
  503. }
  504. void AudioPrivate::initialize()
  505. {
  506. if (NULL == m_AudioServiceProxy) {
  507. m_AudioServiceProxy = new Local::DbusServer::Audio(ArkMicroAudioService,
  508. ArkMicroAudioPath,
  509. QDBusConnection::sessionBus(),
  510. m_Parent);
  511. }
  512. }
  513. void AudioPrivate::connectAllSlots()
  514. {
  515. if (NULL != m_AudioServiceProxy) {
  516. connectSignalAndSignalByNamesake(m_AudioServiceProxy, m_Parent, ARKSENDER(onVolumeChange(const int)));
  517. connectSignalAndSignalByNamesake(m_AudioServiceProxy, m_Parent, ARKSENDER(onEqualizerItemChange(const int, const int, const int, const int)));
  518. connectSignalAndSignalByNamesake(m_AudioServiceProxy, m_Parent, ARKSENDER(onSoundItemChange(const int, const int, const int)));
  519. QObject::connect(m_AudioServiceProxy, ARKSENDER(onMuteChange(const int)),
  520. m_Parent, ARKRECEIVER(onMuteChangeHandler(const int)));
  521. QObject::connect(m_AudioServiceProxy, ARKSENDER(onEqualizerItemChange(const int, const int, const int, const int)),
  522. m_Parent, ARKRECEIVER(onEqualizerItemChangeHandler(const int, const int, const int, const int)));
  523. }
  524. }