1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- #pragma once
- #include <windows.h>
- #include <sapi.h>
- #include <condition_variable>
- #include <mutex>
- #include <vector>
- #include <obs.h>
- #include <util/deque.h>
- #include <util/windows/WinHandle.hpp>
- #include <fstream>
- class Deque {
- deque buf = {};
- public:
- inline ~Deque() { deque_free(&buf); }
- inline operator deque *() { return &buf; }
- inline deque *operator->() { return &buf; }
- };
- class mssapi_captions;
- class CaptionStream : public ISpAudio {
- volatile long refs = 1;
- SPAUDIOBUFFERINFO buf_info = {};
- mssapi_captions *handler;
- ULONG notify_size = 0;
- SPAUDIOSTATE state;
- WinHandle event;
- ULONG vol = 0;
- std::condition_variable cv;
- std::mutex m;
- std::vector<int16_t> temp_buf;
- WAVEFORMATEX format = {};
- Deque buf;
- ULONG wait_size = 0;
- DWORD samplerate = 0;
- ULARGE_INTEGER pos = {};
- ULONGLONG write_pos = 0;
- public:
- CaptionStream(DWORD samplerate, mssapi_captions *handler_);
- void Stop();
- void PushAudio(const void *data, size_t frames);
- // IUnknown methods
- STDMETHODIMP QueryInterface(REFIID riid, void **ppv) override;
- STDMETHODIMP_(ULONG) AddRef() override;
- STDMETHODIMP_(ULONG) Release() override;
- // ISequentialStream methods
- STDMETHODIMP Read(void *data, ULONG bytes, ULONG *read_bytes) override;
- STDMETHODIMP Write(const void *data, ULONG bytes,
- ULONG *written_bytes) override;
- // IStream methods
- STDMETHODIMP Seek(LARGE_INTEGER move, DWORD origin,
- ULARGE_INTEGER *new_pos) override;
- STDMETHODIMP SetSize(ULARGE_INTEGER new_size) override;
- STDMETHODIMP CopyTo(IStream *stream, ULARGE_INTEGER bytes,
- ULARGE_INTEGER *read_bytes,
- ULARGE_INTEGER *written_bytes) override;
- STDMETHODIMP Commit(DWORD commit_flags) override;
- STDMETHODIMP Revert(void) override;
- STDMETHODIMP LockRegion(ULARGE_INTEGER offset, ULARGE_INTEGER size,
- DWORD type) override;
- STDMETHODIMP UnlockRegion(ULARGE_INTEGER offset, ULARGE_INTEGER size,
- DWORD type) override;
- STDMETHODIMP Stat(STATSTG *stg, DWORD flags) override;
- STDMETHODIMP Clone(IStream **stream) override;
- // ISpStreamFormat methods
- STDMETHODIMP GetFormat(GUID *guid,
- WAVEFORMATEX **co_mem_wfex_out) override;
- // ISpAudio methods
- STDMETHODIMP SetState(SPAUDIOSTATE state, ULONGLONG reserved) override;
- STDMETHODIMP SetFormat(REFGUID guid_ref,
- const WAVEFORMATEX *wfex) override;
- STDMETHODIMP GetStatus(SPAUDIOSTATUS *status) override;
- STDMETHODIMP SetBufferInfo(const SPAUDIOBUFFERINFO *buf_info) override;
- STDMETHODIMP GetBufferInfo(SPAUDIOBUFFERINFO *buf_info) override;
- STDMETHODIMP GetDefaultFormat(GUID *format,
- WAVEFORMATEX **co_mem_wfex_out) override;
- STDMETHODIMP_(HANDLE) EventHandle(void) override;
- STDMETHODIMP GetVolumeLevel(ULONG *level) override;
- STDMETHODIMP SetVolumeLevel(ULONG level) override;
- STDMETHODIMP GetBufferNotifySize(ULONG *size) override;
- STDMETHODIMP SetBufferNotifySize(ULONG size) override;
- };
|