feat: automatically fix left over sink/source

This commit is contained in:
Curve 2021-03-01 20:01:23 +01:00
parent ada83ea246
commit db569034ed
No known key found for this signature in database
GPG Key ID: 460F6C466BD35813
2 changed files with 26 additions and 4 deletions

View File

@ -65,6 +65,9 @@ namespace Soundux::Objects
passThroughLoopback.end());
data.passthroughLoopbackMonitorModuleId = std::stoi(passThroughLoopback);
refreshPlaybackStreams(true);
refreshRecordingStreams(true);
static const std::regex sourceRegex(R"rgx((.*#(\d+))$|(Name: (.+)))rgx");
auto sources = exec("LC_ALL=C pactl list sources");
std::smatch match;
@ -185,7 +188,7 @@ namespace Soundux::Objects
}
return true; //* Not having anything to moveback should count as a failure
}
void Pulse::refreshRecordingStreams()
void Pulse::refreshRecordingStreams(const bool &fix)
{
auto sourceList = exec("LC_ALL=C pactl list source-outputs");
@ -208,6 +211,12 @@ namespace Soundux::Objects
if (recordingStreams.find(stream.name) != recordingStreams.end())
{
stream.source = recordingStreams.at(stream.name).source;
if (fix)
{
// NOLINTNEXTLINE
system(("pactl move-source-output " + std::to_string(stream.id) + " " + stream.source)
.c_str());
}
}
recordingStreamMutex.unlock_shared();
fetchedStreams.emplace_back(stream);
@ -252,7 +261,7 @@ namespace Soundux::Objects
recordingStreams.insert({stream.name, stream});
}
}
void Pulse::refreshPlaybackStreams()
void Pulse::refreshPlaybackStreams(const bool &fix)
{
auto sourceList = exec("LC_ALL=C pactl list sink-inputs");
@ -275,6 +284,13 @@ namespace Soundux::Objects
if (playbackStreams.find(stream.name) != playbackStreams.end())
{
stream.sink = playbackStreams.at(stream.name).sink;
if (fix)
{
// NOLINTNEXTLINE
system(("pactl move-sink-input " + std::to_string(stream.id) + " " + stream.sink +
" &>/dev/null")
.c_str());
}
}
playbackStreamMutex.unlock_shared();
fetchedStreams.emplace_back(stream);
@ -393,5 +409,9 @@ namespace Soundux::Objects
{
system("pactl unload-module module-switch-on-connect &>/dev/null"); // NOLINT
}
bool Pulse::currentlyPassingthrough()
{
return currentApplicationPassthrough.has_value();
}
} // namespace Soundux::Objects
#endif

View File

@ -49,6 +49,7 @@ namespace Soundux
};
class Pulse
{
void fixLeftOvers();
void unloadLeftOverModules();
void fetchDefaultPulseSource();
@ -74,12 +75,13 @@ namespace Soundux
bool revertDefaultSourceToOriginal() const;
bool moveApplicationToSinkMonitor(const std::string &);
void refreshRecordingStreams();
void refreshRecordingStreams(const bool &fix = false);
std::vector<PulseRecordingStream> getRecordingStreams();
void refreshPlaybackStreams();
void refreshPlaybackStreams(const bool &fix = false);
std::vector<PulsePlaybackStream> getPlaybackStreams();
bool currentlyPassingthrough();
bool moveBackApplicationFromPassthrough();
std::optional<PulsePlaybackStream> moveApplicationToApplicationPassthrough(const std::string &);
};