main.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <iostream>
  4. #include <vector>
  5. #include <alsa/asoundlib.h>
  6. #include <sys/time.h>
  7. #include <sys/socket.h>
  8. #include <sys/un.h>
  9. #include "hiredis/hiredis.h"
  10. #include "cJSON.h"
  11. //#include "Rk_wake_lock.h"
  12. #define SAMPLE_RATE 48000
  13. #define CHANNEL 2
  14. #define REC_DEVICE_NAME "fake_record"
  15. #define WRITE_DEVICE_NAME "fake_play"
  16. #define JACK_DEVICE_NAME "fake_jack"
  17. #define READ_FRAME 960 //(768)
  18. #define PERIOD_SIZE (960) //(SAMPLE_RATE/8)
  19. #define PERIOD_counts (2) //double of delay 200ms
  20. #define BUFFER_SIZE (PERIOD_SIZE * PERIOD_counts)
  21. #define MUTE_TIME_THRESHOD (4)//seconds
  22. #define MUTE_FRAME_THRESHOD (SAMPLE_RATE * MUTE_TIME_THRESHOD / READ_FRAME)//30 seconds
  23. //#define ALSA_READ_FORMAT SND_PCM_FORMAT_S32_LE
  24. #define ALSA_READ_FORMAT SND_PCM_FORMAT_S16_LE
  25. #define ALSA_WRITE_FORMAT SND_PCM_FORMAT_S16_LE
  26. #define paging_channel "volume-event-channel"
  27. #define volume_channel "volume-value-channel"
  28. /*
  29. * Select different alsa pathways based on device type.
  30. * LINE_OUT: LR-Mix(fake_play)->EqDrcProcess(ladspa)->Speaker(real_playback)
  31. * HEAD_SET: fake_jack -> Headset(real_playback)
  32. * BLUETOOTH: device as bluetooth source.
  33. */
  34. #define DEVICE_FLAG_LINE_OUT 0x01
  35. #define DEVICE_FLAG_HEAD_SET 0x02
  36. #define DEVICE_FLAG_BLUETOOTH 0x04
  37. static char g_bt_mac_addr[17];
  38. static int g_bt_is_connect;
  39. static bool g_system_sleep = false;
  40. static bool g_paging_state = false;
  41. static bool sip_mute = true;
  42. static bool sip_paging = false;
  43. static bool DEBUG = false;
  44. static bool reset = true;
  45. struct timeval tv_begin, tv_end;
  46. //gettimeofday(&tv_begin, NULL);
  47. extern int set_sw_params(snd_pcm_t *pcm, snd_pcm_uframes_t buffer_size,
  48. snd_pcm_uframes_t period_size, char **msg);
  49. void alsa_fake_device_record_open(snd_pcm_t** capture_handle,int channels,uint32_t rate)
  50. {
  51. snd_pcm_hw_params_t *hw_params;
  52. snd_pcm_uframes_t periodSize = PERIOD_SIZE;
  53. snd_pcm_uframes_t bufferSize = BUFFER_SIZE;
  54. int dir = 0;
  55. int err;
  56. err = snd_pcm_open(capture_handle, REC_DEVICE_NAME, SND_PCM_STREAM_CAPTURE, 0);
  57. if (err)
  58. {
  59. printf( "Unable to open capture PCM device: \n");
  60. exit(1);
  61. }
  62. printf("snd_pcm_open\n");
  63. //err = snd_pcm_hw_params_alloca(&hw_params);
  64. err = snd_pcm_hw_params_malloc(&hw_params);
  65. if(err)
  66. {
  67. fprintf(stderr, "cannot allocate hardware parameter structure (%s)\n",snd_strerror(err));
  68. exit(1);
  69. }
  70. printf("snd_pcm_hw_params_malloc\n");
  71. err = snd_pcm_hw_params_any(*capture_handle, hw_params);
  72. if(err)
  73. {
  74. fprintf(stderr, "cannot initialize hardware parameter structure (%s)\n",snd_strerror(err));
  75. exit(1);
  76. }
  77. printf("snd_pcm_hw_params_any!\n");
  78. err = snd_pcm_hw_params_set_access(*capture_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED);
  79. // err = snd_pcm_hw_params_set_access(*capture_handle, hw_params, SND_PCM_ACCESS_MMAP_NONINTERLEAVED);
  80. if (err)
  81. {
  82. printf("Error setting interleaved mode\n");
  83. exit(1);
  84. }
  85. printf("snd_pcm_hw_params_set_access!\n");
  86. err = snd_pcm_hw_params_set_format(*capture_handle, hw_params, ALSA_READ_FORMAT);
  87. if (err)
  88. {
  89. printf("Error setting format: %s\n", snd_strerror(err));
  90. exit(1);
  91. }
  92. printf("snd_pcm_hw_params_set_format\n");
  93. err = snd_pcm_hw_params_set_channels(*capture_handle, hw_params, channels);
  94. if (err)
  95. {
  96. printf("channels = %d\n",channels);
  97. printf( "Error setting channels: %s\n", snd_strerror(err));
  98. exit(1);
  99. }
  100. printf("channels = %d\n",channels);
  101. err = snd_pcm_hw_params_set_buffer_size_near(*capture_handle, hw_params, &bufferSize);
  102. if (err)
  103. {
  104. printf("Error setting buffer size (%ld): %s\n", bufferSize, snd_strerror(err));
  105. exit(1);
  106. }
  107. printf("bufferSize = %ld\n",bufferSize);
  108. err = snd_pcm_hw_params_set_period_size_near(*capture_handle, hw_params, &periodSize, 0);
  109. if (err)
  110. {
  111. printf("Error setting period time (%ld): %s\n", periodSize, snd_strerror(err));
  112. exit(1);
  113. }
  114. printf("periodSize = %ld\n",periodSize);
  115. err = snd_pcm_hw_params_set_rate_near(*capture_handle, hw_params, &rate, 0/*&dir*/);
  116. if (err)
  117. {
  118. printf("Error setting sampling rate (%d): %s\n", rate, snd_strerror(err));
  119. //goto error;
  120. exit(1);
  121. }
  122. printf("Rate = %d\n", rate);
  123. /* Write the parameters to the driver */
  124. err = snd_pcm_hw_params(*capture_handle, hw_params);
  125. if (err < 0)
  126. {
  127. printf( "Unable to set HW parameters: %s\n", snd_strerror(err));
  128. //goto error;
  129. exit(1);
  130. }
  131. err = snd_pcm_prepare(*capture_handle);
  132. printf("Open record device done \n");
  133. //set_sw_params(*capture_handle,bufferSize,periodSize,NULL);
  134. if(hw_params)
  135. snd_pcm_hw_params_free(hw_params);
  136. }
  137. void alsa_fake_device_write_open(snd_pcm_t** write_handle, int channels,
  138. uint32_t write_sampleRate, int device_flag)
  139. {
  140. snd_pcm_hw_params_t *write_params;
  141. snd_pcm_uframes_t write_periodSize = PERIOD_SIZE;
  142. snd_pcm_uframes_t write_bufferSize = BUFFER_SIZE;
  143. int write_err;
  144. int write_dir;
  145. int i = 10;
  146. retry:
  147. write_err = snd_pcm_open(write_handle, WRITE_DEVICE_NAME,
  148. SND_PCM_STREAM_PLAYBACK, 0);
  149. // }
  150. if (write_err) {
  151. usleep(100*1000);
  152. i --;
  153. if(i > 0)
  154. goto retry;
  155. printf( "Unable to open playback PCM device: \n");
  156. exit(1);
  157. }
  158. //printf( "interleaved mode\n");
  159. // snd_pcm_hw_params_alloca(&write_params);
  160. snd_pcm_hw_params_malloc(&write_params);
  161. //printf("snd_pcm_hw_params_alloca\n");
  162. snd_pcm_hw_params_any(*write_handle, write_params);
  163. write_err = snd_pcm_hw_params_set_access(*write_handle, write_params, SND_PCM_ACCESS_RW_INTERLEAVED);
  164. //write_err = snd_pcm_hw_params_set_access(*write_handle, write_params, SND_PCM_ACCESS_MMAP_NONINTERLEAVED);
  165. if (write_err)
  166. {
  167. printf("Error setting interleaved mode\n");
  168. exit(1);
  169. }
  170. //printf( "interleaved mode\n");
  171. write_err = snd_pcm_hw_params_set_format(*write_handle, write_params, ALSA_WRITE_FORMAT);
  172. if (write_err)
  173. {
  174. printf("Error setting format: %s\n", snd_strerror(write_err));
  175. exit(1);
  176. }
  177. //printf( "format successed\n");
  178. write_err = snd_pcm_hw_params_set_channels(*write_handle, write_params, channels);
  179. if (write_err)
  180. {
  181. printf( "Error setting channels: %s\n", snd_strerror(write_err));
  182. exit(1);
  183. }
  184. //printf("channels = %d\n",channels);
  185. write_err = snd_pcm_hw_params_set_rate_near(*write_handle, write_params, &write_sampleRate, 0/*&write_dir*/);
  186. if (write_err)
  187. {
  188. printf("Error setting sampling rate (%d): %s\n", write_sampleRate, snd_strerror(write_err));
  189. exit(1);
  190. }
  191. //printf("setting sampling rate (%d)\n", write_sampleRate);
  192. write_err = snd_pcm_hw_params_set_buffer_size_near(*write_handle, write_params, &write_bufferSize);
  193. if (write_err)
  194. {
  195. printf("Error setting buffer size (%ld): %s\n", write_bufferSize, snd_strerror(write_err));
  196. exit(1);
  197. }
  198. //printf("write_bufferSize = %ld\n",write_bufferSize);
  199. write_err = snd_pcm_hw_params_set_period_size_near(*write_handle, write_params, &write_periodSize, 0);
  200. if (write_err)
  201. {
  202. printf("Error setting period time (%ld): %s\n", write_periodSize, snd_strerror(write_err));
  203. exit(1);
  204. }
  205. //printf("write_periodSize = %ld\n",write_periodSize);
  206. #if 0
  207. snd_pcm_uframes_t write_final_buffer;
  208. write_err = snd_pcm_hw_params_get_buffer_size(write_params, &write_final_buffer);
  209. printf(" final buffer size %ld \n" , write_final_buffer);
  210. snd_pcm_uframes_t write_final_period;
  211. write_err = snd_pcm_hw_params_get_period_size(write_params, &write_final_period, &write_dir);
  212. printf(" final period size %ld \n" , write_final_period);
  213. #endif
  214. /* Write the parameters to the driver */
  215. write_err = snd_pcm_hw_params(*write_handle, write_params);
  216. if (write_err < 0)
  217. {
  218. printf( "Unable to set HW parameters: %s\n", snd_strerror(write_err));
  219. exit(1);
  220. }
  221. write_err = snd_pcm_prepare(*write_handle);
  222. if(DEBUG) printf("open write device is successful\n");
  223. set_sw_params(*write_handle, write_bufferSize, write_periodSize, NULL);
  224. if(write_params)
  225. snd_pcm_hw_params_free(write_params);
  226. }
  227. int set_sw_params(snd_pcm_t *pcm, snd_pcm_uframes_t buffer_size,
  228. snd_pcm_uframes_t period_size, char **msg) {
  229. snd_pcm_sw_params_t *params;
  230. char buf[256];
  231. int err;
  232. //snd_pcm_sw_params_alloca(&params);
  233. snd_pcm_sw_params_malloc(&params);
  234. if ((err = snd_pcm_sw_params_current(pcm, params)) != 0) {
  235. snprintf(buf, sizeof(buf), "Get current params: %s", snd_strerror(err));
  236. //goto fail;
  237. exit(1);
  238. }
  239. /* start the transfer when the buffer is full (or almost full) */
  240. snd_pcm_uframes_t threshold = (buffer_size / period_size) * period_size;
  241. if ((err = snd_pcm_sw_params_set_start_threshold(pcm, params, threshold)) != 0) {
  242. snprintf(buf, sizeof(buf), "Set start threshold: %s: %lu", snd_strerror(err), threshold);
  243. exit(1);
  244. }
  245. /* allow the transfer when at least period_size samples can be processed */
  246. if ((err = snd_pcm_sw_params_set_avail_min(pcm, params, period_size)) != 0) {
  247. snprintf(buf, sizeof(buf), "Set avail min: %s: %lu", snd_strerror(err), period_size);
  248. exit(1);
  249. }
  250. if ((err = snd_pcm_sw_params(pcm, params)) != 0) {
  251. snprintf(buf, sizeof(buf), "%s", snd_strerror(err));
  252. exit(1);
  253. }
  254. if(params)
  255. snd_pcm_sw_params_free(params);
  256. return 0;
  257. }
  258. // int is_mute_frame(short *in,unsigned int size)
  259. // {
  260. // int i;
  261. // int mute_count = 0;
  262. // if (!size) {
  263. // printf("frame size is zero!!!\n");
  264. // return 0;
  265. // }
  266. // for (i = 0; i < size;i ++) {
  267. // if(in[i] != 0)
  268. // return 0;
  269. // }
  270. // return 1;
  271. // }
  272. /* Determine whether to enter the energy saving mode according to
  273. * the value of the environment variable "EQ_LOW_POWERMODE"
  274. */
  275. // bool low_power_mode_check()
  276. // {
  277. // char *value = NULL;
  278. // /* env: "EQ_LOW_POWERMODE=TRUE" or "EQ_LOW_POWERMODE=true" ? */
  279. // value = getenv("EQ_LOW_POWERMODE");
  280. // if (value && (!strcmp("TRUE", value) || !strcmp("true", value)))
  281. // return true;
  282. // return false;
  283. // }
  284. /* Check device changing. */
  285. // int get_device_flag()
  286. // {
  287. // int fd = 0, ret = 0;
  288. // char buff[512] = {0};
  289. // int device_flag = DEVICE_FLAG_LINE_OUT;
  290. // const char *path = "/sys/devices/platform/ff560000.acodec/rk3308-acodec-dev/dac_output";
  291. // FILE *pp = NULL; /* pipeline */
  292. // char *bt_mac_addr = NULL;
  293. // if (g_bt_is_connect)
  294. // return DEVICE_FLAG_BLUETOOTH;
  295. // fd = open(path, O_RDONLY);
  296. // if (fd < 0) {
  297. // printf("Open %s failed!\n", path);
  298. // return device_flag;
  299. // }
  300. // ret = read(fd, buff, sizeof(buff));
  301. // if (ret <= 0) {
  302. // printf("Read %s failed!\n", path);
  303. // close(fd);
  304. // return device_flag;
  305. // }
  306. // if (strstr(buff, "hp out"))
  307. // device_flag = DEVICE_FLAG_HEAD_SET;
  308. // close(fd);
  309. // return device_flag;
  310. // }
  311. /* Get device name frome device_flag */
  312. // const char *get_device_name(int device_flag)
  313. // {
  314. // const char *device_name = NULL;
  315. // switch (device_flag) {
  316. // case DEVICE_FLAG_BLUETOOTH:
  317. // device_name = "BLUETOOTH";
  318. // break;
  319. // case DEVICE_FLAG_HEAD_SET:
  320. // device_name = JACK_DEVICE_NAME;
  321. // break;
  322. // case DEVICE_FLAG_LINE_OUT:
  323. // device_name = WRITE_DEVICE_NAME;
  324. // break;
  325. // default:
  326. // break;
  327. // }
  328. // return device_name;
  329. // }
  330. // void *a2dp_status_listen(void *arg)
  331. // {
  332. // int ret = 0;
  333. // char buff[100] = {0};
  334. // struct sockaddr_un clientAddr;
  335. // struct sockaddr_un serverAddr;
  336. // int sockfd;
  337. // socklen_t addr_len;
  338. // char *start = NULL;
  339. // snd_pcm_t* audio_bt_handle;
  340. // char bluealsa_device[256] = {0};
  341. // int retry_cnt = 5;
  342. // sockfd = socket(AF_UNIX, SOCK_DGRAM, 0);
  343. // if (sockfd < 0) {
  344. // printf("Create socket failed!\n");
  345. // return NULL;
  346. // }
  347. // serverAddr.sun_family = AF_UNIX;
  348. // strcpy(serverAddr.sun_path, "/tmp/a2dp_master_status");
  349. // system("rm -rf /tmp/a2dp_master_status");
  350. // ret = bind(sockfd, (struct sockaddr *)&serverAddr, sizeof(serverAddr));
  351. // if (ret < 0) {
  352. // printf("Bind Local addr failed!\n");
  353. // return NULL;
  354. // }
  355. // while(1) {
  356. // memset(buff, 0, sizeof(buff));
  357. // ret = recvfrom(sockfd, buff, sizeof(buff), 0, (struct sockaddr *)&clientAddr, &addr_len);
  358. // if (ret <= 0)
  359. // break;
  360. // printf("###### FUCN:%s. Received a malformed message(%s)\n", __func__, buff);
  361. // if (strstr(buff, "status:connect")) {
  362. // start = strstr(buff, "address:");
  363. // if (start == NULL) {
  364. // printf("FUCN:%s. Received a malformed message(%s)\n", __func__, buff);
  365. // continue;
  366. // }
  367. // start += strlen("address:");
  368. // if (!g_bt_is_connect) {
  369. // sleep(2);
  370. // memcpy(g_bt_mac_addr, start, sizeof(g_bt_mac_addr));
  371. // sprintf(bluealsa_device, "%s%s", "bluealsa:HCI=hci0,PROFILE=a2dp,DEV=",
  372. // g_bt_mac_addr);
  373. // retry_cnt = 5;
  374. // while (retry_cnt--) {
  375. // ret = snd_pcm_open(&audio_bt_handle, bluealsa_device,
  376. // SND_PCM_STREAM_PLAYBACK, 0);
  377. // if (ret == 0) {
  378. // snd_pcm_close(audio_bt_handle);
  379. // g_bt_is_connect = 1;
  380. // }
  381. // usleep(600000); //600ms * 5 = 3s.
  382. // }
  383. // }
  384. // } else if (strstr(buff, "status:disconnect")) {
  385. // g_bt_is_connect = 0;
  386. // } else if (strstr(buff, "status:suspend")) {
  387. // g_system_sleep = true;
  388. // } else if (strstr(buff, "status:resume")) {
  389. // g_system_sleep = false;
  390. // } else {
  391. // printf("FUCN:%s. Received a malformed message(%s)\n", __func__, buff);
  392. // }
  393. // }
  394. // close(sockfd);
  395. // return NULL;
  396. // }
  397. //Paging状态监控
  398. void ProcessReply( redisReply * pReply )
  399. {
  400. cJSON *pJson;
  401. redisReply * pSubReply = NULL;
  402. if ( pReply != NULL && pReply->elements == 3 )
  403. {
  404. pSubReply = pReply->element[2];
  405. // if(DEBUG)
  406. // printf( "Msg [%s]\n", pSubReply->str );
  407. if(DEBUG) printf( "Msg [%s]\n", pSubReply->str );
  408. pJson = cJSON_Parse(pSubReply->str);
  409. if ( pJson ) {
  410. if(strcmp(cJSON_GetObjectItem(pJson, "name")->valuestring, "SIP") == 0 &&
  411. strcmp(cJSON_GetObjectItem(pJson, "action")->valuestring, "on") == 0)
  412. {
  413. //通话
  414. //usleep(100*1000);
  415. sip_paging = true;
  416. if(reset)
  417. g_paging_state = true;
  418. }
  419. else if(strcmp(cJSON_GetObjectItem(pJson, "name")->valuestring, "SIP") == 0 &&
  420. strcmp(cJSON_GetObjectItem(pJson, "action")->valuestring, "off") == 0)
  421. {
  422. //通话
  423. //usleep(100*1000);
  424. sip_paging = false;
  425. g_paging_state = false;
  426. }
  427. }
  428. }
  429. }
  430. void *paging_status_listen(void *arg)
  431. {
  432. redisContext * pContext = redisConnect( "127.0.0.1", 6379 );
  433. if ( NULL == pContext || pContext->err == 1 )
  434. {
  435. printf( "%s\n", pContext->errstr );
  436. exit( -1 );
  437. }
  438. void* replyPtr = redisCommand( pContext, "SUBSCRIBE %s", paging_channel );
  439. redisReply* pReply = static_cast<redisReply*>(replyPtr);
  440. freeReplyObject( pReply );
  441. while ( redisGetReply( pContext, (void **)&pReply ) == REDIS_OK )
  442. {
  443. ProcessReply( pReply );
  444. freeReplyObject( pReply );
  445. }
  446. redisFree( pContext );
  447. return NULL;
  448. }
  449. //解析音量设置数据
  450. void ProcessVolumeReply( redisReply * pReply )
  451. {
  452. cJSON *pJson;
  453. redisReply * pSubReply = NULL;
  454. if ( pReply != NULL && pReply->elements == 3 )
  455. {
  456. pSubReply = pReply->element[2];
  457. if(DEBUG) printf( "Msg [%s]\n", pSubReply->str );
  458. pJson = cJSON_Parse(pSubReply->str);
  459. if ( pJson ) {
  460. if(cJSON_GetArraySize(pJson) > 11 && cJSON_GetObjectItem(pJson, "sip_volume")->valueint != 0 && cJSON_GetObjectItem(pJson, "onvif_volume")->valueint != 0 &&
  461. cJSON_GetObjectItem(pJson, "broadcast_volume")->valueint != -1 && cJSON_GetObjectItem(pJson, "multicast_1_volume")->valueint != 0)
  462. {
  463. reset = true;
  464. return;
  465. }
  466. if(cJSON_GetObjectItem(pJson, "sip_volume"))
  467. {
  468. if(cJSON_GetObjectItem(pJson, "sip_volume")->valueint == 0)
  469. {
  470. sip_mute == true;
  471. g_paging_state = false;
  472. }
  473. else
  474. {
  475. sip_mute == false;
  476. if(sip_paging)
  477. g_paging_state = true;
  478. }
  479. reset = false;
  480. }
  481. cJSON_Delete(pJson);
  482. }else{
  483. printf( "parse failed!\n");
  484. }
  485. }
  486. }
  487. /*
  488. * 订阅音量信息.
  489. */
  490. void *get_volume_info(void * arg)
  491. {
  492. redisContext * pContext = redisConnect( "127.0.0.1", 6379 );
  493. if ( NULL == pContext || pContext->err == 1 )
  494. {
  495. printf( "%s\n", pContext->errstr );
  496. exit( -1 );
  497. }
  498. void* replyPtr = redisCommand( pContext, "SUBSCRIBE %s", volume_channel );
  499. redisReply* pReply = static_cast<redisReply*>(replyPtr);
  500. freeReplyObject( pReply );
  501. while ( redisGetReply( pContext, (void **)&pReply ) == REDIS_OK )
  502. {
  503. ProcessVolumeReply( pReply );
  504. freeReplyObject( pReply );
  505. }
  506. redisFree( pContext );
  507. return NULL;
  508. }
  509. int main(int argc, char *argv[])
  510. {
  511. snd_pcm_t *capture_handle;
  512. snd_pcm_t *write_handle;
  513. int err;
  514. short buffer[READ_FRAME * 2];
  515. unsigned int sampleRate;
  516. unsigned int channels;
  517. //int mute_frame_thd;
  518. //int mute_frame;
  519. /* LINE_OUT is the default output device */
  520. int device_flag, new_flag;
  521. pthread_t paging_status_listen_thread;
  522. pthread_t volume_value_listen_thread;
  523. //struct rk_wake_lock* wake_lock;
  524. //bool low_power_mode = low_power_mode_check();
  525. char *silence_data = (char *)calloc(READ_FRAME * 2 * 2, 1);//2ch 16bit
  526. int mute_times;
  527. if(argc == 2 && strcmp(argv[1], "debug") == 0)
  528. DEBUG = true;
  529. //wake_lock = RK_wake_lock_new("eq_drc_process");
  530. /* Create a thread to listen for Paging connection status. */
  531. //pthread_create(&paging_status_listen_thread, NULL, paging_status_listen, NULL);
  532. /* Create a thread to listen for Volume connection status. */
  533. //pthread_create(&volume_value_listen_thread, NULL, get_volume_info, NULL);
  534. repeat:
  535. capture_handle = NULL;
  536. write_handle = NULL;
  537. err = 0;
  538. memset(buffer, 0, sizeof(buffer));
  539. sampleRate = SAMPLE_RATE;
  540. channels = CHANNEL;
  541. //mute_frame_thd = (int)MUTE_FRAME_THRESHOD;
  542. //mute_frame = 0;
  543. /* LINE_OUT is the default output device */
  544. device_flag = DEVICE_FLAG_LINE_OUT;
  545. new_flag = DEVICE_FLAG_LINE_OUT;
  546. printf("\n==========EQ/DRC process release version 1.23===============\n");
  547. alsa_fake_device_record_open(&capture_handle, channels, sampleRate);
  548. alsa_fake_device_write_open(&write_handle, channels, sampleRate, device_flag);
  549. //RK_acquire_wake_lock(wake_lock);
  550. while (1) {
  551. err = snd_pcm_readi(capture_handle, buffer , READ_FRAME);
  552. if (err != READ_FRAME)
  553. printf("====read frame error = %d===\n",err);
  554. if (err < 0) {
  555. if (err == -EPIPE)
  556. printf( "Overrun occurred: %d\n", err);
  557. err = snd_pcm_recover(capture_handle, err, 0);
  558. // Still an error, need to exit.
  559. if (err < 0) {
  560. printf( "Error occured while recording: %s\n", snd_strerror(err));
  561. usleep(200 * 1000);
  562. if (capture_handle)
  563. snd_pcm_close(capture_handle);
  564. if (write_handle)
  565. snd_pcm_close(write_handle);
  566. goto repeat;
  567. }
  568. }
  569. // if(g_paging_state) {
  570. // /* Reassign to avoid overflow */
  571. // if (write_handle) {
  572. // system("echo 1 > /sys/class/gpio/gpio5/value");
  573. // snd_pcm_drop(write_handle);
  574. // snd_pcm_close(write_handle);
  575. // //RK_release_wake_lock(wake_lock);
  576. // if(DEBUG) printf("close write handle for you!!!\n ");
  577. // write_handle = NULL;
  578. // }
  579. // continue;
  580. // }
  581. // while (write_handle == NULL) {
  582. // alsa_fake_device_write_open(&write_handle, channels, sampleRate, device_flag);
  583. // if (write_handle == NULL) {
  584. // printf("Route change failed! Using default audio path.\n");
  585. // device_flag = DEVICE_FLAG_LINE_OUT;
  586. // }
  587. // int i, num = PERIOD_counts / 2;
  588. // for (i = 0; i < num; i++) {
  589. // err = snd_pcm_writei(write_handle, silence_data, READ_FRAME);
  590. // if(err != READ_FRAME)
  591. // printf("====write frame error = %d, not %d\n",err, READ_FRAME);
  592. // }
  593. // if(!reset) system("/etc/scripts/pa_mute.sh 0 &");
  594. // }
  595. err = snd_pcm_writei(write_handle, buffer, READ_FRAME);
  596. if (-EPIPE == err) {
  597. snd_pcm_prepare(write_handle);
  598. err = snd_pcm_writei(write_handle, buffer, READ_FRAME);
  599. if (err < 0) {
  600. printf("alsa: write error: %s\n",
  601. snd_strerror((int) err));
  602. }
  603. }
  604. else if (err < 0) {
  605. printf("alsa: write error: %s\n",
  606. snd_strerror((int) err));
  607. }
  608. else if (err != READ_FRAME) {
  609. printf("alsa: write: wrote %d of %d samples\n",
  610. (int) err, READ_FRAME);
  611. }
  612. // if(err != READ_FRAME)
  613. // printf("====write frame error = %d===\n",err);
  614. // if (err < 0) {
  615. // if (err == -EPIPE)
  616. // printf("Underrun occurred from write: %d\n", err);
  617. // err = snd_pcm_recover(write_handle, err, 0);
  618. // if (err < 0) {
  619. // printf( "Error occured while writing: %s\n", snd_strerror(err));
  620. // usleep(200 * 1000);
  621. // if (write_handle) {
  622. // snd_pcm_close(write_handle);
  623. // write_handle = NULL;
  624. // }
  625. // // if (device_flag == DEVICE_FLAG_BLUETOOTH)
  626. // // g_bt_is_connect = 0;
  627. // }
  628. // }
  629. }
  630. error:
  631. if (capture_handle)
  632. snd_pcm_close(capture_handle);
  633. if (write_handle)
  634. snd_pcm_close(write_handle);
  635. // pthread_cancel(paging_status_listen_thread);
  636. // pthread_join(paging_status_listen_thread, NULL);
  637. // pthread_cancel(volume_value_listen_thread);
  638. // pthread_join(volume_value_listen_thread, NULL);
  639. return 0;
  640. }