🛠️🐜 Antkeeper superbuild with dependencies included https://antkeeper.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

120 lines
2.8 KiB

  1. #ifndef _AL_BUFFER_H_
  2. #define _AL_BUFFER_H_
  3. #include "AL/alc.h"
  4. #include "AL/al.h"
  5. #include "AL/alext.h"
  6. #include "inprogext.h"
  7. #include "atomic.h"
  8. #include "vector.h"
  9. /* User formats */
  10. enum UserFmtType {
  11. UserFmtUByte,
  12. UserFmtShort,
  13. UserFmtFloat,
  14. UserFmtDouble,
  15. UserFmtMulaw,
  16. UserFmtAlaw,
  17. UserFmtIMA4,
  18. UserFmtMSADPCM,
  19. };
  20. enum UserFmtChannels {
  21. UserFmtMono,
  22. UserFmtStereo,
  23. UserFmtRear,
  24. UserFmtQuad,
  25. UserFmtX51, /* (WFX order) */
  26. UserFmtX61, /* (WFX order) */
  27. UserFmtX71, /* (WFX order) */
  28. UserFmtBFormat2D, /* WXY */
  29. UserFmtBFormat3D, /* WXYZ */
  30. };
  31. ALsizei BytesFromUserFmt(UserFmtType type);
  32. ALsizei ChannelsFromUserFmt(UserFmtChannels chans);
  33. inline ALsizei FrameSizeFromUserFmt(UserFmtChannels chans, UserFmtType type)
  34. { return ChannelsFromUserFmt(chans) * BytesFromUserFmt(type); }
  35. /* Storable formats */
  36. enum FmtType {
  37. FmtUByte = UserFmtUByte,
  38. FmtShort = UserFmtShort,
  39. FmtFloat = UserFmtFloat,
  40. FmtDouble = UserFmtDouble,
  41. FmtMulaw = UserFmtMulaw,
  42. FmtAlaw = UserFmtAlaw,
  43. };
  44. enum FmtChannels {
  45. FmtMono = UserFmtMono,
  46. FmtStereo = UserFmtStereo,
  47. FmtRear = UserFmtRear,
  48. FmtQuad = UserFmtQuad,
  49. FmtX51 = UserFmtX51,
  50. FmtX61 = UserFmtX61,
  51. FmtX71 = UserFmtX71,
  52. FmtBFormat2D = UserFmtBFormat2D,
  53. FmtBFormat3D = UserFmtBFormat3D,
  54. };
  55. #define MAX_INPUT_CHANNELS (8)
  56. /* DevFmtType traits, providing the type, etc given a DevFmtType. */
  57. template<FmtType T>
  58. struct FmtTypeTraits { };
  59. template<>
  60. struct FmtTypeTraits<FmtUByte> { using Type = ALubyte; };
  61. template<>
  62. struct FmtTypeTraits<FmtShort> { using Type = ALshort; };
  63. template<>
  64. struct FmtTypeTraits<FmtFloat> { using Type = ALfloat; };
  65. template<>
  66. struct FmtTypeTraits<FmtDouble> { using Type = ALdouble; };
  67. template<>
  68. struct FmtTypeTraits<FmtMulaw> { using Type = ALubyte; };
  69. template<>
  70. struct FmtTypeTraits<FmtAlaw> { using Type = ALubyte; };
  71. ALsizei BytesFromFmt(FmtType type);
  72. ALsizei ChannelsFromFmt(FmtChannels chans);
  73. inline ALsizei FrameSizeFromFmt(FmtChannels chans, FmtType type)
  74. { return ChannelsFromFmt(chans) * BytesFromFmt(type); }
  75. struct ALbuffer {
  76. al::vector<ALbyte,16> mData;
  77. ALsizei Frequency{0};
  78. ALbitfieldSOFT Access{0u};
  79. ALsizei SampleLen{0};
  80. FmtChannels mFmtChannels{};
  81. FmtType mFmtType{};
  82. ALsizei BytesAlloc{0};
  83. UserFmtType OriginalType{};
  84. ALsizei OriginalSize{0};
  85. ALsizei OriginalAlign{0};
  86. ALsizei LoopStart{0};
  87. ALsizei LoopEnd{0};
  88. std::atomic<ALsizei> UnpackAlign{0};
  89. std::atomic<ALsizei> PackAlign{0};
  90. ALbitfieldSOFT MappedAccess{0u};
  91. ALsizei MappedOffset{0};
  92. ALsizei MappedSize{0};
  93. /* Number of times buffer was attached to a source (deletion can only occur when 0) */
  94. RefCount ref{0u};
  95. /* Self ID */
  96. ALuint id{0};
  97. };
  98. #endif