mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-06-27 00:47:20 -04:00
Frontend plugins should not require being placed in the frontend directory to be built successfully. Indeed they should only depend on libobs and the obs-frontend-api and thus their source tree should be able to exist anywhere (even standalone) and the plugin should still compile successfully (just like any 3rd party plugin). Thus moving those plugins into the main plugin directory ensures that they don't require on any "special sauce" within the source tree to compile.
88 lines
2.8 KiB
C++
88 lines
2.8 KiB
C++
#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;
|
|
};
|