base.h 7.0 KB

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