File: captions-mssapi-stream.hpp

package info (click to toggle)
obs-studio 22.0.3%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 23,052 kB
  • sloc: ansic: 134,708; cpp: 49,169; objc: 1,036; makefile: 829; sh: 410; python: 360
file content (94 lines) | stat: -rw-r--r-- 2,879 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#pragma once

#include <windows.h>
#include <sapi.h>
#include <condition_variable>
#include <mutex>
#include <vector>
#include <obs.h>
#include <util/circlebuf.h>
#include <util/windows/WinHandle.hpp>

#include <fstream>

class CircleBuf {
	circlebuf buf = {};
public:
	inline ~CircleBuf() {circlebuf_free(&buf);}
	inline operator circlebuf*() {return &buf;}
	inline circlebuf *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 = {};

	CircleBuf 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;
};