AudioDataQueue.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. //
  2. // AudioDataQueue.cpp
  3. // SDKTester
  4. //
  5. // Created by lappi on 1/8/16.
  6. // Copyright © 2016 baidu. All rights reserved.
  7. //
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <stdio.h>
  11. #include "AudioDataQueue.hpp"
  12. int AudioDataQueue::queueAudio(const uint8_t* audioData, int dataLength)
  13. {
  14. if(dataLength == 0)
  15. return mDataLength;
  16. if (dataLength > mBufferCapacity) {
  17. audioData += (dataLength-mBufferCapacity);
  18. dataLength = mBufferCapacity;
  19. }
  20. long remainingLen = mDataEnd - mLoopEnd;
  21. long rightLen = remainingLen >= dataLength ? dataLength : remainingLen;
  22. memcpy(mLoopEnd, audioData, rightLen);
  23. mLoopEnd += rightLen;
  24. if (mLoopEnd == mDataEnd) {
  25. mLoopEnd = mData;
  26. }
  27. long leftLen = dataLength > rightLen ? dataLength - rightLen : 0;
  28. if (leftLen > 0) {
  29. memcpy(mLoopEnd, audioData + rightLen, leftLen);
  30. mLoopEnd += leftLen;
  31. }
  32. mDataLength += dataLength;
  33. if (mDataLength >= mBufferCapacity) {
  34. mDataLength = mBufferCapacity;
  35. mLoopStart = mLoopEnd;
  36. }
  37. return mDataLength;
  38. }
  39. int AudioDataQueue::dequeSamples(uint8_t* dataBuffer, int bufferSize, bool dequeRemaining)
  40. {
  41. if (mDataLength >= bufferSize || dequeRemaining) {
  42. long tmp = mDataEnd - mLoopStart;
  43. long dataRightLen = tmp >= mDataLength ? mDataLength : tmp;
  44. long rightLen = dataRightLen >= bufferSize ? bufferSize : dataRightLen;
  45. memcpy(dataBuffer, mLoopStart, rightLen);
  46. mLoopStart += rightLen;
  47. if (mLoopStart == mDataEnd) {
  48. mLoopStart = mData;
  49. }
  50. long leftLen = 0;
  51. long left = bufferSize - rightLen;
  52. if (left > 0) {
  53. long dataLeftLen = mDataLength > dataRightLen ? mDataLength - dataRightLen : 0;
  54. leftLen = dataLeftLen >= left ? left : dataLeftLen;
  55. memcpy(dataBuffer + rightLen, mLoopStart, leftLen);
  56. mLoopStart += leftLen;
  57. }
  58. mDataLength -= bufferSize;
  59. if (mDataLength <= 0) {
  60. mDataLength = 0;
  61. mLoopStart = mLoopEnd = mData;
  62. }
  63. return (int)(rightLen + leftLen);
  64. }
  65. return 0;
  66. }
  67. bool AudioDataQueue::haveData()
  68. {
  69. return (mDataLength > 0);
  70. }
  71. void AudioDataQueue::reset()
  72. {
  73. mDataLength = 0;
  74. mDataEnd = mData + mBufferCapacity;
  75. mLoopStart = mLoopEnd = mData;
  76. }
  77. AudioDataQueue::AudioDataQueue(int bufferCapacity)
  78. {
  79. mDataLength = 0;
  80. mBufferCapacity = bufferCapacity;
  81. mData = (uint8_t*)malloc(mBufferCapacity);
  82. mDataEnd = mData + mBufferCapacity;
  83. mLoopStart = mLoopEnd = mData;
  84. }
  85. AudioDataQueue::~AudioDataQueue()
  86. {
  87. if(mData)
  88. {
  89. free(mData);
  90. mData = NULL;
  91. mDataEnd = NULL;
  92. mLoopStart = NULL;
  93. mLoopEnd = NULL;
  94. }
  95. mDataLength = 0;
  96. mBufferCapacity = 0;
  97. }