base.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #ifndef AL_BACKENDS_BASE_H
  2. #define AL_BACKENDS_BASE_H
  3. #include "alMain.h"
  4. #include "threads.h"
  5. typedef struct ClockLatency {
  6. ALint64 ClockTime;
  7. ALint64 Latency;
  8. } ClockLatency;
  9. /* Helper to get the current clock time from the device's ClockBase, and
  10. * SamplesDone converted from the sample rate.
  11. */
  12. inline ALuint64 GetDeviceClockTime(ALCdevice *device)
  13. {
  14. return device->ClockBase + (device->SamplesDone * DEVICE_CLOCK_RES /
  15. device->Frequency);
  16. }
  17. struct ALCbackendVtable;
  18. typedef struct ALCbackend {
  19. const struct ALCbackendVtable *vtbl;
  20. ALCdevice *mDevice;
  21. almtx_t mMutex;
  22. } ALCbackend;
  23. void ALCbackend_Construct(ALCbackend *self, ALCdevice *device);
  24. void ALCbackend_Destruct(ALCbackend *self);
  25. ALCboolean ALCbackend_reset(ALCbackend *self);
  26. ALCenum ALCbackend_captureSamples(ALCbackend *self, void *buffer, ALCuint samples);
  27. ALCuint ALCbackend_availableSamples(ALCbackend *self);
  28. ClockLatency ALCbackend_getClockLatency(ALCbackend *self);
  29. void ALCbackend_lock(ALCbackend *self);
  30. void ALCbackend_unlock(ALCbackend *self);
  31. struct ALCbackendVtable {
  32. void (*const Destruct)(ALCbackend*);
  33. ALCenum (*const open)(ALCbackend*, const ALCchar*);
  34. void (*const close)(ALCbackend*);
  35. ALCboolean (*const reset)(ALCbackend*);
  36. ALCboolean (*const start)(ALCbackend*);
  37. void (*const stop)(ALCbackend*);
  38. ALCenum (*const captureSamples)(ALCbackend*, void*, ALCuint);
  39. ALCuint (*const availableSamples)(ALCbackend*);
  40. ClockLatency (*const getClockLatency)(ALCbackend*);
  41. void (*const lock)(ALCbackend*);
  42. void (*const unlock)(ALCbackend*);
  43. void (*const Delete)(void*);
  44. };
  45. #define DEFINE_ALCBACKEND_VTABLE(T) \
  46. DECLARE_THUNK(T, ALCbackend, void, Destruct) \
  47. DECLARE_THUNK1(T, ALCbackend, ALCenum, open, const ALCchar*) \
  48. DECLARE_THUNK(T, ALCbackend, void, close) \
  49. DECLARE_THUNK(T, ALCbackend, ALCboolean, reset) \
  50. DECLARE_THUNK(T, ALCbackend, ALCboolean, start) \
  51. DECLARE_THUNK(T, ALCbackend, void, stop) \
  52. DECLARE_THUNK2(T, ALCbackend, ALCenum, captureSamples, void*, ALCuint) \
  53. DECLARE_THUNK(T, ALCbackend, ALCuint, availableSamples) \
  54. DECLARE_THUNK(T, ALCbackend, ClockLatency, getClockLatency) \
  55. DECLARE_THUNK(T, ALCbackend, void, lock) \
  56. DECLARE_THUNK(T, ALCbackend, void, unlock) \
  57. static void T##_ALCbackend_Delete(void *ptr) \
  58. { T##_Delete(STATIC_UPCAST(T, ALCbackend, (ALCbackend*)ptr)); } \
  59. \
  60. static const struct ALCbackendVtable T##_ALCbackend_vtable = { \
  61. T##_ALCbackend_Destruct, \
  62. \
  63. T##_ALCbackend_open, \
  64. T##_ALCbackend_close, \
  65. T##_ALCbackend_reset, \
  66. T##_ALCbackend_start, \
  67. T##_ALCbackend_stop, \
  68. T##_ALCbackend_captureSamples, \
  69. T##_ALCbackend_availableSamples, \
  70. T##_ALCbackend_getClockLatency, \
  71. T##_ALCbackend_lock, \
  72. T##_ALCbackend_unlock, \
  73. \
  74. T##_ALCbackend_Delete, \
  75. }
  76. typedef enum ALCbackend_Type {
  77. ALCbackend_Playback,
  78. ALCbackend_Capture,
  79. ALCbackend_Loopback
  80. } ALCbackend_Type;
  81. struct ALCbackendFactoryVtable;
  82. typedef struct ALCbackendFactory {
  83. const struct ALCbackendFactoryVtable *vtbl;
  84. } ALCbackendFactory;
  85. void ALCbackendFactory_deinit(ALCbackendFactory *self);
  86. struct ALCbackendFactoryVtable {
  87. ALCboolean (*const init)(ALCbackendFactory *self);
  88. void (*const deinit)(ALCbackendFactory *self);
  89. ALCboolean (*const querySupport)(ALCbackendFactory *self, ALCbackend_Type type);
  90. void (*const probe)(ALCbackendFactory *self, enum DevProbe type);
  91. ALCbackend* (*const createBackend)(ALCbackendFactory *self, ALCdevice *device, ALCbackend_Type type);
  92. };
  93. #define DEFINE_ALCBACKENDFACTORY_VTABLE(T) \
  94. DECLARE_THUNK(T, ALCbackendFactory, ALCboolean, init) \
  95. DECLARE_THUNK(T, ALCbackendFactory, void, deinit) \
  96. DECLARE_THUNK1(T, ALCbackendFactory, ALCboolean, querySupport, ALCbackend_Type) \
  97. DECLARE_THUNK1(T, ALCbackendFactory, void, probe, enum DevProbe) \
  98. DECLARE_THUNK2(T, ALCbackendFactory, ALCbackend*, createBackend, ALCdevice*, ALCbackend_Type) \
  99. \
  100. static const struct ALCbackendFactoryVtable T##_ALCbackendFactory_vtable = { \
  101. T##_ALCbackendFactory_init, \
  102. T##_ALCbackendFactory_deinit, \
  103. T##_ALCbackendFactory_querySupport, \
  104. T##_ALCbackendFactory_probe, \
  105. T##_ALCbackendFactory_createBackend, \
  106. }
  107. ALCbackendFactory *ALCpulseBackendFactory_getFactory(void);
  108. ALCbackendFactory *ALCalsaBackendFactory_getFactory(void);
  109. ALCbackendFactory *ALCossBackendFactory_getFactory(void);
  110. ALCbackendFactory *ALCjackBackendFactory_getFactory(void);
  111. ALCbackendFactory *ALCsolarisBackendFactory_getFactory(void);
  112. ALCbackendFactory *ALCmmdevBackendFactory_getFactory(void);
  113. ALCbackendFactory *ALCdsoundBackendFactory_getFactory(void);
  114. ALCbackendFactory *ALCwinmmBackendFactory_getFactory(void);
  115. ALCbackendFactory *ALCportBackendFactory_getFactory(void);
  116. ALCbackendFactory *ALCnullBackendFactory_getFactory(void);
  117. ALCbackendFactory *ALCwaveBackendFactory_getFactory(void);
  118. ALCbackendFactory *ALCloopbackFactory_getFactory(void);
  119. ALCbackend *create_backend_wrapper(ALCdevice *device, const BackendFuncs *funcs, ALCbackend_Type type);
  120. #endif /* AL_BACKENDS_BASE_H */