File indexing completed on 2024-11-03 07:31:23

0001 /*
0002     SPDX-FileCopyrightText: 2014-2015 Harald Sitter <sitter@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #ifndef PA_DEVICE_H
0008 #define PA_DEVICE_H
0009 
0010 #include <QString>
0011 #include <QVariantMap>
0012 
0013 #include "port.h"
0014 #include "volumeobject.h"
0015 
0016 namespace PulseAudioQt
0017 {
0018 class Port;
0019 class DevicePrivate;
0020 
0021 /**
0022  * A PulseAudio device. Can be either a Sink or Source.
0023  */
0024 class PULSEAUDIOQT_EXPORT Device : public VolumeObject
0025 {
0026     Q_OBJECT
0027     Q_PROPERTY(State state READ state NOTIFY stateChanged)
0028     Q_PROPERTY(QString description READ description NOTIFY descriptionChanged)
0029     Q_PROPERTY(QString formFactor READ formFactor NOTIFY formFactorChanged)
0030     Q_PROPERTY(quint32 cardIndex READ cardIndex NOTIFY cardIndexChanged)
0031     Q_PROPERTY(QList<Port *> ports READ ports NOTIFY portsChanged)
0032     Q_PROPERTY(quint32 activePortIndex READ activePortIndex WRITE setActivePortIndex NOTIFY activePortIndexChanged)
0033     Q_PROPERTY(bool default READ isDefault WRITE setDefault NOTIFY defaultChanged)
0034     Q_PROPERTY(qint64 baseVolume READ baseVolume NOTIFY baseVolumeChanged)
0035     Q_PROPERTY(QVariantMap pulseProperties READ pulseProperties NOTIFY pulsePropertiesChanged)
0036 
0037 public:
0038     enum State {
0039         /** This state is used when the server does not support sink/source state introspection. */
0040         InvalidState = 0,
0041         /** Running, sink/source is playing/recording and used by at least one non-corked sink-input/source-output.  */
0042         RunningState,
0043         /** When idle, the sink/source is playing/recording but there is no non-corked sink-input/source-output attached to it. */
0044         IdleState,
0045         /** When suspended, actual sink/source access can be closed, for instance. */
0046         SuspendedState,
0047         UnknownState,
0048     };
0049     Q_ENUM(State);
0050 
0051     ~Device();
0052 
0053     /**
0054      * The state of this device.
0055      */
0056     State state() const;
0057 
0058     /**
0059      * A human readable description of this device.
0060      */
0061     QString description() const;
0062 
0063     /**
0064      * The device's form factor.
0065      * One of "internal", "speaker", "handset", "tv", "webcam", "microphone", "headset", "headphone", "hands-free", "car", "hifi", "computer", "portable".
0066      * This is based on PA_PROP_DEVICE_FORM_FACTOR.
0067      */
0068     QString formFactor() const;
0069 
0070     /**
0071      * Index of the card that owns this device.
0072      */
0073     quint32 cardIndex() const;
0074 
0075     /**
0076      * The ports associated with this device.
0077      */
0078     QList<Port *> ports() const;
0079 
0080     /**
0081      * The currently active port, by index.
0082      */
0083     quint32 activePortIndex() const;
0084 
0085     /**
0086      * Set the currently active port, by index.
0087      */
0088     virtual void setActivePortIndex(quint32 port_index) = 0;
0089 
0090     /**
0091      * Whether this is the default device.
0092      */
0093     virtual bool isDefault() const = 0;
0094 
0095     /**
0096      * Set whether this is the default device.
0097      */
0098     virtual void setDefault(bool enable) = 0;
0099 
0100     /**
0101      * The base volume of this device, generally useful as a good default volume.
0102      */
0103     qint64 baseVolume() const;
0104 
0105     /**
0106      * @return QVariantMap the pulseaudio properties of this device (e.g. media.class, device.api, ...)
0107      */
0108     [[nodiscard]] QVariantMap pulseProperties() const;
0109 
0110     /**
0111      * @brief Switch all streams onto this Device
0112      * Iterates through all relevant streams for the Device type and assigns them to this Device.
0113      * For example for a Sink device all SinkInputs known to the daemon will be explicitly switched
0114      * onto this Sink. Useful for mass-rerouting of streams from different devices onto a specific target device.
0115      */
0116     virtual Q_INVOKABLE void switchStreams() = 0;
0117 
0118 Q_SIGNALS:
0119     void stateChanged();
0120     void descriptionChanged();
0121     void formFactorChanged();
0122     void cardIndexChanged();
0123     void portsChanged();
0124     void activePortIndexChanged();
0125     void defaultChanged();
0126     void baseVolumeChanged();
0127     void pulsePropertiesChanged();
0128 
0129 protected:
0130     /** @private */
0131     explicit Device(QObject *parent);
0132     /** @private */
0133     DevicePrivate *d;
0134 
0135 private:
0136     friend class SinkPrivate;
0137     friend class SourcePrivate;
0138 };
0139 
0140 } // PulseAudioQt
0141 
0142 #endif // DEVICE_H