Revision control

Copy as Markdown

// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QWINDOWSAUDIODEVICES_H
#define QWINDOWSAUDIODEVICES_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include <QtMultimedia/qaudiodevice.h>
#include <QtMultimedia/private/qplatformaudiodevices_p.h>
#include <QtMultimedia/private/qwindowsmediafoundation_p.h>
#include <QtCore/qmutex.h>
#include <QtCore/qchronotimer.h>
#include <QtCore/private/qcomptr_p.h>
struct IAudioClient3;
struct IMMDevice;
struct IMMDeviceEnumerator;
QT_BEGIN_NAMESPACE
namespace QtWASAPI {
class CMMNotificationClient;
} // namespace QtWASAPI
class QWindowsAudioDevices : public QPlatformAudioDevices
{
public:
QWindowsAudioDevices();
virtual ~QWindowsAudioDevices();
QPlatformAudioSource *createAudioSource(const QAudioDevice &, const QAudioFormat &,
QObject *parent) override;
QPlatformAudioSink *createAudioSink(const QAudioDevice &, const QAudioFormat &,
QObject *parent) override;
using QPlatformAudioDevices::onAudioInputsChanged;
using QPlatformAudioDevices::onAudioOutputsChanged;
QLatin1String backendName() const override { return QLatin1String{ "WASAPI" }; }
bool hasCallbackApi() const override { return true; }
protected:
QList<QAudioDevice> findAudioInputs() const override;
QList<QAudioDevice> findAudioOutputs() const override;
private:
void scheduleAudioInputsChanged();
void scheduleAudioOutputsChanged();
QMFRuntimeInit m_wmfRuntime;
QList<QAudioDevice> availableDevices(QAudioDevice::Mode mode) const;
ComPtr<IMMDeviceEnumerator> m_deviceEnumerator;
ComPtr<QtWASAPI::CMMNotificationClient> m_notificationClient;
QChronoTimer m_audioInputsDebounce;
QChronoTimer m_audioOutputsDebounce;
friend QtWASAPI::CMMNotificationClient;
mutable QMutex m_cacheMutex;
mutable std::map<ComPtr<IMMDevice>, QAudioDevice> m_cachedDevices;
};
QT_END_NAMESPACE
#endif