CarplayLink.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740
  1. #include "CarplayLink.h"
  2. #include "CarplayLinkCbsImpl.h"
  3. #include "CarplayAudioCtx.h"
  4. #include "WebrtcWrapper.h"
  5. #include "carplayVideoWrapper.h"
  6. #include "carplayAudioWrapper.h"
  7. #include "carplayWrapper.h"
  8. #include "BufferQueue.h"
  9. #include <string.h>
  10. #include <sys/time.h>
  11. #include <unistd.h>
  12. #ifdef USE_CARPLAY
  13. #define FRAME_MAX 5
  14. typedef enum
  15. {
  16. MEDIA_NONE = 0,
  17. MEDIA_PLAY,
  18. MEDIA_PAUSE,
  19. MEDIA_PLAY_PAUSE,
  20. MEDIA_NEXT,
  21. MEDIA_PREVIOUS
  22. }MEDIA;
  23. int ICarplayVideoCallbacksImpl::carplayVideoStartCB()
  24. {
  25. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  26. if(mHandle){
  27. mHandle->video_start(0, 0, mHandle->getLinkConfig().screen_width, mHandle->getLinkConfig().screen_height);
  28. //mHandle->onSdkConnectStatus(CONNECT_STATUS_CONNECT_SUCCEED, mHandle->getPhoneType());
  29. }
  30. return 0;
  31. }
  32. void ICarplayVideoCallbacksImpl::carplayVideoStopCB()
  33. {
  34. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  35. // mInterfaceFrame = 0;
  36. if(mHandle)
  37. mHandle->video_stop();
  38. }
  39. int ICarplayVideoCallbacksImpl::carplayVideoDataProcCB(const char *buf, int len)
  40. {
  41. //printf("%s:%s:%d len:%d\r\n",__FILE__,__func__,__LINE__, len);
  42. if(mHandle->mInterfaceFrame == FRAME_MAX){
  43. mHandle->onSdkConnectStatus(CONNECT_STATUS_CONNECT_SUCCEED, mHandle->getPhoneType());
  44. }
  45. ++mHandle->mInterfaceFrame;
  46. if(mHandle)
  47. mHandle->video_play(buf, len);
  48. return 0;
  49. }
  50. void ICarplayAudioCallbacksImpl::carplayAudioStartCB(int handle, AudioStreamType type, int rate, int bits, int channels)
  51. {
  52. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  53. if (type == AudioStreamRec)
  54. return;
  55. printf("type:%d, rate:%d, bits:%d, channels:%d\n",type,rate, bits, channels);
  56. if (type == AudioStreamRECOGNITION || type == AudioStreamCall) {
  57. mHandle->mAudioStreamType = type;
  58. if(mHandle){
  59. AudioInfo info = {rate, channels,bits };
  60. mHandle->record_start(info);
  61. if(type == AudioStreamRECOGNITION){
  62. mHandle->app_status(APP_RECOGNITION_STARTED);
  63. }
  64. else if(type == AudioStreamCall){
  65. #ifdef AEC_DELAY
  66. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  67. mHandle->mAecHandle = WebRtcAecInit();
  68. SetWebRtcAecParam(mHandle->mAecHandle ,rate, rate, NULL);
  69. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  70. mHandle->mDenoiseHandle = GetInstance();
  71. SetFrameParam(mHandle->mDenoiseHandle, rate, 10, 1);
  72. #endif
  73. }
  74. }
  75. //sendAudioMsg(mHandle, true, ChannelAudioIn, type, rate, bits, channels);
  76. }
  77. mHandle->audio_start((AudioType)type,rate, bits, channels);
  78. CarplayAudioCtx* audioHandle = new CarplayAudioCtx(mHandle, handle, type, rate, bits, channels);
  79. //sendAudioMsg(mHandle, true, ChannelAudioOut, type, rate, bits, channels);
  80. Autolock l(&mLock);
  81. mAudioHandlList.push_back(audioHandle);
  82. }
  83. void ICarplayAudioCallbacksImpl::carplayAudioStopCB(int handle, AudioStreamType type)
  84. {
  85. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  86. if (type == AudioStreamRec)
  87. return;
  88. if (type == AudioStreamRECOGNITION || type == AudioStreamCall) {
  89. if(mHandle){
  90. mHandle->record_stop();
  91. }
  92. if(type == AudioStreamRECOGNITION){
  93. mHandle->app_status(APP_RECOGNITION_STOPPED);
  94. }
  95. else if(type == AudioStreamCall){
  96. #ifdef AEC_DELAY
  97. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  98. WebRtcAecRelease(mHandle->mAecHandle);
  99. mHandle->mAecHandle = NULL;
  100. mHandle->mAecQueue->ClearBufferQueue();
  101. ReleaseInstance(mHandle->mDenoiseHandle);
  102. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  103. #endif
  104. }
  105. }
  106. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  107. std::list<CarplayAudioCtx *>::iterator itor;
  108. CarplayAudioCtx *tmpAudioHandle = NULL;
  109. bool isFound = false;
  110. Autolock l(&mLock);
  111. for (itor = mAudioHandlList.begin(); itor != mAudioHandlList.end();) {
  112. tmpAudioHandle = *itor;
  113. if (tmpAudioHandle->getStreamHandle() == handle) {
  114. isFound = true;
  115. mAudioHandlList.erase(itor);
  116. break;
  117. } else {
  118. itor++;
  119. }
  120. }
  121. if (isFound && tmpAudioHandle)
  122. delete tmpAudioHandle;
  123. mHandle->audio_stop((AudioType)type);
  124. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  125. }
  126. #endif
  127. CarplayLink::CarplayLink()
  128. {
  129. #ifdef USE_CARPLAY
  130. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  131. mHandle = new CarplayWrapper();
  132. mVideoCbs = new ICarplayVideoCallbacksImpl(this);
  133. mAudioCbs = new ICarplayAudioCallbacksImpl(this);
  134. mCbs = new CarplayLinkCbsImpl(this);
  135. mDefaultWifi = true;
  136. mDdefaultPhonebtMac = true;
  137. mAecHandle = NULL;
  138. mAecQueue = new BufferQueue();
  139. mAudioStreamType = AudioStreamCall;
  140. mRecPos = 0;
  141. memset(mRecBuf, 0, sizeof(mRecBuf));
  142. mInterfaceFrame = 0;
  143. mHandle->init();
  144. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  145. #endif
  146. }
  147. CarplayLink::~CarplayLink()
  148. {
  149. #ifdef USE_CARPLAY
  150. delete mHandle;
  151. delete mVideoCbs;
  152. delete mAudioCbs;
  153. delete mCbs;
  154. delete mAecQueue;
  155. #endif
  156. }
  157. #ifdef USE_CARPLAY
  158. bool CarplayLink::init(LinkMode linkMode)
  159. {
  160. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  161. printf("phone_bt_mac = %s\r\n",mLinkConfig.phone_bt_mac.c_str());
  162. if(!mLinkConfig.phone_bt_mac.empty()){
  163. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  164. if(mDdefaultPhonebtMac){
  165. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  166. mDdefaultPhonebtMac = true;
  167. mHandle->CarplaySetStringParameter("REMOTE_BTMAC", mLinkConfig.phone_bt_mac);
  168. }
  169. }
  170. printf("car_wifi_ssid = %s\r\n",mLinkConfig.car_wifi_ssid.c_str());
  171. if(!(mLinkConfig.car_wifi_ssid.empty()| mLinkConfig.car_wifi_passphrase.empty() | mLinkConfig.car_wifi_channel.empty())){
  172. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  173. if(mDefaultWifi){
  174. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  175. mDefaultWifi = true;
  176. mHandle->CarplaySetStringParameter("WIFI_SSID", mLinkConfig.car_wifi_ssid);
  177. mHandle->CarplaySetStringParameter("WIFI_PASSWD",mLinkConfig.car_wifi_passphrase);
  178. mHandle->CarplaySetIntParameter("WIFI_CHANNEL",stoi(mLinkConfig.car_wifi_channel));
  179. }
  180. }
  181. mLinkMode = linkMode;
  182. mHandle->CarplaySetIntParameter("NEED_AUTH", 1);
  183. mHandle->CarplaySetStringParameter("NAME", "CarPlay System");
  184. mHandle->CarplaySetStringParameter("MODEID", "Linux");
  185. mHandle->CarplaySetStringParameter("MANFACTURER", "ark");
  186. mHandle->CarplaySetStringParameter("SERIALNUMBER", "223000ac3987cf");
  187. mHandle->CarplaySetStringParameter("SW_VER", "sw1.1.0");
  188. mHandle->CarplaySetStringParameter("HW_VER", "hw1.1.0");
  189. printf("vehicle name = %s\r\n",mCarplayConfig.vehicle_name.c_str());
  190. if(!mCarplayConfig.vehicle_name.empty())
  191. mHandle->CarplaySetStringParameter("VEHICLE_NAME", mCarplayConfig.vehicle_name);
  192. mHandle->CarplaySetIntParameter("OEM_ICON_VISIBLE", 1);
  193. if(!mCarplayConfig.vehicle_icon_label.empty())
  194. mHandle->CarplaySetStringParameter("OEM_ICON_LABEL", mCarplayConfig.vehicle_icon_label);
  195. if(!mCarplayConfig.vehicle_icon_path.empty())
  196. mHandle->CarplaySetStringParameter("OEM_ICON_PATH", mCarplayConfig.vehicle_icon_path);
  197. mHandle->CarplaySetStringParameter("OSINFO", "linux4.14");
  198. mHandle->CarplaySetStringParameter("IOSVER_MIN", "11D257");
  199. mHandle->CarplaySetStringParameter("GUUID", "a527cd2d-7a0f-4165-674b-579f625a160d");
  200. mHandle->CarplaySetStringParameter("DEVID", "00:11:22:33:44:55");
  201. mHandle->CarplaySetStringParameter("BTMAC", "00:11:22:33:44:55");
  202. // mHandle->CarplaySetIntParameter("RIGHTHAND_DRIVER", 0);
  203. mHandle->CarplaySetIntParameter("NIGHTMODE", 0);
  204. mHandle->CarplaySetIntParameter("HAVE_TELBUTTON", 1);
  205. mHandle->CarplaySetIntParameter("HAVE_MEDIABUTTON", 1);
  206. mHandle->CarplaySetIntParameter("HAVE_KNOB", 1);
  207. mHandle->CarplaySetIntParameter("HAVE_PROXSENSOR", 0);
  208. mHandle->CarplaySetIntParameter("HAVE_ENHANCED_REQCARUI", 0);
  209. mHandle->CarplaySetIntParameter("HAVE_ETCSUPPORTED", 0);
  210. mHandle->CarplaySetIntParameter("HIFI_TOUCH", 1);
  211. mHandle->CarplaySetIntParameter("LOFI_TOUCH", 0);
  212. mHandle->CarplaySetIntParameter("USB_COUNRY_CODE", 33);
  213. mHandle->CarplaySetIntParameter("PRODUCT_CODE", 0xa4a1);
  214. mHandle->CarplaySetIntParameter("VERNDOR_CODE", 0x0525);
  215. mHandle->CarplaySetIntParameter("I2C_NUM", 0);
  216. mHandle->CarplaySetIntParameter("I2C_ADDR", 0x22);
  217. mHandle->CarplaySetIntParameter("VIDEO_WIDTH", mLinkConfig.screen_width);
  218. mHandle->CarplaySetIntParameter("VIDEO_HEIGHT", mLinkConfig.screen_height);
  219. mHandle->CarplaySetIntParameter("SCREEN_WIDTH_MM", mCarplayConfig.screen_physical_width);
  220. mHandle->CarplaySetIntParameter("SCREEN_HEIGHT_MM", mCarplayConfig.screen_physical_height);
  221. mHandle->CarplaySetIntParameter("FPS", 30);
  222. mHandle->CarplaySetIntParameter("SCREEN_WIDTH", mLinkConfig.screen_width);
  223. mHandle->CarplaySetIntParameter("SCREEN_HEIGHT", mLinkConfig.screen_height);
  224. mHandle->CarplaySetIntParameter("USB_INDEX",mLinkConfig.usb_index);
  225. if(mCarplayConfig.aec_delay == 0)
  226. mHandle->CarplaySetIntParameter("SW_AEC",0);
  227. else
  228. {
  229. mHandle->CarplaySetIntParameter("SW_AEC",1);
  230. mHandle->CarplaySetIntParameter("AEC_DELAY",mCarplayConfig.aec_delay);
  231. }
  232. mHandle->CarplaySetIntParameter("AUDIO_HANDLE_BY_PLUGIN",1);
  233. /*
  234. mHandle->CarplaySetStringParameter("WIFI_SSID", "CAR-WiFi_49ac");
  235. mHandle->CarplaySetStringParameter("WIFI_PASSWD","49accb62");
  236. mHandle->CarplaySetIntParameter("WIFI_CHANNEL",11);
  237. */
  238. //mHandle->CarplaySetStringParameter("IAP_PATH", "/dev/iap");
  239. static bool flags = false;
  240. if(!flags){
  241. // mHandle->init();
  242. mHandle->registerCallbacks(mCbs);
  243. mHandle->registerVideoCallbacks(mVideoCbs);
  244. mHandle->registerAudioCallbacks(mAudioCbs);
  245. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  246. flags = true;
  247. }
  248. return true;
  249. }
  250. bool CarplayLink::release()
  251. {
  252. if(mHandle){
  253. mHandle->CarplayStop();
  254. }
  255. return true;
  256. }
  257. bool CarplayLink::start()
  258. {
  259. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  260. if(mHandle){
  261. if(mLinkMode == Wired)
  262. mHandle->CarplaySetIntParameter("LINK_TYPE", 0);//设置成无线carplay模式 CARPLAY_WL CARPLAY
  263. else if(mLinkMode == Wireless){
  264. mHandle->CarplaySetIntParameter("LINK_TYPE", 7);
  265. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  266. }
  267. mHandle->CarplayStart();
  268. onSdkConnectStatus(CONNECT_STATUS_CONNECTING, mPhoneType);
  269. }
  270. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  271. return true;
  272. }
  273. bool CarplayLink::stop()
  274. {
  275. if(mHandle)
  276. {
  277. mHandle->CarplayChangeModes(1, 500, 500, 100, 0, 0, 0, 0, 0, 0, 0);
  278. mHandle->CarplayChangeModes(0, 0, 0, 0, 1, 500, 500, 100, 0, 0, 0);
  279. }
  280. return true;
  281. }
  282. bool CarplayLink::start_mirror()
  283. {
  284. return true;
  285. }
  286. bool CarplayLink::stop_mirror()
  287. {
  288. return true;
  289. }
  290. bool CarplayLink::set_background()
  291. {
  292. if(mHandle){
  293. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  294. mHandle->CarplayChangeModes(1, 500, 500, 100, 0, 0, 0, 0, 0, 0, 0);
  295. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  296. //mHandle->CarplayChangeModes(3, 500, 0, 1000, 0, 0, 0, 0, 0, 0, 0); //goto carback
  297. //mHandle->CarplayChangeModes(4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); //exit carback
  298. }
  299. }
  300. bool CarplayLink::set_foreground()
  301. {
  302. if(mHandle){
  303. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  304. mHandle->CarplayRequestUI("");
  305. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  306. }
  307. }
  308. bool CarplayLink::get_audio_focus()
  309. {
  310. if(mHandle){
  311. //mHandle->CarplayChangeModes();
  312. }
  313. }
  314. bool CarplayLink::release_audio_focus()
  315. {
  316. }
  317. void CarplayLink::set_inserted(bool inserted, PhoneType phoneType)
  318. {
  319. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  320. mPhoneType = phoneType;
  321. }
  322. void CarplayLink::send_screen_size(int width, int height)
  323. {
  324. printf("request width = %d, height = %d\r\n", width, height);
  325. mLinkConfig.screen_width = width;
  326. mLinkConfig.screen_height = height;
  327. }
  328. #define DUMP_PLAY_FILE 0
  329. #if DUMP_PLAY_FILE
  330. static FILE *pfile = NULL;
  331. #endif
  332. #define DUMP_REC_FILE 1
  333. #if DUMP_REC_FILE
  334. static FILE *pRecfile = NULL;
  335. #endif
  336. #define AEC_REC_FILE 1
  337. #if AEC_REC_FILE
  338. static FILE *pAecRecfile = NULL;
  339. #endif
  340. #define TEST_DELAY 0
  341. void CarplayLink::AudioRecordVoiceDenoisePorcess(char *buf, int len)
  342. {
  343. if(!buf || (len <= 0)) {
  344. return;
  345. }
  346. if(mDenoiseHandle) {
  347. int frame_size = 16000 * 10 / 1000.0;
  348. int frame_count = len/(frame_size*sizeof(short));
  349. short *data = (short *)buf;
  350. int i;
  351. for(i=0; i<frame_count; i++) {
  352. #ifdef AEC_DELAY
  353. FrameProcess(mDenoiseHandle, data, sizeof(short) * frame_size);
  354. #endif
  355. data += frame_size;
  356. }
  357. }
  358. }
  359. void CarplayLink::record_audio_callback(unsigned char *data, int len)
  360. {
  361. std::lock_guard<std::mutex> lock(mMutex);
  362. // printf("recrod len = %d\r\n",len);
  363. #if TEST_DELAY //delay test
  364. struct timeval tv;
  365. gettimeofday(&tv,NULL);
  366. long prev = tv.tv_sec * 1000 + tv.tv_usec / 1000;
  367. #endif
  368. #if DUMP_REC_FILE
  369. if (NULL == pRecfile) {
  370. pRecfile = fopen("/tmp/rec_in.pcm", "w");
  371. }
  372. if (pRecfile) {
  373. fwrite(data, 1, len, pRecfile);
  374. //printf("rec len:%d\r\n ", len);
  375. }
  376. #endif
  377. #ifdef AEC_DELAY
  378. if(mAudioStreamType == AudioStreamCall && mAecHandle){
  379. len = mRecPos + len;
  380. int times = len / PLAYLOAD;
  381. int remain = len % PLAYLOAD;
  382. mRecPos = 0;
  383. static int prev = 0;
  384. while(times){
  385. memcpy(mRecBuf + prev, data + mRecPos, PLAYLOAD - prev);
  386. mRecPos = mRecPos + PLAYLOAD - prev;
  387. prev = 0;
  388. --times;
  389. int AecLen = 0;
  390. unsigned char * pAecBuf = NULL;
  391. int type = 0 ;
  392. if(mAecQueue->IsExitedThread(pthread_self())){
  393. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  394. return;
  395. }
  396. char out[PLAYLOAD] = {0,};
  397. if(mAecQueue->ReadQueue(&type, &pAecBuf, &AecLen) > 0){
  398. // printf("Aec len = %d\r\n", AecLen);
  399. short *farFrame = (short *)pAecBuf;
  400. short *nearFrame = (short *)mRecBuf;
  401. short *outFrame = (short *)out;
  402. int frameCount = (PLAYLOAD/2)/AECLEN;
  403. static FILE *pOldFarfile = NULL;
  404. if (NULL == pOldFarfile) {
  405. pOldFarfile = fopen("/tmp/rec_old_far.pcm", "w");
  406. }
  407. if (pOldFarfile) {
  408. fwrite(farFrame, 1, PLAYLOAD, pOldFarfile);
  409. }
  410. static FILE *pNearRecfile = NULL;
  411. if (NULL == pNearRecfile) {
  412. pNearRecfile = fopen("/tmp/rec_old_near.pcm", "w");
  413. }
  414. if (pNearRecfile) {
  415. fwrite(mRecBuf, 1, PLAYLOAD, pNearRecfile);
  416. //printf("rec len:%d\r\n ", len);
  417. }
  418. for(int i=0; i<frameCount; i++)
  419. {
  420. WebRtcAecFrameProcess(mAecHandle, (short*)farFrame, (short*)nearFrame, (short*)out, mCarplayConfig.aec_delay);
  421. farFrame += AECLEN;
  422. nearFrame += AECLEN;
  423. outFrame += AECLEN;
  424. }
  425. }
  426. AudioRecordVoiceDenoisePorcess(out, PLAYLOAD);
  427. #if AEC_REC_FILE
  428. if (NULL == pAecRecfile) {
  429. pAecRecfile = fopen("/tmp/rec_aec.pcm", "w");
  430. }
  431. if (pAecRecfile) {
  432. fwrite(out, 1, PLAYLOAD, pAecRecfile);
  433. //printf("rec len:%d\r\n ", len);
  434. }
  435. #endif
  436. if(mHandle)
  437. mHandle->AudioRecordStream(mRecHandle, out, PLAYLOAD, PLAYLOAD/mRecFrames, 0);
  438. free(pAecBuf);
  439. pAecBuf = NULL;
  440. usleep(10000);
  441. }
  442. memcpy(mRecBuf, data + mRecPos, remain);
  443. mRecPos = remain;
  444. prev = remain;
  445. }
  446. else
  447. #endif
  448. mHandle->AudioRecordStream(mRecHandle, data, len, len/mRecFrames, 0);
  449. //printf("%s:%s:%d record len = %d\r\n",__FILE__,__func__,__LINE__,len);
  450. #if TEST_DELAY
  451. struct timeval tv_now;
  452. gettimeofday(&tv_now,NULL);
  453. long now = tv_now.tv_sec * 1000 + tv_now.tv_usec / 1000;
  454. printf("echo cancel time:%ldms\n", now - prev);
  455. #endif
  456. }
  457. void CarplayLink::send_car_bluetooth(const string& name, const string& address, const string& pin)
  458. {
  459. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  460. }
  461. void CarplayLink::send_phone_bluetooth(const string& address)
  462. {
  463. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  464. printf("address = %s\r\n",address.c_str());
  465. if(mHandle){
  466. mDdefaultPhonebtMac = false;
  467. mHandle->CarplaySetStringParameter("REMOTE_BTMAC", address);
  468. }
  469. }
  470. void CarplayLink::send_touch(int x, int y, TouchCode touchCode)
  471. {
  472. // printf("carplay x:%d, y:%d, press:%d\r\n",x, y, touchCode);
  473. if(mHandle){
  474. mHandle->CarplaySendSingleTouchPoint(x, y, touchCode);
  475. }
  476. }
  477. void CarplayLink::send_car_wifi(WifiInfo& info){
  478. if(mHandle){
  479. mDefaultWifi = false;
  480. mHandle->CarplaySetStringParameter("WIFI_SSID", info.ssid);
  481. mHandle->CarplaySetStringParameter("WIFI_PASSWD",info.passphrase);
  482. mHandle->CarplaySetIntParameter("WIFI_CHANNEL",stoi(info.channel_id));
  483. }
  484. }
  485. bool CarplayLink::send_key(KeyCode keyCode)
  486. {
  487. printf("%s:%s:%d key = %d\r\n",__FILE__,__func__,__LINE__, keyCode);
  488. if(mHandle){
  489. if(keyCode == KEY_MUSIC_PLAY){
  490. mHandle->CarplaySendMediaKey(MEDIA_PLAY, true);
  491. mHandle->CarplaySendMediaKey(MEDIA_PLAY, false);
  492. }
  493. else if(keyCode == KEY_MUSIC_PAUSE){
  494. mHandle->CarplaySendMediaKey(MEDIA_PAUSE, true);
  495. mHandle->CarplaySendMediaKey(MEDIA_PLAY, false);
  496. }
  497. else if(keyCode == KEY_MUSIC_PLAY_PAUSE){
  498. mHandle->CarplaySendMediaKey(MEDIA_PLAY_PAUSE, true);
  499. mHandle->CarplaySendMediaKey(MEDIA_PLAY_PAUSE, false);
  500. }
  501. else if(keyCode == KEY_MUSIC_NEXT){
  502. mHandle->CarplaySendMediaKey(MEDIA_NEXT, true);
  503. mHandle->CarplaySendMediaKey(MEDIA_NEXT, true);
  504. mHandle->CarplaySendMediaKey(MEDIA_NEXT, false);
  505. }
  506. else if(keyCode == KEY_MUSIC_PREVIOUS){
  507. mHandle->CarplaySendMediaKey(MEDIA_PREVIOUS, true);
  508. mHandle->CarplaySendMediaKey(MEDIA_PREVIOUS, true);
  509. mHandle->CarplaySendMediaKey(MEDIA_PREVIOUS, false);
  510. }
  511. else if(keyCode == KEY_PICKUP_PHONE){
  512. mHandle->CarplaySendTelephoneKey(1, true);
  513. mHandle->CarplaySendTelephoneKey(0, false);
  514. }
  515. else if(keyCode == KEY_HANGUP_PHONE){
  516. mHandle->CarplaySendTelephoneKey(3, true);
  517. mHandle->CarplaySendTelephoneKey(0, false);
  518. }
  519. else if(keyCode == KEY_HOME){
  520. mHandle->CarplayRequestUI("");
  521. }
  522. else if(keyCode == KEY_PHONE){
  523. mHandle->CarplayRequestUI("mobilephone:");
  524. }
  525. else if(keyCode == KEY_VOICE_ASSISTANT){
  526. mHandle->CarplaysendSiriButton(true);
  527. sleep(1);
  528. mHandle->CarplaysendSiriButton(false);
  529. }
  530. else if(keyCode == KEY_LIGHTMODE){
  531. mHandle->CarplaySendNightMode(0);
  532. }
  533. else if(keyCode == KEY_NIGHTMODE){
  534. mHandle->CarplaySendNightMode(1);
  535. }
  536. else if(keyCode == KEY_CAR_FOREGROUND){
  537. set_foreground();
  538. }
  539. else if(keyCode == KEY_CAR_BACKGROUND){
  540. set_background();
  541. }
  542. else if(keyCode == KEY_CAR_BACK){
  543. mHandle->CarplaySendKnob(0, 0, 1, 0, 0, 0);
  544. mHandle->CarplaySendKnob(0, 0, 0, 0, 0, 0);
  545. }
  546. }
  547. return true;
  548. }
  549. bool CarplayLink::send_wheel(WheelCode wheel, bool foucs)
  550. {
  551. if(mHandle){
  552. mHandle->CarplaySendKnob(foucs, 0, 0, 0, 0, wheel);
  553. }
  554. return true;
  555. }
  556. bool CarplayLink::send_night_mode(bool night)
  557. {
  558. if(mHandle){
  559. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  560. mHandle->CarplaySetIntParameter("NIGHTMODE", night);
  561. }
  562. return true;
  563. }
  564. bool CarplayLink::send_right_hand_driver(bool right){
  565. if(mHandle){
  566. printf("%s:%s:%d\r\n",__FILE__,__func__,__LINE__);
  567. mHandle->CarplaySetIntParameter("RIGHTHAND_DRIVER", right);
  568. }
  569. }
  570. bool CarplayLink::open_page(AppPage appPage)
  571. {
  572. if(mHandle == NULL)
  573. return false;
  574. if(appPage == APP_PAGE_NAVIGATION){
  575. mHandle->CarplayRequestUI("maps:");
  576. }
  577. else if(appPage == APP_PAGE_MAIN){
  578. mHandle->CarplayRequestUI("");
  579. }
  580. return true;
  581. }
  582. void CarplayLink::request_status(RequestAppStatus requestAppStatus, void *reserved)
  583. {
  584. if(requestAppStatus == QUERYTIME){
  585. static long long time = mLocalTime;
  586. app_status(APP_RESERVED, (void*)time);
  587. printf("static local time = %lld\r\n",time);
  588. }
  589. }
  590. bool CarplayLink::sendPlayData(int handle, char type, const char* buf, int len, int frames, long long time_stamp)
  591. {
  592. // printf("play hanle :%x type = %d, len = %d, time_stamp = %d\r\n",handle, type, len, time_stamp);
  593. #if TEST_DELAY //delay test
  594. struct timeval tv;
  595. gettimeofday(&tv,NULL);
  596. long prev = tv.tv_sec * 1000 + tv.tv_usec / 1000;
  597. #endif
  598. if(mHandle){
  599. mHandle->AudioPlayStream(handle, (void*)buf, len, frames, time_stamp);
  600. audio_play((AudioType)type, buf, len);
  601. #ifdef AEC_DELAY
  602. if(mAecQueue && mAecHandle && type == AudioStreamCall){
  603. uint8_t *p = (uint8_t*)malloc(len);
  604. memcpy(p, buf, len);
  605. mAecQueue->WriteQueue(0, p, len);
  606. // printf("insert p = %d\r\n", len);
  607. }
  608. #endif
  609. usleep(10);
  610. #if DUMP_PLAY_FILE
  611. if (NULL == pfile) {
  612. pfile = fopen("/tmp/play_out.pcm", "w");
  613. }
  614. if (pfile) {
  615. fwrite(buf, 1, len, pfile);
  616. printf("play len:%d\r\n ", len);
  617. }
  618. #endif
  619. }
  620. #if TEST_DELAY
  621. struct timeval tv_now;
  622. gettimeofday(&tv_now,NULL);
  623. long now = tv_now.tv_sec * 1000 + tv_now.tv_usec / 1000;
  624. printf("play time:%ldms\n", now - prev);
  625. #endif
  626. return true;
  627. }
  628. bool CarplayLink::receiveRecordData(int handle, int frames)
  629. {
  630. mRecHandle = handle;
  631. mRecFrames = frames;
  632. usleep(100000);
  633. return true;
  634. }
  635. void CarplayLink::setLocalTime(long long local)
  636. {
  637. mLocalTime = local;
  638. printf("mLocalTime time = %lld\r\n",mLocalTime);
  639. }
  640. #endif