diff --git a/src/kcm/package/contents/ui/Advanced.qml b/src/kcm/package/contents/ui/Advanced.qml --- a/src/kcm/package/contents/ui/Advanced.qml +++ b/src/kcm/package/contents/ui/Advanced.qml @@ -147,8 +147,8 @@ Button{ text: i18n("Front Left") anchors.centerIn: parent - visible: sinks.pulseObject ? sinks.pulseObject.channels.indexOf("Front Left") > -1 : false - onClicked: sinks.pulseObject.testChannel("Front Left") + visible: sinks.pulseObject ? sinks.pulseObject.rawChannels.indexOf("front-left") > -1 : false + onClicked: sinks.pulseObject.testChannel("front-left") } } Item { @@ -158,8 +158,8 @@ Button{ text: i18n("Front Center") anchors.centerIn: parent - visible: sinks.pulseObject ? sinks.pulseObject.channels.indexOf("Front Center") > -1 : false - onClicked: sinks.pulseObject.testChannel("Front Center") + visible: sinks.pulseObject ? sinks.pulseObject.rawChannels.indexOf("front-center") > -1 : false + onClicked: sinks.pulseObject.testChannel("front-center") } } Item { @@ -169,8 +169,8 @@ Button{ text: i18n("Front Right") anchors.centerIn: parent - visible: sinks.pulseObject ? sinks.pulseObject.channels.indexOf("Front Right") > -1 : false - onClicked: sinks.pulseObject.testChannel("Front Right") + visible: sinks.pulseObject ? sinks.pulseObject.rawChannels.indexOf("front-right") > -1 : false + onClicked: sinks.pulseObject.testChannel("front-right") } } Item { @@ -180,8 +180,8 @@ Button{ text: i18n("Side Left") anchors.centerIn: parent - visible: sinks.pulseObject ? sinks.pulseObject.channels.indexOf("Side Left") > -1 : false - onClicked: sinks.pulseObject.testChannel("Side Left") + visible: sinks.pulseObject ? sinks.pulseObject.rawChannels.indexOf("side-left") > -1 : false + onClicked: sinks.pulseObject.testChannel("side-left") } } @@ -206,38 +206,38 @@ Button{ text: i18n("Side Right") anchors.centerIn: parent - visible: sinks.pulseObject ? sinks.pulseObject.channels.indexOf("Side Right") > -1 : false - onClicked: sinks.pulseObject.testChannel("Side Right") + visible: sinks.pulseObject ? sinks.pulseObject.rawChannels.indexOf("side-right") > -1 : false + onClicked: sinks.pulseObject.testChannel("side-right") } } Item { width: grid.width/3 height: 50 Button{ text: i18n("Rear Left") anchors.centerIn: parent - visible: sinks.pulseObject ? sinks.pulseObject.channels.indexOf("Rear Left") > -1 : false - onClicked: sinks.pulseObject.testChannel("Rear Left") + visible: sinks.pulseObject ? sinks.pulseObject.rawChannels.indexOf("rear-left") > -1 : false + onClicked: sinks.pulseObject.testChannel("rear-left") } } Item { width: grid.width/3 height: 50 Button{ text: i18n("Subwoofer") anchors.centerIn: parent - visible: sinks.pulseObject ? sinks.pulseObject.channels.indexOf("Subwoofer") > -1 : false - onClicked: sinks.pulseObject.testChannel("Subwoofer") + visible: sinks.pulseObject ? sinks.pulseObject.rawChannels.indexOf("lfe") > -1 : false + onClicked: sinks.pulseObject.testChannel("subwoofer") } } Item { width: grid.width/3 height: 50 Button{ text: i18n("Rear Right") anchors.centerIn: parent - visible: sinks.pulseObject ? sinks.pulseObject.channels.indexOf("Rear Right") > -1 : false - onClicked: sinks.pulseObject.testChannel("Rear Right") + visible: sinks.pulseObject ? sinks.pulseObject.rawChannels.indexOf("rear-right") > -1 : false + onClicked: sinks.pulseObject.testChannel("rear-right") } } } diff --git a/src/sink.h b/src/sink.h --- a/src/sink.h +++ b/src/sink.h @@ -46,12 +46,6 @@ public Q_SLOTS: void testChannel(const QString &name); - -private: - pa_channel_position_t channelNameToPosition(const QString &name); - QString positionToChannelName(pa_channel_position_t position); - QString positionAsString(pa_channel_position_t pos); - }; } // QPulseAudio diff --git a/src/sink.cpp b/src/sink.cpp --- a/src/sink.cpp +++ b/src/sink.cpp @@ -82,53 +82,6 @@ } } -pa_channel_position_t Sink::channelNameToPosition(const QString &name) -{ - if (name == QLatin1String("Front Left")) { - return PA_CHANNEL_POSITION_FRONT_LEFT; - } else if (name == QLatin1String("Front Center")) { - return PA_CHANNEL_POSITION_FRONT_CENTER; - } else if (name == QLatin1String("Front Right")) { - return PA_CHANNEL_POSITION_FRONT_RIGHT; - } else if (name == QLatin1String("Side Left")) { - return PA_CHANNEL_POSITION_SIDE_LEFT; - } else if (name == QLatin1String("Side Right")) { - return PA_CHANNEL_POSITION_SIDE_RIGHT; - } else if (name == QLatin1String("Rear Left")) { - return PA_CHANNEL_POSITION_REAR_LEFT; - } else if (name == QLatin1String("Rear Right")) { - return PA_CHANNEL_POSITION_REAR_RIGHT; - } else if (name == QLatin1String("Subwoofer")) { - return PA_CHANNEL_POSITION_SUBWOOFER; - } - - return PA_CHANNEL_POSITION_MONO; -} - -QString Sink::positionToChannelName(pa_channel_position_t position) -{ - switch (position) { - case PA_CHANNEL_POSITION_FRONT_LEFT: - return QStringLiteral("Front Left"); - case PA_CHANNEL_POSITION_FRONT_RIGHT: - return QStringLiteral("Front Right"); - case PA_CHANNEL_POSITION_FRONT_CENTER: - return QStringLiteral("Front Center"); - case PA_CHANNEL_POSITION_SIDE_LEFT: - return QStringLiteral("Side Left"); - case PA_CHANNEL_POSITION_SIDE_RIGHT: - return QStringLiteral("Side Right"); - case PA_CHANNEL_POSITION_REAR_LEFT: - return QStringLiteral("Rear Left"); - case PA_CHANNEL_POSITION_REAR_RIGHT: - return QStringLiteral("Rear Right"); - case PA_CHANNEL_POSITION_SUBWOOFER: - return QStringLiteral("Subwoofer"); - default: - return QStringLiteral("Mono"); - } -} - void Sink::testChannel(const QString &name) { auto context = CanberraContext::instance()->canberra(); @@ -139,13 +92,13 @@ snprintf(dev, sizeof(dev), "%lu", (unsigned long) m_index); ca_context_change_device(context, dev); - QString sound_name = QStringLiteral("audio-channel-") + positionAsString(channelNameToPosition(name)); + QString sound_name = QStringLiteral("audio-channel-") + name; ca_proplist *proplist; ca_proplist_create(&proplist); ca_proplist_sets(proplist, CA_PROP_MEDIA_ROLE, "test"); ca_proplist_sets(proplist, CA_PROP_MEDIA_NAME, name.toLatin1().constData()); - ca_proplist_sets(proplist, CA_PROP_CANBERRA_FORCE_CHANNEL, positionAsString(channelNameToPosition(name)).toLatin1().data()); + ca_proplist_sets(proplist, CA_PROP_CANBERRA_FORCE_CHANNEL, name.toLatin1().data()); ca_proplist_sets(proplist, CA_PROP_CANBERRA_ENABLE, "1"); ca_proplist_sets(proplist, CA_PROP_EVENT_ID, sound_name.toLatin1().data()); @@ -163,36 +116,4 @@ ca_proplist_destroy(proplist); } -QString Sink::positionAsString(pa_channel_position_t pos) -{ - switch (pos) { - case PA_CHANNEL_POSITION_FRONT_LEFT: - return QStringLiteral("front-left"); - case PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER: - return QStringLiteral("front-left-of-center"); - case PA_CHANNEL_POSITION_FRONT_CENTER: - return QStringLiteral("front-center"); - case PA_CHANNEL_POSITION_MONO: - return QStringLiteral("mono"); - case PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER: - return QStringLiteral("front-right-of-center"); - case PA_CHANNEL_POSITION_FRONT_RIGHT: - return QStringLiteral("front-right"); - case PA_CHANNEL_POSITION_SIDE_LEFT: - return QStringLiteral("side-left"); - case PA_CHANNEL_POSITION_SIDE_RIGHT: - return QStringLiteral("side-right"); - case PA_CHANNEL_POSITION_REAR_LEFT: - return QStringLiteral("rear-left"); - case PA_CHANNEL_POSITION_REAR_CENTER: - return QStringLiteral("rear-center"); - case PA_CHANNEL_POSITION_REAR_RIGHT: - return QStringLiteral("rear-right"); - case PA_CHANNEL_POSITION_SUBWOOFER: - return QStringLiteral("subwoofer"); - default: - break; - } - return QStringLiteral("invalid"); -} } // QPulseAudio diff --git a/src/volumeobject.h b/src/volumeobject.h --- a/src/volumeobject.h +++ b/src/volumeobject.h @@ -36,6 +36,7 @@ Q_PROPERTY(bool hasVolume READ hasVolume NOTIFY hasVolumeChanged) Q_PROPERTY(bool volumeWritable READ isVolumeWritable NOTIFY isVolumeWritableChanged) Q_PROPERTY(QStringList channels READ channels NOTIFY channelsChanged) + Q_PROPERTY(QStringList rawChannels READ rawChannels NOTIFY rawChannelsChanged) Q_PROPERTY(QList channelVolumes READ channelVolumes NOTIFY channelVolumesChanged) public: explicit VolumeObject(QObject *parent); @@ -63,6 +64,16 @@ m_channels = infoChannels; Q_EMIT channelsChanged(); } + + QStringList infoRawChannels; + infoRawChannels.reserve(info->channel_map.channels); + for (int i = 0; i < info->channel_map.channels; ++i) { + infoRawChannels << QString::fromUtf8(pa_channel_position_to_string(info->channel_map.map[i])); + } + if (m_rawChannels != infoRawChannels) { + m_rawChannels = infoRawChannels; + Q_EMIT rawChannelsChanged(); + } } qint64 volume() const; @@ -75,6 +86,7 @@ bool isVolumeWritable() const; QStringList channels() const; + QStringList rawChannels() const; QList channelVolumes() const; Q_INVOKABLE virtual void setChannelVolume(int channel, qint64 volume) = 0; @@ -84,6 +96,7 @@ void hasVolumeChanged(); void isVolumeWritableChanged(); void channelsChanged(); + void rawChannelsChanged(); void channelVolumesChanged(); protected: @@ -94,6 +107,7 @@ bool m_hasVolume; bool m_volumeWritable; QStringList m_channels; + QStringList m_rawChannels; }; } // QPulseAudio diff --git a/src/volumeobject.cpp b/src/volumeobject.cpp --- a/src/volumeobject.cpp +++ b/src/volumeobject.cpp @@ -66,6 +66,11 @@ return m_channels; } +QStringList VolumeObject::rawChannels() const +{ + return m_rawChannels; +} + QList VolumeObject::channelVolumes() const { QList ret;