aboutsummaryrefslogtreecommitdiffstats
path: root/pulse.cc
diff options
context:
space:
mode:
authorDave Reisner <dreisner@archlinux.org>2013-01-02 15:27:14 -0500
committerDave Reisner <dreisner@archlinux.org>2013-01-02 15:27:14 -0500
commit4292241040661f4b9b042b24d2f0773de0eb1366 (patch)
treebb251a4c06b5590b06076e10f4d439d1aefa7821 /pulse.cc
parente35ce0069094c135ed9065f2bda945fdf4b6d83e (diff)
downloadmirror-ponymix-4292241040661f4b9b042b24d2f0773de0eb1366.tar.gz
mirror-ponymix-4292241040661f4b9b042b24d2f0773de0eb1366.tar.bz2
mirror-ponymix-4292241040661f4b9b042b24d2f0773de0eb1366.zip
Derive the card from the targetted device
Unless explicitly specified, target a card based on the selected device. Note that not all devices will be tied to a card. falconindy » put differently, if i have multiple cards, what determines which card is used by pulse for a given app? tanuk » In theory, the logic can be anything (it depends on what policy-implementing modules are loaded). By default, routing is mostly handled by module-stream-restore, which chooses the sink based on the user's previous routing choices. tanuk » If the user hasn't done any routing choices, the fallback logic is to select the current "default sink". tanuk » I don't recommend trying to guess the routing policy. falconindy » i guess my understanding of pulse internals is lacking falconindy » but that's rather enlightening falconindy » is there any way to figure out the connection between a sink and a card? tanuk » Yes... (One moment, I'll look up things.) falconindy » ah. uint32_t card falconindy » appears to be in pa_sink_info falconindy » so that ties the sink to the index of a card? tanuk » Yep. falconindy » awesome, that's good enough for what i need to do tanuk » Not all sinks are part of a card, though, but those that are will have the card index set. falconindy » also good to know
Diffstat (limited to 'pulse.cc')
-rw-r--r--pulse.cc62
1 files changed, 58 insertions, 4 deletions
diff --git a/pulse.cc b/pulse.cc
index e42db12..b765d64 100644
--- a/pulse.cc
+++ b/pulse.cc
@@ -10,6 +10,7 @@
// C++
#include <string>
#include <algorithm>
+#include <stdexcept>
// External
#include <pulse/pulseaudio.h>
@@ -155,6 +156,13 @@ Card* PulseClient::GetCard(const string& name) {
return nullptr;
}
+Card* PulseClient::GetCard(const Device& device) {
+ for (Card& card : cards_) {
+ if (device.card_idx_ == card.index_) return &card;
+ }
+ return nullptr;
+}
+
Device* PulseClient::get_device(vector<Device>& devices, const uint32_t& index) {
for (Device& device : devices) {
if (device.index_ == index) return &device;
@@ -172,6 +180,48 @@ Device* PulseClient::get_device(vector<Device>& devices, const string& name) {
return nullptr;
}
+Device* PulseClient::GetDevice(const uint32_t& index, enum DeviceType type) {
+ switch (type) {
+ case DEVTYPE_SINK:
+ return GetSink(index);
+ case DEVTYPE_SOURCE:
+ return GetSource(index);
+ case DEVTYPE_SINK_INPUT:
+ return GetSinkInput(index);
+ case DEVTYPE_SOURCE_OUTPUT:
+ return GetSourceOutput(index);
+ }
+ throw std::runtime_error("Impossible DeviceType encountered in GetDevice");
+}
+
+Device* PulseClient::GetDevice(const string& name, enum DeviceType type) {
+ switch (type) {
+ case DEVTYPE_SINK:
+ return GetSink(name);
+ case DEVTYPE_SOURCE:
+ return GetSource(name);
+ case DEVTYPE_SINK_INPUT:
+ return GetSinkInput(name);
+ case DEVTYPE_SOURCE_OUTPUT:
+ return GetSourceOutput(name);
+ }
+ throw std::runtime_error("Impossible DeviceType encountered in GetDevice");
+}
+
+const vector<Device>& PulseClient::GetDevices(enum DeviceType type) const {
+ switch (type) {
+ case DEVTYPE_SINK:
+ return GetSinks();
+ case DEVTYPE_SOURCE:
+ return GetSources();
+ case DEVTYPE_SINK_INPUT:
+ return GetSinkInputs();
+ case DEVTYPE_SOURCE_OUTPUT:
+ return GetSourceOutputs();
+ }
+ throw std::runtime_error("Impossible DeviceType encountered in GetDevices");
+}
+
Device* PulseClient::GetSink(const uint32_t& index) {
return get_device(sinks_, index);
}
@@ -495,7 +545,8 @@ Device::Device(const pa_sink_info* info) :
index_(info->index),
name_(info->name ? info->name : ""),
desc_(info->description),
- mute_(info->mute) {
+ mute_(info->mute),
+ card_idx_(info->card) {
update_volume(info->volume);
memcpy(&channels_, &info->channel_map, sizeof(pa_channel_map));
balance_ = pa_cvolume_get_balance(&volume_, &channels_) * 100.0;
@@ -510,7 +561,8 @@ Device::Device(const pa_source_info* info) :
index_(info->index),
name_(info->name ? info->name : ""),
desc_(info->description),
- mute_(info->mute) {
+ mute_(info->mute),
+ card_idx_(info->card) {
update_volume(info->volume);
memcpy(&channels_, &info->channel_map, sizeof(pa_channel_map));
balance_ = pa_cvolume_get_balance(&volume_, &channels_) * 100.0;
@@ -524,7 +576,8 @@ Device::Device(const pa_sink_input_info* info) :
type_(DEVTYPE_SINK_INPUT),
index_(info->index),
name_(info->name ? info->name : ""),
- mute_(info->mute) {
+ mute_(info->mute),
+ card_idx_(-1) {
update_volume(info->volume);
memcpy(&channels_, &info->channel_map, sizeof(pa_channel_map));
balance_ = pa_cvolume_get_balance(&volume_, &channels_) * 100.0;
@@ -543,7 +596,8 @@ Device::Device(const pa_source_output_info* info) :
type_(DEVTYPE_SOURCE_OUTPUT),
index_(info->index),
name_(info->name ? info->name : ""),
- mute_(info->mute) {
+ mute_(info->mute),
+ card_idx_(-1) {
update_volume(info->volume);
volume_percent_ = volume_as_percent(&volume_);
balance_ = pa_cvolume_get_balance(&volume_, &channels_) * 100.0;