amer cerkicworking on hmd fix39e10927 years agoHistory
155 lines · 4.7 KB · C
RawDownload
////  AudioDevices.h//  interface/src/scripting////  Created by Zach Pomerantz on 28/5/2017.//  Copyright 2017 High Fidelity, Inc.////  Distributed under the Apache License, Version 2.0.//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html// #ifndef hifi_scripting_AudioDevices_h#define hifi_scripting_AudioDevices_h #include <memory>#include <mutex> #include <QObject>#include <QAbstractListModel>#include <QAudioDeviceInfo> #include <HifiAudioDeviceInfo.h> namespace scripting { class AudioDevice {public:    HifiAudioDeviceInfo info;    QString display;    bool selectedDesktop { false };    bool selectedHMD { false };    QString type;}; class AudioDeviceList : public QAbstractListModel {    Q_OBJECT public:    AudioDeviceList(QAudio::Mode mode = QAudio::AudioOutput);    virtual ~AudioDeviceList();     virtual std::shared_ptr<AudioDevice> newDevice(const AudioDevice& device)        { return std::make_shared<AudioDevice>(device); }     int rowCount(const QModelIndex& parent = QModelIndex()) const override { Q_UNUSED(parent); return _devices.size(); }    QHash<int, QByteArray> roleNames() const override { return _roles; }    Qt::ItemFlags flags(const QModelIndex& index) const override { return _flags; }     // get/set devices through a QML ListView    QVariant data(const QModelIndex& index, int role) const override;     // reset device to the last selected device in this context, or the default    void resetDevice(bool contextIsHMD); signals:    void deviceChanged(const HifiAudioDeviceInfo& device);    void selectedDevicePlugged(const HifiAudioDeviceInfo& device, bool isHMD); protected slots:    void onDeviceChanged(const HifiAudioDeviceInfo& device, bool isHMD);    void onDevicesChanged(QAudio::Mode mode, const QList<HifiAudioDeviceInfo>& devices); protected:    friend class AudioDevices;     static QHash<int, QByteArray> _roles;    static Qt::ItemFlags _flags;    const QAudio::Mode _mode;    HifiAudioDeviceInfo _selectedDesktopDevice;    HifiAudioDeviceInfo _selectedHMDDevice;    QString _backupSelectedDesktopDeviceName;    QString _backupSelectedHMDDeviceName;    QList<std::shared_ptr<AudioDevice>> _devices;    QString _hmdSavedDeviceName;    QString _desktopSavedDeviceName;}; class AudioInputDevice : public AudioDevice {public:    AudioInputDevice(const AudioDevice& device) : AudioDevice(device) {}    float peak { 0.0f };}; class AudioInputDeviceList : public AudioDeviceList {    Q_OBJECT    Q_PROPERTY(bool peakValuesAvailable READ peakValuesAvailable CONSTANT)    Q_PROPERTY(bool peakValuesEnabled READ peakValuesEnabled WRITE setPeakValuesEnabled NOTIFY peakValuesEnabledChanged) public:    AudioInputDeviceList() : AudioDeviceList(QAudio::AudioInput) {}    virtual ~AudioInputDeviceList() = default;     virtual std::shared_ptr<AudioDevice> newDevice(const AudioDevice& device) override        { return std::make_shared<AudioInputDevice>(device); }     QVariant data(const QModelIndex& index, int role) const override; signals:    void peakValuesEnabledChanged(bool enabled); protected slots:    void onPeakValueListChanged(const QList<float>& peakValueList); protected:    friend class AudioDevices;     bool peakValuesAvailable();    std::once_flag _peakFlag;    bool _peakValuesAvailable;     bool peakValuesEnabled() const { return _peakValuesEnabled; }    void setPeakValuesEnabled(bool enable);    bool _peakValuesEnabled { false };};class Audio; class AudioDevices : public QObject {    Q_OBJECT    Q_PROPERTY(AudioInputDeviceList* input READ getInputList NOTIFY nop)    Q_PROPERTY(AudioDeviceList* output READ getOutputList NOTIFY nop) public:    AudioDevices(bool& contextIsHMD);    virtual ~AudioDevices(); signals:    void nop(); private slots:    void chooseInputDevice(const HifiAudioDeviceInfo& device, bool isHMD);    void chooseOutputDevice(const HifiAudioDeviceInfo& device, bool isHMD);     void onContextChanged(const QString& context);    void onDeviceSelected(QAudio::Mode mode, const HifiAudioDeviceInfo& device,                          const HifiAudioDeviceInfo& previousDevice, bool isHMD);    void onDeviceChanged(QAudio::Mode mode, const HifiAudioDeviceInfo& device);    void onDevicesChanged(QAudio::Mode mode, const QList<HifiAudioDeviceInfo>& devices); private:    friend class Audio;     AudioInputDeviceList* getInputList() { return &_inputs; }    AudioDeviceList* getOutputList() { return &_outputs; }     AudioInputDeviceList _inputs;    AudioDeviceList _outputs { QAudio::AudioOutput };    HifiAudioDeviceInfo _requestedOutputDevice;    HifiAudioDeviceInfo _requestedInputDevice;     const bool& _contextIsHMD;}; }; #endif // hifi_scripting_AudioDevices_h