ring_buffer.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include "ring_buffer.h"
  2. #include "error_define.h"
  3. #include "log_helper.h"
  4. namespace am {
  5. template<typename T>
  6. ring_buffer<T>::ring_buffer(unsigned int size)
  7. {
  8. _size = size;
  9. _head = _tail = 0;
  10. _buf = new uint8_t[size];
  11. }
  12. template<typename T>
  13. ring_buffer<T>::~ring_buffer()
  14. {
  15. if (_buf)
  16. delete[] _buf;
  17. }
  18. template<typename T>
  19. void ring_buffer<T>::put(const void * data, int len, const T & type)
  20. {
  21. std::lock_guard<std::mutex> locker(_lock);
  22. if (_head + len <= _size) {
  23. memcpy(_buf + _head, data, len);
  24. _head += len;
  25. }
  26. else if (_head + len > _size) {
  27. int remain = len - (_size - _head);
  28. if (len - remain > 0)
  29. memcpy(_buf + _head, data, len - remain);
  30. if (remain > 0)
  31. memcpy(_buf, (unsigned char*)data + len - remain, remain);
  32. _head = remain;
  33. }
  34. struct ring_frame<T> frame;
  35. frame.len = len;
  36. frame.type = type;
  37. _frames.push(frame);
  38. }
  39. template<typename T>
  40. int ring_buffer<T>::get(void * data, int len, T & type)
  41. {
  42. std::lock_guard<std::mutex> locker(_lock);
  43. int retLen = 0;
  44. if (_frames.size() <= 0) {
  45. retLen = 0;
  46. return retLen;
  47. }
  48. struct ring_frame<T> frame = _frames.front();
  49. _frames.pop();
  50. if (frame.len > len) {
  51. al_error("ringbuff::get need larger buffer");
  52. return 0;
  53. }
  54. type = frame.type
  55. retLen = frame.len;
  56. if (_tail + frame.len <= _size) {
  57. memcpy(data, _buf + _tail, frame.len);
  58. _tail += frame.len;
  59. }
  60. else {
  61. int remain = frame.len - (_size - _tail);
  62. if (frame.len - remain > 0)
  63. memcpy(data, _buf + _tail, frame.len - remain);
  64. if (remain > 0)
  65. memcpy((unsigned char*)data + frame.len - remain, _buf, remain);
  66. _tail = remain;
  67. }
  68. return retLen;
  69. }
  70. }