mirror of
https://github.com/polybar/polybar.git
synced 2024-11-11 13:50:56 -05:00
fix(pulseaudio): prevent nonresponsiveness and remove redundant getters
This commit is contained in:
parent
1f35b9dc89
commit
10656a94cb
3 changed files with 15 additions and 30 deletions
|
@ -45,6 +45,7 @@ class pulseaudio {
|
||||||
bool is_muted();
|
bool is_muted();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void update_volume(pa_operation *o);
|
||||||
static void check_mute_callback(pa_context *context, const pa_sink_info *info, int eol, void *userdata);
|
static void check_mute_callback(pa_context *context, const pa_sink_info *info, int eol, void *userdata);
|
||||||
static void get_sink_volume_callback(pa_context *context, const pa_sink_info *info, int is_last, void *userdata);
|
static void get_sink_volume_callback(pa_context *context, const pa_sink_info *info, int is_last, void *userdata);
|
||||||
static void subscribe_callback(pa_context* context, pa_subscription_event_type_t t, uint32_t idx, void* userdata);
|
static void subscribe_callback(pa_context* context, pa_subscription_event_type_t t, uint32_t idx, void* userdata);
|
||||||
|
|
|
@ -78,6 +78,8 @@ pulseaudio::pulseaudio(const logger& logger, string&& sink_name) : m_log(logger)
|
||||||
throw pulseaudio_error("Failed to subscribe to server.");
|
throw pulseaudio_error("Failed to subscribe to server.");
|
||||||
pa_context_set_subscribe_callback(m_context, subscribe_callback, this);
|
pa_context_set_subscribe_callback(m_context, subscribe_callback, this);
|
||||||
|
|
||||||
|
update_volume(op);
|
||||||
|
|
||||||
pa_threaded_mainloop_unlock(m_mainloop);
|
pa_threaded_mainloop_unlock(m_mainloop);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -125,12 +127,6 @@ int pulseaudio::process_events() {
|
||||||
wait_loop(o, m_mainloop);
|
wait_loop(o, m_mainloop);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
// get volume
|
|
||||||
case evtype::CHANGE:
|
|
||||||
// doesn't do anything
|
|
||||||
o = pa_context_get_sink_info_by_index(m_context, m_index, get_sink_volume_callback, this);
|
|
||||||
wait_loop(o, m_mainloop);
|
|
||||||
break;
|
|
||||||
// get default sink
|
// get default sink
|
||||||
case evtype::REMOVE:
|
case evtype::REMOVE:
|
||||||
o = pa_context_get_server_info(m_context, get_default_sink_callback, this);
|
o = pa_context_get_server_info(m_context, get_default_sink_callback, this);
|
||||||
|
@ -141,7 +137,10 @@ int pulseaudio::process_events() {
|
||||||
wait_loop(o, m_mainloop);
|
wait_loop(o, m_mainloop);
|
||||||
m_log.warn("pulseaudio: using default sink %s", s_name);
|
m_log.warn("pulseaudio: using default sink %s", s_name);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
update_volume(o);
|
||||||
m_events.pop();
|
m_events.pop();
|
||||||
}
|
}
|
||||||
pa_threaded_mainloop_unlock(m_mainloop);
|
pa_threaded_mainloop_unlock(m_mainloop);
|
||||||
|
@ -152,10 +151,6 @@ int pulseaudio::process_events() {
|
||||||
* Get volume in percentage
|
* Get volume in percentage
|
||||||
*/
|
*/
|
||||||
int pulseaudio::get_volume() {
|
int pulseaudio::get_volume() {
|
||||||
pa_threaded_mainloop_lock(m_mainloop);
|
|
||||||
pa_operation *op = pa_context_get_sink_info_by_index(m_context, m_index, get_sink_volume_callback, this);
|
|
||||||
wait_loop(op, m_mainloop);
|
|
||||||
pa_threaded_mainloop_unlock(m_mainloop);
|
|
||||||
// alternatively, user pa_cvolume_avg_mask() to average selected channels
|
// alternatively, user pa_cvolume_avg_mask() to average selected channels
|
||||||
return static_cast<int>(pa_cvolume_max(&cv) * 100.0f / PA_VOLUME_NORM + 0.5f);
|
return static_cast<int>(pa_cvolume_max(&cv) * 100.0f / PA_VOLUME_NORM + 0.5f);
|
||||||
}
|
}
|
||||||
|
@ -165,11 +160,9 @@ int pulseaudio::get_volume() {
|
||||||
*/
|
*/
|
||||||
void pulseaudio::set_volume(float percentage) {
|
void pulseaudio::set_volume(float percentage) {
|
||||||
pa_threaded_mainloop_lock(m_mainloop);
|
pa_threaded_mainloop_lock(m_mainloop);
|
||||||
pa_operation *op = pa_context_get_sink_info_by_index(m_context, m_index, get_sink_volume_callback, this);
|
|
||||||
wait_loop(op, m_mainloop);
|
|
||||||
pa_volume_t vol = math_util::percentage_to_value<pa_volume_t>(percentage, PA_VOLUME_MUTED, PA_VOLUME_NORM);
|
pa_volume_t vol = math_util::percentage_to_value<pa_volume_t>(percentage, PA_VOLUME_MUTED, PA_VOLUME_NORM);
|
||||||
pa_cvolume_scale(&cv, vol);
|
pa_cvolume_scale(&cv, vol);
|
||||||
op = pa_context_set_sink_volume_by_index(m_context, m_index, &cv, simple_callback, this);
|
pa_operation *op = pa_context_set_sink_volume_by_index(m_context, m_index, &cv, simple_callback, this);
|
||||||
wait_loop(op, m_mainloop);
|
wait_loop(op, m_mainloop);
|
||||||
if (!success)
|
if (!success)
|
||||||
throw pulseaudio_error("Failed to set sink volume.");
|
throw pulseaudio_error("Failed to set sink volume.");
|
||||||
|
@ -181,8 +174,6 @@ void pulseaudio::set_volume(float percentage) {
|
||||||
*/
|
*/
|
||||||
void pulseaudio::inc_volume(int delta_perc) {
|
void pulseaudio::inc_volume(int delta_perc) {
|
||||||
pa_threaded_mainloop_lock(m_mainloop);
|
pa_threaded_mainloop_lock(m_mainloop);
|
||||||
pa_operation *op = pa_context_get_sink_info_by_index(m_context, m_index, get_sink_volume_callback, this);
|
|
||||||
wait_loop(op, m_mainloop);
|
|
||||||
pa_volume_t vol = math_util::percentage_to_value<pa_volume_t>(abs(delta_perc), PA_VOLUME_NORM);
|
pa_volume_t vol = math_util::percentage_to_value<pa_volume_t>(abs(delta_perc), PA_VOLUME_NORM);
|
||||||
if (delta_perc > 0) {
|
if (delta_perc > 0) {
|
||||||
if (pa_cvolume_max(&cv) + vol <= PA_VOLUME_UI_MAX) {
|
if (pa_cvolume_max(&cv) + vol <= PA_VOLUME_UI_MAX) {
|
||||||
|
@ -192,7 +183,7 @@ void pulseaudio::inc_volume(int delta_perc) {
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
pa_cvolume_dec(&cv, vol);
|
pa_cvolume_dec(&cv, vol);
|
||||||
op = pa_context_set_sink_volume_by_index(m_context, m_index, &cv, simple_callback, this);
|
pa_operation *op = pa_context_set_sink_volume_by_index(m_context, m_index, &cv, simple_callback, this);
|
||||||
wait_loop(op, m_mainloop);
|
wait_loop(op, m_mainloop);
|
||||||
if (!success)
|
if (!success)
|
||||||
throw pulseaudio_error("Failed to set sink volume.");
|
throw pulseaudio_error("Failed to set sink volume.");
|
||||||
|
@ -222,21 +213,15 @@ void pulseaudio::toggle_mute() {
|
||||||
* Get current mute state
|
* Get current mute state
|
||||||
*/
|
*/
|
||||||
bool pulseaudio::is_muted() {
|
bool pulseaudio::is_muted() {
|
||||||
pa_threaded_mainloop_lock(m_mainloop);
|
|
||||||
pa_operation *op = pa_context_get_sink_info_by_index(m_context, m_index, check_mute_callback, this);
|
|
||||||
wait_loop(op, m_mainloop);
|
|
||||||
pa_threaded_mainloop_unlock(m_mainloop);
|
|
||||||
return muted;
|
return muted;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback when getting current mute state
|
* Update local volume cache
|
||||||
*/
|
*/
|
||||||
void pulseaudio::check_mute_callback(pa_context *, const pa_sink_info *info, int, void *userdata) {
|
void pulseaudio::update_volume(pa_operation *o) {
|
||||||
pulseaudio* This = static_cast<pulseaudio *>(userdata);
|
o = pa_context_get_sink_info_by_index(m_context, m_index, get_sink_volume_callback, this);
|
||||||
if (info)
|
wait_loop(o, m_mainloop);
|
||||||
This->muted = info->mute;
|
|
||||||
pa_threaded_mainloop_signal(This->m_mainloop, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -244,8 +229,10 @@ void pulseaudio::check_mute_callback(pa_context *, const pa_sink_info *info, int
|
||||||
*/
|
*/
|
||||||
void pulseaudio::get_sink_volume_callback(pa_context *, const pa_sink_info *info, int, void *userdata) {
|
void pulseaudio::get_sink_volume_callback(pa_context *, const pa_sink_info *info, int, void *userdata) {
|
||||||
pulseaudio* This = static_cast<pulseaudio *>(userdata);
|
pulseaudio* This = static_cast<pulseaudio *>(userdata);
|
||||||
if (info)
|
if (info) {
|
||||||
This->cv = info->volume;
|
This->cv = info->volume;
|
||||||
|
This->muted = info->mute;
|
||||||
|
}
|
||||||
pa_threaded_mainloop_signal(This->m_mainloop, 0);
|
pa_threaded_mainloop_signal(This->m_mainloop, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -142,9 +142,6 @@ namespace modules {
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (m_pulseaudio->wait()) {
|
|
||||||
m_pulseaudio->process_events();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (const exception& err) {
|
} catch (const exception& err) {
|
||||||
m_log.err("%s: Failed to handle command (%s)", name(), err.what());
|
m_log.err("%s: Failed to handle command (%s)", name(), err.what());
|
||||||
|
|
Loading…
Reference in a new issue