alBuffer.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #ifndef _AL_BUFFER_H_
  2. #define _AL_BUFFER_H_
  3. #include "alMain.h"
  4. #ifdef __cplusplus
  5. extern "C" {
  6. #endif
  7. /* User formats */
  8. enum UserFmtType {
  9. UserFmtByte = AL_BYTE_SOFT,
  10. UserFmtUByte = AL_UNSIGNED_BYTE_SOFT,
  11. UserFmtShort = AL_SHORT_SOFT,
  12. UserFmtUShort = AL_UNSIGNED_SHORT_SOFT,
  13. UserFmtInt = AL_INT_SOFT,
  14. UserFmtUInt = AL_UNSIGNED_INT_SOFT,
  15. UserFmtFloat = AL_FLOAT_SOFT,
  16. UserFmtDouble = AL_DOUBLE_SOFT,
  17. UserFmtByte3 = AL_BYTE3_SOFT,
  18. UserFmtUByte3 = AL_UNSIGNED_BYTE3_SOFT,
  19. UserFmtMulaw = AL_MULAW_SOFT,
  20. UserFmtAlaw = 0x10000000,
  21. UserFmtIMA4,
  22. UserFmtMSADPCM,
  23. };
  24. enum UserFmtChannels {
  25. UserFmtMono = AL_MONO_SOFT,
  26. UserFmtStereo = AL_STEREO_SOFT,
  27. UserFmtRear = AL_REAR_SOFT,
  28. UserFmtQuad = AL_QUAD_SOFT,
  29. UserFmtX51 = AL_5POINT1_SOFT, /* (WFX order) */
  30. UserFmtX61 = AL_6POINT1_SOFT, /* (WFX order) */
  31. UserFmtX71 = AL_7POINT1_SOFT, /* (WFX order) */
  32. UserFmtBFormat2D = AL_BFORMAT2D_SOFT, /* WXY */
  33. UserFmtBFormat3D = AL_BFORMAT3D_SOFT, /* WXYZ */
  34. };
  35. ALuint BytesFromUserFmt(enum UserFmtType type);
  36. ALuint ChannelsFromUserFmt(enum UserFmtChannels chans);
  37. inline ALuint FrameSizeFromUserFmt(enum UserFmtChannels chans, enum UserFmtType type)
  38. {
  39. return ChannelsFromUserFmt(chans) * BytesFromUserFmt(type);
  40. }
  41. /* Storable formats */
  42. enum FmtType {
  43. FmtByte = UserFmtByte,
  44. FmtShort = UserFmtShort,
  45. FmtFloat = UserFmtFloat,
  46. };
  47. enum FmtChannels {
  48. FmtMono = UserFmtMono,
  49. FmtStereo = UserFmtStereo,
  50. FmtRear = UserFmtRear,
  51. FmtQuad = UserFmtQuad,
  52. FmtX51 = UserFmtX51,
  53. FmtX61 = UserFmtX61,
  54. FmtX71 = UserFmtX71,
  55. FmtBFormat2D = UserFmtBFormat2D,
  56. FmtBFormat3D = UserFmtBFormat3D,
  57. };
  58. #define MAX_INPUT_CHANNELS (8)
  59. ALuint BytesFromFmt(enum FmtType type);
  60. ALuint ChannelsFromFmt(enum FmtChannels chans);
  61. inline ALuint FrameSizeFromFmt(enum FmtChannels chans, enum FmtType type)
  62. {
  63. return ChannelsFromFmt(chans) * BytesFromFmt(type);
  64. }
  65. typedef struct ALbuffer {
  66. ALvoid *data;
  67. ALsizei Frequency;
  68. ALenum Format;
  69. ALsizei SampleLen;
  70. enum FmtChannels FmtChannels;
  71. enum FmtType FmtType;
  72. ALuint BytesAlloc;
  73. enum UserFmtChannels OriginalChannels;
  74. enum UserFmtType OriginalType;
  75. ALsizei OriginalSize;
  76. ALsizei OriginalAlign;
  77. ALsizei LoopStart;
  78. ALsizei LoopEnd;
  79. ATOMIC(ALsizei) UnpackAlign;
  80. ATOMIC(ALsizei) PackAlign;
  81. /* Number of times buffer was attached to a source (deletion can only occur when 0) */
  82. RefCount ref;
  83. RWLock lock;
  84. /* Self ID */
  85. ALuint id;
  86. } ALbuffer;
  87. ALbuffer *NewBuffer(ALCcontext *context);
  88. void DeleteBuffer(ALCdevice *device, ALbuffer *buffer);
  89. ALenum LoadData(ALbuffer *buffer, ALuint freq, ALenum NewFormat, ALsizei frames, enum UserFmtChannels SrcChannels, enum UserFmtType SrcType, const ALvoid *data, ALsizei align, ALboolean storesrc);
  90. inline void LockBuffersRead(ALCdevice *device)
  91. { LockUIntMapRead(&device->BufferMap); }
  92. inline void UnlockBuffersRead(ALCdevice *device)
  93. { UnlockUIntMapRead(&device->BufferMap); }
  94. inline void LockBuffersWrite(ALCdevice *device)
  95. { LockUIntMapWrite(&device->BufferMap); }
  96. inline void UnlockBuffersWrite(ALCdevice *device)
  97. { UnlockUIntMapWrite(&device->BufferMap); }
  98. inline struct ALbuffer *LookupBuffer(ALCdevice *device, ALuint id)
  99. { return (struct ALbuffer*)LookupUIntMapKeyNoLock(&device->BufferMap, id); }
  100. inline struct ALbuffer *RemoveBuffer(ALCdevice *device, ALuint id)
  101. { return (struct ALbuffer*)RemoveUIntMapKeyNoLock(&device->BufferMap, id); }
  102. ALvoid ReleaseALBuffers(ALCdevice *device);
  103. #ifdef __cplusplus
  104. }
  105. #endif
  106. #endif