win-wasapi: Remove persistent references

Only need IMMDevice and IAudioRenderClient during initialization.
This commit is contained in:
jpark37
2021-09-25 11:59:40 -07:00
parent 15f9d37aef
commit 4503c4fdac

View File

@@ -25,10 +25,8 @@ static void GetWASAPIDefaults(obs_data_t *settings);
class WASAPISource {
ComPtr<IMMNotificationClient> notify;
ComPtr<IMMDeviceEnumerator> enumerator;
ComPtr<IMMDevice> device;
ComPtr<IAudioClient> client;
ComPtr<IAudioCaptureClient> capture;
ComPtr<IAudioRenderClient> render;
obs_source_t *source;
wstring default_id;
@@ -63,10 +61,10 @@ class WASAPISource {
inline void Stop();
void Reconnect();
void InitDevice();
ComPtr<IMMDevice> InitDevice();
void InitName();
void InitClient();
void InitRender();
void InitClient(IMMDevice *device);
void InitRender(IMMDevice *device);
void InitFormat(WAVEFORMATEX *wfex);
void InitCapture();
void Initialize();
@@ -218,8 +216,10 @@ void WASAPISource::Update(obs_data_t *settings)
Start();
}
void WASAPISource::InitDevice()
ComPtr<IMMDevice> WASAPISource::InitDevice()
{
ComPtr<IMMDevice> device;
if (isDefaultDevice) {
HRESULT res = enumerator->GetDefaultAudioEndpoint(
isInputDevice ? eCapture : eRender,
@@ -247,11 +247,13 @@ void WASAPISource::InitDevice()
if (FAILED(res))
throw HRError("Failed to enumerate device", res);
}
return device;
}
#define BUFFER_TIME_100NS (5 * 10000000)
void WASAPISource::InitClient()
void WASAPISource::InitClient(IMMDevice *device)
{
CoTaskMemPtr<WAVEFORMATEX> wfex;
HRESULT res;
@@ -277,7 +279,7 @@ void WASAPISource::InitClient()
throw HRError("Failed to initialize audio client", res);
}
void WASAPISource::InitRender()
void WASAPISource::InitRender(IMMDevice *device)
{
CoTaskMemPtr<WAVEFORMATEX> wfex;
HRESULT res;
@@ -307,8 +309,8 @@ void WASAPISource::InitRender()
if (FAILED(res))
throw HRError("Failed to get buffer size", res);
res = client->GetService(__uuidof(IAudioRenderClient),
(void **)render.Assign());
ComPtr<IAudioRenderClient> render;
res = client->GetService(IID_PPV_ARGS(render.Assign()));
if (FAILED(res))
throw HRError("Failed to get render client", res);
@@ -316,7 +318,7 @@ void WASAPISource::InitRender()
if (FAILED(res))
throw HRError("Failed to get buffer", res);
memset(buffer, 0, frames * wfex->nBlockAlign);
memset(buffer, 0, (size_t)frames * (size_t)wfex->nBlockAlign);
render->ReleaseBuffer(frames, 0);
}
@@ -379,7 +381,7 @@ void WASAPISource::InitCapture()
void WASAPISource::Initialize()
{
InitDevice();
ComPtr<IMMDevice> device = InitDevice();
device_name = GetDeviceName(device);
@@ -403,9 +405,9 @@ void WASAPISource::Initialize()
store->Release();
}
InitClient();
InitClient(device);
if (!isInputDevice)
InitRender();
InitRender(device);
InitCapture();
}