sndbuffer.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include <stdlib.h>
  2. #include "sndbuffer.h"
  3. #include "sndrender.h"
  4. #include <memory.h>
  5. SNDBUFFER::SNDBUFFER(unsigned aSize) {
  6. read_position = 0;
  7. samples_ready = 0;
  8. // size must be power of 2 for faster calc cyclic position: pos = (pos+1) & (size-1)
  9. if (aSize & (aSize-1)) {
  10. unsigned i = 1;
  11. while (i < aSize) i *= 2;
  12. aSize = i;
  13. }
  14. SNDBUFFER::size = aSize;
  15. buffer = (SNDSAMPLE*)malloc(aSize * sizeof(SNDSAMPLE));
  16. reset();
  17. }
  18. SNDBUFFER::~SNDBUFFER()
  19. {
  20. free(buffer);
  21. }
  22. void SNDBUFFER::reset()
  23. {
  24. read_position = 0;
  25. memset(buffer, 0, size * sizeof(SNDSAMPLE));
  26. }
  27. void SNDBUFFER::get_buffers(bufptr_t& pos1, unsigned& size1, bufptr_t& pos2, unsigned& size2, unsigned count)
  28. {
  29. pos1 = read_position;
  30. pos2 = 0;
  31. size1 = size - read_position;
  32. if (count < size1) {
  33. size1 = count;
  34. size2 = 0;
  35. } else {
  36. size2 = count-size1;
  37. }
  38. }
  39. void SNDBUFFER::samples_read(unsigned count)
  40. {
  41. unsigned size1, size2, pos1, pos2;
  42. get_buffers(pos1, size1, pos2, size2, count);
  43. memset(buffer + pos1, 0, size1 * sizeof(SNDSAMPLE));
  44. if (size2) {
  45. memset(buffer + pos2, 0, size2 * sizeof(SNDSAMPLE));
  46. }
  47. read_position = (read_position + count) & (size-1);
  48. }
  49. void SNDBUFFER::count_start()
  50. {
  51. samples_ready = size;
  52. }
  53. unsigned SNDBUFFER::count_single(const SNDRENDER& render)
  54. {
  55. return (render.dstpos - read_position) & (size-1);
  56. }
  57. void SNDBUFFER::count(const SNDRENDER& render)
  58. {
  59. unsigned samples = count_single(render);
  60. if (samples < samples_ready) samples_ready = samples;
  61. }
  62. unsigned SNDBUFFER::count_end()
  63. {
  64. return samples_ready;
  65. }