libaudiotransqueue.cpp 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. // libaudiotransqueue.cpp : Defines the exported functions for the DLL application.
  2. //
  3. //#include "stdafx.h"
  4. #include "SpBase.h"
  5. #include "libaudiotransqueue.h"
  6. #include "libsharememory.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 libaudiotransqueue_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_AUDIOTRANSQUEUE_LENS];
  30. unsigned long aAudioFrameAddr[MAX_AUDIOTRANSQUEUE_LENS];
  31. unsigned long aAudioDataAddr[MAX_AUDIOTRANSQUEUE_LENS];
  32. public:
  33. libaudiotransqueue_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_AUDIOTRANSQUEUE_LENS;i++)
  43. {
  44. aQnodeAddr[i] = 0;
  45. aAudioFrameAddr[i] = 0;
  46. aAudioDataAddr[i] = 0;
  47. }
  48. InitQueue(audioqueuename,framesize);
  49. }
  50. ~libaudiotransqueue_impl()
  51. {
  52. ClearQueue();
  53. }
  54. //初始化队列
  55. BOOL InitQueue(LPCTSTR szName,int framesize=MAX_AUDIOQNODE_SIZE)
  56. {
  57. m_nQueueAddrLens = sizeof(linkqueue);
  58. m_nQnodeAddrLens = MAX_AUDIOTRANSQUEUE_LENS*sizeof(Qnode);
  59. m_nFrameAddrLens = MAX_AUDIOTRANSQUEUE_LENS*sizeof(audio_frame);
  60. m_nDataAddrlens = MAX_AUDIOTRANSQUEUE_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_AUDIOTRANSQUEUE_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_AUDIOTRANSQUEUE_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 GetQueueLens()
  99. {
  100. int iRet = 0;
  101. if(m_ShareMem.IsValid())
  102. {
  103. m_lpMem = m_ShareMem.Lock(1000);
  104. if(m_lpMem != NULL)
  105. {
  106. int num = m_pQueue->queuelens;
  107. m_ShareMem.Unlock();
  108. iRet = num;
  109. }
  110. }
  111. return iRet;
  112. }
  113. //往音频循环队列尾部插节点
  114. bool EnAudioQueue(audio_frame* pItem)
  115. {
  116. bool bRet = false;
  117. if(m_ShareMem.IsValid())
  118. {
  119. m_lpMem = m_ShareMem.Lock(1000);
  120. if(m_lpMem != NULL)
  121. {
  122. unsigned int nRearNextIndex = 0;
  123. //保存当前对位指针的序列号
  124. queueptr rearptrfront = (queueptr)aQnodeAddr[m_pQueue->rearindex];
  125. //如果队列已满
  126. if(m_pQueue->queuelens == MAX_AUDIOTRANSQUEUE_LENS)
  127. {
  128. m_pQueue->rearindex = (m_pQueue->rearindex+1)%MAX_AUDIOTRANSQUEUE_LENS;
  129. m_pQueue->frontindex = (m_pQueue->frontindex+1)%MAX_AUDIOTRANSQUEUE_LENS;
  130. m_pQueue->queuelens = MAX_AUDIOTRANSQUEUE_LENS;
  131. }
  132. else if (m_pQueue->queuelens == 0)
  133. {
  134. m_pQueue->rearindex = 0;
  135. m_pQueue->frontindex = 0;
  136. m_pQueue->queuelens++;
  137. }
  138. else
  139. {
  140. m_pQueue->rearindex = (m_pQueue->rearindex+1)%MAX_AUDIOTRANSQUEUE_LENS;
  141. m_pQueue->frontindex = m_pQueue->frontindex;
  142. m_pQueue->queuelens++;
  143. }
  144. if (NULL != pItem)
  145. {
  146. queueptr rearqnodetmp = (queueptr)aQnodeAddr[m_pQueue->rearindex];
  147. rearqnodetmp->videoframeindex = m_pQueue->rearindex;
  148. rearqnodetmp->nextqnodeindex = 0;
  149. audio_frame*audiotmp = (audio_frame*)aAudioFrameAddr[m_pQueue->rearindex];
  150. audiotmp->data = (char*)aAudioDataAddr[m_pQueue->rearindex ];
  151. audiotmp->bitspersample = pItem->bitspersample;
  152. audiotmp->format = pItem->format;
  153. audiotmp->framesize = pItem->framesize;
  154. audiotmp->nchannels = pItem->nchannels;
  155. audiotmp->samplespersec = pItem->samplespersec;
  156. audiotmp->iseriesnumber = pItem->iseriesnumber;
  157. memcpy(audiotmp->data,pItem->data,pItem->framesize);
  158. rearptrfront->nextqnodeindex = m_pQueue->rearindex;
  159. }
  160. m_ShareMem.Unlock();
  161. bRet = true;
  162. }
  163. }
  164. return bRet;
  165. }
  166. //读音频队列头部节点
  167. bool TryDequeue(audio_frame* pItem)
  168. {
  169. bool bRet = false;
  170. if(m_ShareMem.IsValid())
  171. {
  172. m_lpMem = m_ShareMem.Lock(1000);
  173. if(m_lpMem != NULL)
  174. {
  175. if (m_pQueue->queuelens == 0)
  176. {
  177. m_ShareMem.Unlock();
  178. bRet = false;
  179. }
  180. else
  181. {
  182. audio_frame*audiotemp = (audio_frame*)aAudioFrameAddr[m_pQueue->frontindex];;
  183. pItem->format = audiotemp->format;
  184. pItem->framesize = audiotemp->framesize;
  185. pItem->bitspersample = audiotemp->bitspersample;
  186. pItem->nchannels = audiotemp->nchannels;
  187. pItem->samplespersec = audiotemp->samplespersec;
  188. pItem->iseriesnumber = audiotemp->iseriesnumber;
  189. memcpy(pItem->data,(char*)aAudioDataAddr[m_pQueue->frontindex],audiotemp->framesize);
  190. m_ShareMem.Unlock();
  191. bRet = true;
  192. }
  193. }
  194. }
  195. return bRet;
  196. }
  197. //清除队列
  198. bool ClearQueue()
  199. {
  200. bool bRet = false;
  201. if(m_ShareMem.IsValid())
  202. {
  203. m_lpMem = m_ShareMem.Lock(1000);
  204. if(m_lpMem != NULL)
  205. {
  206. if (m_pQueue->queuelens != 0)
  207. {
  208. while(m_pQueue->queuelens != 0)
  209. {
  210. audio_frame*audiotemp = (audio_frame*)aAudioFrameAddr[m_pQueue->frontindex];
  211. char*data = (char*)aAudioDataAddr[m_pQueue->frontindex];
  212. memset(data,0,audiotemp->framesize);
  213. memset(audiotemp,0,sizeof(audio_frame));
  214. queueptr qnodetmp = (queueptr)aQnodeAddr[m_pQueue->frontindex];
  215. m_pQueue->frontindex = qnodetmp->nextqnodeindex;
  216. qnodetmp = (queueptr)aQnodeAddr[m_pQueue->rearindex];
  217. qnodetmp->nextqnodeindex = 0;
  218. m_pQueue->queuelens--;
  219. }
  220. }
  221. m_ShareMem.Unlock();
  222. bRet = true;
  223. }
  224. }
  225. return bRet;
  226. }
  227. //删除队头的数据
  228. bool DeleteQueueHead()
  229. {
  230. bool bRet = false;
  231. if(m_ShareMem.IsValid())
  232. {
  233. m_lpMem = m_ShareMem.Lock(1000);
  234. if(m_lpMem != NULL)
  235. {
  236. if (m_pQueue->queuelens != 0)
  237. {
  238. audio_frame*audiotemp = (audio_frame*)aAudioFrameAddr[m_pQueue->frontindex];
  239. char*data = (char*)aAudioDataAddr[m_pQueue->frontindex];
  240. memset(data,0,audiotemp->framesize);
  241. memset(audiotemp,0,sizeof(audio_frame));
  242. queueptr qnodetmp = (queueptr)aQnodeAddr[m_pQueue->frontindex];
  243. m_pQueue->frontindex = qnodetmp->nextqnodeindex;
  244. qnodetmp = (queueptr)aQnodeAddr[m_pQueue->rearindex];
  245. qnodetmp->nextqnodeindex = 0;
  246. m_pQueue->queuelens--;
  247. }
  248. m_ShareMem.Unlock();
  249. bRet = true;
  250. }
  251. }
  252. return bRet;
  253. }
  254. };
  255. Clibaudiotransqueue::Clibaudiotransqueue(LPCTSTR audioqueuename,int framesize)
  256. {
  257. m_pImpl = new libaudiotransqueue_impl(audioqueuename,framesize);
  258. return;
  259. }
  260. Clibaudiotransqueue::~Clibaudiotransqueue()
  261. {
  262. ClearQueue();
  263. delete m_pImpl;
  264. return;
  265. }
  266. bool Clibaudiotransqueue::Enqueue(audio_frame* pItem)
  267. {
  268. bool bRet = m_pImpl->EnAudioQueue(pItem);
  269. return bRet;
  270. }
  271. bool Clibaudiotransqueue::TryDequeue(audio_frame* pItem)
  272. {
  273. bool bRet = m_pImpl->TryDequeue(pItem);
  274. return bRet;
  275. }
  276. bool Clibaudiotransqueue::DeleteQueueHead()
  277. {
  278. bool bRet = m_pImpl->DeleteQueueHead();
  279. return bRet;
  280. }
  281. bool Clibaudiotransqueue::IsEmpty()
  282. {
  283. bool bRet = m_pImpl->GetQueueLens() == 0 ? true : false;
  284. return bRet;
  285. }
  286. int Clibaudiotransqueue::Count()
  287. {
  288. int iRet = m_pImpl->GetQueueLens();
  289. return iRet;
  290. }
  291. bool Clibaudiotransqueue::ClearQueue()
  292. {
  293. bool bRet = m_pImpl->ClearQueue();
  294. return bRet;
  295. }