libaudioqueue.cpp 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. // libaudioqueue.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. #include "stdafx.h"
  4. #include "libaudioqueue.h"
  5. #include "libsharememory.h"
  6. #include <windows.h>
  7. typedef struct Qnode
  8. {
  9. unsigned int videoframeindex;
  10. unsigned int nextqnodeindex;
  11. }Qnode, *queueptr;
  12. typedef struct linkqueue
  13. {
  14. unsigned int frontindex;
  15. unsigned int rearindex;
  16. unsigned int queuelens;
  17. }linkqueue;
  18. class libaudioqueue_impl
  19. {
  20. private:
  21. Clibsharememory m_ShareMem;
  22. LPVOID m_lpMem;
  23. linkqueue*m_pQueue;
  24. int m_nQueueAddrLens;
  25. int m_nQnodeAddrLens;
  26. int m_nFrameAddrLens;
  27. int m_nDataAddrlens;
  28. LPCTSTR szShareMemName;
  29. unsigned long aQnodeAddr[MAX_AUDIOQUEUE_LENS];
  30. unsigned long aAudioFrameAddr[MAX_AUDIOQUEUE_LENS];
  31. unsigned long aAudioDataAddr[MAX_AUDIOQUEUE_LENS];
  32. public:
  33. libaudioqueue_impl(LPCTSTR audioqueuename,int framesize=MAX_AUDIOQNODE_SIZE)
  34. {
  35. m_lpMem = NULL;
  36. m_pQueue = NULL;
  37. szShareMemName = NULL;
  38. m_nQueueAddrLens = 0;
  39. m_nQnodeAddrLens = 0;
  40. m_nFrameAddrLens = 0;
  41. m_nDataAddrlens = 0;
  42. for(int i=0;i<MAX_AUDIOQUEUE_LENS;i++)
  43. {
  44. aQnodeAddr[i] = 0;
  45. aAudioFrameAddr[i] = 0;
  46. aAudioDataAddr[i] = 0;
  47. }
  48. InitQueue(audioqueuename,framesize);
  49. }
  50. ~libaudioqueue_impl()
  51. {
  52. ClearAudioQueue();
  53. }
  54. //初始化队列
  55. BOOL InitQueue(LPCTSTR szName,int framesize=MAX_AUDIOQNODE_SIZE)
  56. {
  57. m_nQueueAddrLens = sizeof(linkqueue);
  58. m_nQnodeAddrLens = MAX_AUDIOQUEUE_LENS*sizeof(Qnode);
  59. m_nFrameAddrLens = MAX_AUDIOQUEUE_LENS*sizeof(audio_frame);
  60. m_nDataAddrlens = MAX_AUDIOQUEUE_LENS*framesize;
  61. int nMemTotalNum = m_nQueueAddrLens+m_nQnodeAddrLens+m_nFrameAddrLens+m_nDataAddrlens;
  62. if (m_ShareMem.Create(szName,nMemTotalNum)&&(m_nDataAddrlens!=0))
  63. {
  64. m_lpMem = m_ShareMem.Lock(1000);
  65. if(m_lpMem != NULL)
  66. {
  67. memset(m_lpMem,0,nMemTotalNum);
  68. m_pQueue = (linkqueue *)m_lpMem;
  69. for(int i =0;i<MAX_AUDIOQUEUE_LENS;i++)
  70. {
  71. aQnodeAddr[i] = (unsigned long)m_pQueue+m_nQueueAddrLens+sizeof(Qnode)*i;
  72. aAudioFrameAddr[i] = (unsigned long)m_pQueue+m_nQueueAddrLens+m_nQnodeAddrLens+sizeof(audio_frame)*i;
  73. aAudioDataAddr[i] = (unsigned long)m_pQueue+m_nQueueAddrLens+m_nQnodeAddrLens+m_nFrameAddrLens+framesize*i;
  74. }
  75. m_pQueue->frontindex = m_pQueue->rearindex = 0;
  76. m_pQueue->queuelens = 0;
  77. m_ShareMem.Unlock();
  78. }
  79. }
  80. else if(m_ShareMem.Open(szName))
  81. {
  82. m_lpMem = m_ShareMem.Lock(1000);
  83. if(m_lpMem != NULL)
  84. {
  85. m_pQueue = (linkqueue *)m_lpMem;
  86. for(int i =0;i<MAX_AUDIOQUEUE_LENS;i++)
  87. {
  88. aQnodeAddr[i] = (unsigned long)m_pQueue+m_nQueueAddrLens+sizeof(Qnode)*i;
  89. aAudioFrameAddr[i] = (unsigned long)m_pQueue+m_nQueueAddrLens+m_nQnodeAddrLens+sizeof(audio_frame)*i;
  90. aAudioDataAddr[i] = (unsigned long)m_pQueue+m_nQueueAddrLens+m_nQnodeAddrLens+m_nFrameAddrLens+framesize*i;
  91. }
  92. m_ShareMem.Unlock();
  93. }
  94. }
  95. return TRUE;
  96. }
  97. //返回队列的元素个数,音频队列长度
  98. int GetAudioLens()
  99. {
  100. if(m_ShareMem.IsValid())
  101. {
  102. m_lpMem = m_ShareMem.Lock(1000);
  103. if(m_lpMem != NULL)
  104. {
  105. int num = m_pQueue->queuelens;
  106. m_ShareMem.Unlock();
  107. return num;
  108. }
  109. else
  110. {
  111. return 0;
  112. }
  113. }
  114. else
  115. {
  116. return 0;
  117. }
  118. }
  119. //往音频循环队列尾部插节点
  120. BOOL InsertAudio(audio_frame* Audio)
  121. {
  122. if(m_ShareMem.IsValid())
  123. {
  124. m_lpMem = m_ShareMem.Lock(1000);
  125. if(m_lpMem != NULL)
  126. {
  127. unsigned int nRearNextIndex = 0;
  128. //保存当前对位指针的序列号
  129. queueptr rearptrfront = (queueptr)aQnodeAddr[m_pQueue->rearindex];
  130. //如果队列已满
  131. if(m_pQueue->queuelens == MAX_AUDIOQUEUE_LENS)
  132. {
  133. m_pQueue->rearindex = (m_pQueue->rearindex+1)%MAX_AUDIOQUEUE_LENS;
  134. m_pQueue->frontindex = (m_pQueue->frontindex+1)%MAX_AUDIOQUEUE_LENS;
  135. m_pQueue->queuelens = MAX_AUDIOQUEUE_LENS;
  136. }
  137. else if (m_pQueue->queuelens == 0)
  138. {
  139. m_pQueue->rearindex = 0;
  140. m_pQueue->frontindex = 0;
  141. m_pQueue->queuelens++;
  142. }
  143. else
  144. {
  145. m_pQueue->rearindex = (m_pQueue->rearindex+1)%MAX_AUDIOQUEUE_LENS;
  146. m_pQueue->frontindex = m_pQueue->frontindex;
  147. m_pQueue->queuelens++;
  148. }
  149. if (Audio!=NULL)
  150. {
  151. queueptr rearqnodetmp = (queueptr)aQnodeAddr[m_pQueue->rearindex];
  152. rearqnodetmp->videoframeindex = m_pQueue->rearindex;
  153. rearqnodetmp->nextqnodeindex = 0;
  154. audio_frame*audiotmp = (audio_frame*)aAudioFrameAddr[m_pQueue->rearindex];
  155. audiotmp->data = (char*)aAudioDataAddr[m_pQueue->rearindex ];
  156. audiotmp->bitspersample = Audio->bitspersample;
  157. audiotmp->format = Audio->format;
  158. audiotmp->framesize = Audio->framesize;
  159. audiotmp->nchannels = Audio->nchannels;
  160. audiotmp->samplespersec = Audio->samplespersec;
  161. audiotmp->iseriesnumber = Audio->iseriesnumber;
  162. memcpy(audiotmp->data,Audio->data,Audio->framesize);
  163. rearptrfront->nextqnodeindex = m_pQueue->rearindex;
  164. //delete Audio->data;
  165. //delete Audio;
  166. }
  167. m_ShareMem.Unlock();
  168. return TRUE;
  169. }
  170. else
  171. {
  172. return FALSE;
  173. }
  174. }
  175. else
  176. {
  177. return FALSE;
  178. }
  179. }
  180. //读音频队列头部节点
  181. BOOL GetAudio(audio_frame* Audio)
  182. {
  183. if(m_ShareMem.IsValid())
  184. {
  185. m_lpMem = m_ShareMem.Lock(1000);
  186. if(m_lpMem != NULL)
  187. {
  188. if (m_pQueue->queuelens == 0)
  189. {
  190. m_ShareMem.Unlock();
  191. return FALSE;
  192. }
  193. else
  194. {
  195. audio_frame*audiotemp = (audio_frame*)aAudioFrameAddr[m_pQueue->frontindex];;
  196. Audio->format = audiotemp->format;
  197. Audio->framesize = audiotemp->framesize;
  198. Audio->bitspersample = audiotemp->bitspersample;
  199. Audio->nchannels = audiotemp->nchannels;
  200. Audio->samplespersec = audiotemp->samplespersec;
  201. Audio->iseriesnumber = audiotemp->iseriesnumber;
  202. memcpy(Audio->data,(char*)aAudioDataAddr[m_pQueue->frontindex],audiotemp->framesize);
  203. m_ShareMem.Unlock();
  204. return TRUE;
  205. }
  206. }
  207. else
  208. {
  209. return FALSE;
  210. }
  211. }
  212. else
  213. {
  214. return FALSE;
  215. }
  216. }
  217. //读视频队列头部节点,并删除头部节点
  218. BOOL GetAudioAndDel(audio_frame* Audio)
  219. {
  220. if(m_ShareMem.IsValid())
  221. {
  222. m_lpMem = m_ShareMem.Lock(1000);
  223. if(m_lpMem != NULL)
  224. {
  225. if (m_pQueue->queuelens == 0)
  226. {
  227. m_ShareMem.Unlock();
  228. return FALSE;
  229. }
  230. else
  231. {
  232. audio_frame*audiotemp = (audio_frame*)aAudioFrameAddr[m_pQueue->frontindex];
  233. Audio->format = audiotemp->format;
  234. Audio->framesize = audiotemp->framesize;
  235. Audio->bitspersample = audiotemp->bitspersample;
  236. Audio->nchannels = audiotemp->nchannels;
  237. Audio->samplespersec = audiotemp->samplespersec;
  238. Audio->iseriesnumber = audiotemp->iseriesnumber;
  239. memcpy(Audio->data,(char*)aAudioDataAddr[m_pQueue->frontindex],audiotemp->framesize);
  240. char*data = (char*)aAudioDataAddr[m_pQueue->frontindex];
  241. memset(data,0,audiotemp->framesize);
  242. memset(audiotemp,0,sizeof(audio_frame));
  243. queueptr qnodetmp = (queueptr)aQnodeAddr[m_pQueue->frontindex];
  244. m_pQueue->frontindex = qnodetmp->nextqnodeindex;
  245. qnodetmp = (queueptr)aQnodeAddr[m_pQueue->rearindex];
  246. qnodetmp->nextqnodeindex = 0;
  247. m_pQueue->queuelens--;
  248. m_ShareMem.Unlock();
  249. return TRUE;
  250. }
  251. }
  252. else
  253. {
  254. return FALSE;
  255. }
  256. }
  257. else
  258. {
  259. return FALSE;
  260. }
  261. }
  262. //清除队列
  263. BOOL ClearAudioQueue()
  264. {
  265. if(m_ShareMem.IsValid())
  266. {
  267. m_lpMem = m_ShareMem.Lock(1000);
  268. if(m_lpMem != NULL)
  269. {
  270. if (m_pQueue->queuelens != 0)
  271. {
  272. while(m_pQueue->queuelens != 0)
  273. {
  274. audio_frame*audiotemp = (audio_frame*)aAudioFrameAddr[m_pQueue->frontindex];
  275. char*data = (char*)aAudioDataAddr[m_pQueue->frontindex];
  276. memset(data,0,audiotemp->framesize);
  277. memset(audiotemp,0,sizeof(audio_frame));
  278. queueptr qnodetmp = (queueptr)aQnodeAddr[m_pQueue->frontindex];
  279. m_pQueue->frontindex = qnodetmp->nextqnodeindex;
  280. qnodetmp = (queueptr)aQnodeAddr[m_pQueue->rearindex];
  281. qnodetmp->nextqnodeindex = 0;
  282. m_pQueue->queuelens--;
  283. }
  284. }
  285. m_ShareMem.Unlock();
  286. return TRUE;
  287. }
  288. else
  289. {
  290. return FALSE;
  291. }
  292. }
  293. else
  294. {
  295. return FALSE;
  296. }
  297. }
  298. //删除队头的数据
  299. BOOL DeleteHeadAudio()
  300. {
  301. if(m_ShareMem.IsValid())
  302. {
  303. m_lpMem = m_ShareMem.Lock(1000);
  304. if(m_lpMem != NULL)
  305. {
  306. if (m_pQueue->queuelens != 0)
  307. {
  308. audio_frame*audiotemp = (audio_frame*)aAudioFrameAddr[m_pQueue->frontindex];
  309. char*data = (char*)aAudioDataAddr[m_pQueue->frontindex];
  310. memset(data,0,audiotemp->framesize);
  311. memset(audiotemp,0,sizeof(audio_frame));
  312. queueptr qnodetmp = (queueptr)aQnodeAddr[m_pQueue->frontindex];
  313. m_pQueue->frontindex = qnodetmp->nextqnodeindex;
  314. qnodetmp = (queueptr)aQnodeAddr[m_pQueue->rearindex];
  315. qnodetmp->nextqnodeindex = 0;
  316. m_pQueue->queuelens--;
  317. }
  318. m_ShareMem.Unlock();
  319. return TRUE;
  320. }
  321. else
  322. {
  323. return FALSE;
  324. }
  325. }
  326. else
  327. {
  328. return FALSE;
  329. }
  330. }
  331. //获取图像的大小
  332. int GetFrameSize()
  333. {
  334. if(m_ShareMem.IsValid())
  335. {
  336. m_lpMem = m_ShareMem.Lock(1000);
  337. if(m_lpMem != NULL)
  338. {
  339. int nFrameSize = 0;
  340. if (m_pQueue->queuelens != 0)
  341. {
  342. audio_frame*audiotmp = (audio_frame*)aAudioFrameAddr[m_pQueue->frontindex];
  343. nFrameSize = audiotmp->framesize;
  344. }
  345. m_ShareMem.Unlock();
  346. return nFrameSize;
  347. }
  348. else
  349. {
  350. return 0;
  351. }
  352. }
  353. else
  354. {
  355. return 0;
  356. }
  357. }
  358. };
  359. // 这是已导出类的构造函数。
  360. // 有关类定义的信息,请参阅 libaudioqueue.h
  361. Clibaudioqueue::Clibaudioqueue(LPCTSTR audioqueuename,int framesize)
  362. {
  363. m_pImpl = new libaudioqueue_impl(audioqueuename,framesize);
  364. return;
  365. }
  366. Clibaudioqueue::~Clibaudioqueue()
  367. {
  368. ClearAudioQueue();
  369. delete m_pImpl;
  370. return;
  371. }
  372. BOOL Clibaudioqueue::InsertAudio(audio_frame* Audio)
  373. {
  374. BOOL bRst = m_pImpl->InsertAudio(Audio);
  375. return bRst;
  376. }
  377. BOOL Clibaudioqueue::GetAudio(audio_frame* Audio)
  378. {
  379. BOOL bRst = m_pImpl->GetAudio(Audio);
  380. return bRst;
  381. }
  382. BOOL Clibaudioqueue::GetAudioAndDel(audio_frame* Audio)
  383. {
  384. BOOL bRst = m_pImpl->GetAudioAndDel(Audio);
  385. return bRst;
  386. }
  387. int Clibaudioqueue::GetAudioLens(void)
  388. {
  389. int i = m_pImpl->GetAudioLens();
  390. return i;
  391. }
  392. void Clibaudioqueue::ClearAudioQueue()
  393. {
  394. m_pImpl->ClearAudioQueue();
  395. return;
  396. }
  397. int Clibaudioqueue::GetFrameSize()
  398. {
  399. int i = m_pImpl->GetFrameSize();
  400. return i;
  401. }
  402. void Clibaudioqueue::DeleteHeadAudio()
  403. {
  404. m_pImpl->DeleteHeadAudio();
  405. return;
  406. }