static pa_hook_result_t sink_source_state_changed_hook_cb(pa_core *c, pa_object *pdevice, pa_device_manager *dm) {
pa_tz_device *device;
- bool use_internal_codec = false;
uint32_t idx = 0;
pa_assert(c);
pa_sink *s = PA_SINK(pdevice);
pa_sink_state_t state = pa_sink_get_state(s);
pa_log_debug("=========== Sink(%p,%s) state has been changed to [%d](0:RUNNING, 1:IDLE, 2:SUSPEND) ==========", s, s->name, state);
- if (s->use_internal_codec) {
- if (state == PA_SINK_SUSPENDED) {
- PA_IDXSET_FOREACH(device, dm->device_list, idx) {
- use_internal_codec = pa_tz_device_is_use_internal_codec(device);
- if (use_internal_codec)
- pa_tz_device_set_state(device, DM_DEVICE_DIRECTION_OUT, DM_DEVICE_STATE_DEACTIVATED);
- }
+ if (s->use_internal_codec && state == PA_SINK_SUSPENDED) {
+ PA_IDXSET_FOREACH(device, dm->device_list, idx) {
+ if (pa_tz_device_is_use_internal_codec(device) && pa_tz_device_is_all_suspended(device))
+ pa_tz_device_set_state(device, DM_DEVICE_DIRECTION_OUT, DM_DEVICE_STATE_DEACTIVATED);
}
} else {
if ((device = pa_device_manager_get_device_with_sink(s))) {
pa_source *s = PA_SOURCE(pdevice);
pa_source_state_t state = pa_source_get_state(s);
pa_log_debug("=========== Source(%p,%s) state has been changed to [%d](0:RUNNING, 1:IDLE, 2:SUSPEND) ==========", s, s->name, state);
- if (s->use_internal_codec) {
- if (state == PA_SOURCE_SUSPENDED) {
- PA_IDXSET_FOREACH(device, dm->device_list, idx) {
- use_internal_codec = pa_tz_device_is_use_internal_codec(device);
- if (use_internal_codec)
- pa_tz_device_set_state(device, DM_DEVICE_DIRECTION_IN, DM_DEVICE_STATE_DEACTIVATED);
- }
+ if (s->use_internal_codec && state == PA_SOURCE_SUSPENDED) {
+ PA_IDXSET_FOREACH(device, dm->device_list, idx) {
+ if (pa_tz_device_is_use_internal_codec(device) && pa_tz_device_is_all_suspended(device))
+ pa_tz_device_set_state(device, DM_DEVICE_DIRECTION_IN, DM_DEVICE_STATE_DEACTIVATED);
}
} else {
if ((device = pa_device_manager_get_device_with_source(s))) {
return device->use_internal_codec;
}
+bool pa_tz_device_is_all_suspended(pa_tz_device *device) {
+ pa_sink *sink;
+ pa_source *source;
+ void *state1 = NULL, *state2 = NULL;
+
+ PA_HASHMAP_FOREACH(sink, device->playback_devices, state1) {
+ if (pa_sink_get_state(sink) != PA_SINK_SUSPENDED)
+ return false;
+ }
+
+ PA_HASHMAP_FOREACH(source, device->capture_devices, state2) {
+ if (pa_source_get_state(source) != PA_SOURCE_SUSPENDED)
+ return false;
+ }
+
+ return true;
+}
+
static int method_call_bt_sco(pa_dbus_connection *conn, bool onoff) {
DBusMessage *msg, *reply;
DBusError err;