File indexing completed on 2024-12-01 11:13:25
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 VOLUMEOBJECT_H 0008 #define VOLUMEOBJECT_H 0009 0010 #include <pulse/volume.h> 0011 0012 #include "pulseobject.h" 0013 0014 namespace QPulseAudio 0015 { 0016 class VolumeObject : public PulseObject 0017 { 0018 Q_OBJECT 0019 Q_PROPERTY(qint64 volume READ volume WRITE setVolume NOTIFY volumeChanged) 0020 Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged) 0021 Q_PROPERTY(bool hasVolume READ hasVolume NOTIFY hasVolumeChanged) 0022 Q_PROPERTY(bool volumeWritable READ isVolumeWritable NOTIFY isVolumeWritableChanged) 0023 Q_PROPERTY(QStringList channels READ channels NOTIFY channelsChanged) 0024 Q_PROPERTY(QStringList rawChannels READ rawChannels NOTIFY rawChannelsChanged) 0025 Q_PROPERTY(QVector<qint64> channelVolumes READ channelVolumes WRITE setChannelVolumes NOTIFY channelVolumesChanged) 0026 public: 0027 explicit VolumeObject(QObject *parent); 0028 ~VolumeObject() override; 0029 0030 template<typename PAInfo> 0031 void updateVolumeObject(PAInfo *info) 0032 { 0033 updatePulseObject(info); 0034 if (m_muted != info->mute) { 0035 m_muted = info->mute; 0036 Q_EMIT mutedChanged(); 0037 } 0038 if (!pa_cvolume_equal(&m_volume, &info->volume)) { 0039 m_volume = info->volume; 0040 Q_EMIT volumeChanged(); 0041 Q_EMIT channelVolumesChanged(); 0042 } 0043 QStringList infoChannels; 0044 infoChannels.reserve(info->channel_map.channels); 0045 for (int i = 0; i < info->channel_map.channels; ++i) { 0046 infoChannels << QString::fromUtf8(pa_channel_position_to_pretty_string(info->channel_map.map[i])); 0047 } 0048 if (m_channels != infoChannels) { 0049 m_channels = infoChannels; 0050 Q_EMIT channelsChanged(); 0051 } 0052 0053 QStringList infoRawChannels; 0054 infoRawChannels.reserve(info->channel_map.channels); 0055 for (int i = 0; i < info->channel_map.channels; ++i) { 0056 infoRawChannels << QString::fromUtf8(pa_channel_position_to_string(info->channel_map.map[i])); 0057 } 0058 if (m_rawChannels != infoRawChannels) { 0059 m_rawChannels = infoRawChannels; 0060 Q_EMIT rawChannelsChanged(); 0061 } 0062 } 0063 0064 qint64 volume() const; 0065 virtual void setVolume(qint64 volume) = 0; 0066 0067 bool isMuted() const; 0068 virtual void setMuted(bool muted) = 0; 0069 0070 bool hasVolume() const; 0071 bool isVolumeWritable() const; 0072 0073 QStringList channels() const; 0074 QStringList rawChannels() const; 0075 0076 QVector<qint64> channelVolumes() const; 0077 virtual void setChannelVolumes(const QVector<qint64> &channelVolumes) = 0; 0078 Q_INVOKABLE virtual void setChannelVolume(int channel, qint64 volume) = 0; 0079 0080 Q_SIGNALS: 0081 void volumeChanged(); 0082 void mutedChanged(); 0083 void hasVolumeChanged(); 0084 void isVolumeWritableChanged(); 0085 void channelsChanged(); 0086 void rawChannelsChanged(); 0087 void channelVolumesChanged(); 0088 0089 protected: 0090 pa_cvolume cvolume() const; 0091 0092 pa_cvolume m_volume; 0093 bool m_muted = true; 0094 bool m_hasVolume = true; 0095 bool m_volumeWritable = true; 0096 QStringList m_channels; 0097 QStringList m_rawChannels; 0098 }; 0099 0100 } // QPulseAudio 0101 0102 #endif // VOLUMEOBJECT_H