captions-mssapi-stream.hpp 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #pragma once
  2. #include <windows.h>
  3. #include <sapi.h>
  4. #include <condition_variable>
  5. #include <mutex>
  6. #include <vector>
  7. #include <obs.h>
  8. #include <util/circlebuf.h>
  9. #include <util/windows/WinHandle.hpp>
  10. #include <fstream>
  11. class CircleBuf {
  12. circlebuf buf = {};
  13. public:
  14. inline ~CircleBuf() { circlebuf_free(&buf); }
  15. inline operator circlebuf *() { return &buf; }
  16. inline circlebuf *operator->() { return &buf; }
  17. };
  18. class mssapi_captions;
  19. class CaptionStream : public ISpAudio {
  20. volatile long refs = 1;
  21. SPAUDIOBUFFERINFO buf_info = {};
  22. mssapi_captions *handler;
  23. ULONG notify_size = 0;
  24. SPAUDIOSTATE state;
  25. WinHandle event;
  26. ULONG vol = 0;
  27. std::condition_variable cv;
  28. std::mutex m;
  29. std::vector<int16_t> temp_buf;
  30. WAVEFORMATEX format = {};
  31. CircleBuf buf;
  32. ULONG wait_size = 0;
  33. DWORD samplerate = 0;
  34. ULARGE_INTEGER pos = {};
  35. ULONGLONG write_pos = 0;
  36. public:
  37. CaptionStream(DWORD samplerate, mssapi_captions *handler_);
  38. void Stop();
  39. void PushAudio(const void *data, size_t frames);
  40. // IUnknown methods
  41. STDMETHODIMP QueryInterface(REFIID riid, void **ppv) override;
  42. STDMETHODIMP_(ULONG) AddRef() override;
  43. STDMETHODIMP_(ULONG) Release() override;
  44. // ISequentialStream methods
  45. STDMETHODIMP Read(void *data, ULONG bytes, ULONG *read_bytes) override;
  46. STDMETHODIMP Write(const void *data, ULONG bytes,
  47. ULONG *written_bytes) override;
  48. // IStream methods
  49. STDMETHODIMP Seek(LARGE_INTEGER move, DWORD origin,
  50. ULARGE_INTEGER *new_pos) override;
  51. STDMETHODIMP SetSize(ULARGE_INTEGER new_size) override;
  52. STDMETHODIMP CopyTo(IStream *stream, ULARGE_INTEGER bytes,
  53. ULARGE_INTEGER *read_bytes,
  54. ULARGE_INTEGER *written_bytes) override;
  55. STDMETHODIMP Commit(DWORD commit_flags) override;
  56. STDMETHODIMP Revert(void) override;
  57. STDMETHODIMP LockRegion(ULARGE_INTEGER offset, ULARGE_INTEGER size,
  58. DWORD type) override;
  59. STDMETHODIMP UnlockRegion(ULARGE_INTEGER offset, ULARGE_INTEGER size,
  60. DWORD type) override;
  61. STDMETHODIMP Stat(STATSTG *stg, DWORD flags) override;
  62. STDMETHODIMP Clone(IStream **stream) override;
  63. // ISpStreamFormat methods
  64. STDMETHODIMP GetFormat(GUID *guid,
  65. WAVEFORMATEX **co_mem_wfex_out) override;
  66. // ISpAudio methods
  67. STDMETHODIMP SetState(SPAUDIOSTATE state, ULONGLONG reserved) override;
  68. STDMETHODIMP SetFormat(REFGUID guid_ref,
  69. const WAVEFORMATEX *wfex) override;
  70. STDMETHODIMP GetStatus(SPAUDIOSTATUS *status) override;
  71. STDMETHODIMP SetBufferInfo(const SPAUDIOBUFFERINFO *buf_info) override;
  72. STDMETHODIMP GetBufferInfo(SPAUDIOBUFFERINFO *buf_info) override;
  73. STDMETHODIMP GetDefaultFormat(GUID *format,
  74. WAVEFORMATEX **co_mem_wfex_out) override;
  75. STDMETHODIMP_(HANDLE) EventHandle(void) override;
  76. STDMETHODIMP GetVolumeLevel(ULONG *level) override;
  77. STDMETHODIMP SetVolumeLevel(ULONG level) override;
  78. STDMETHODIMP GetBufferNotifySize(ULONG *size) override;
  79. STDMETHODIMP SetBufferNotifySize(ULONG size) override;
  80. };