gboolean device_is_connected(struct audio_device *dev, const char *interface) { #ifndef BT_ALT_STACK if (!interface) { if ((dev->sink || dev->source) && avdtp_is_connected(&dev->src, &dev->dst)) return TRUE; if (dev->headset && headset_is_active(dev)) return TRUE; } else if (!strcmp(interface, AUDIO_SINK_INTERFACE) && dev->sink && avdtp_is_connected(&dev->src, &dev->dst)) return TRUE; else if (!strcmp(interface, AUDIO_SOURCE_INTERFACE) && dev->source && avdtp_is_connected(&dev->src, &dev->dst)) return TRUE; else if (!strcmp(interface, AUDIO_HEADSET_INTERFACE) && dev->headset && headset_is_active(dev)) return TRUE; else if (!strcmp(interface, AUDIO_CONTROL_INTERFACE) && dev->headset && control_is_active(dev)) return TRUE; #endif return FALSE; }
gboolean audio_device_is_active(struct audio_device *dev, const char *interface) { if (!interface) { if ((dev->sink || dev->source) && avdtp_is_connected(&dev->src, &dev->dst)) return TRUE; if (dev->headset && headset_is_active(dev)) return TRUE; } else if (!strcmp(interface, AUDIO_SINK_INTERFACE) && dev->sink && avdtp_is_connected(&dev->src, &dev->dst)) return TRUE; else if (!strcmp(interface, AUDIO_SOURCE_INTERFACE) && dev->source && avdtp_is_connected(&dev->src, &dev->dst)) return TRUE; else if (!strcmp(interface, AUDIO_HEADSET_INTERFACE) && dev->headset && headset_is_active(dev)) return TRUE; else if (!strcmp(interface, AUDIO_CONTROL_INTERFACE) && dev->control && control_is_active(dev)) return TRUE; else if (!strcmp(interface, AUDIO_GATEWAY_INTERFACE) && dev->gateway && gateway_is_connected(dev)) return TRUE; return FALSE; }
static uint8_t headset_generate_capability(struct audio_device *dev, codec_capabilities_t *codec) { pcm_capabilities_t *pcm; codec->seid = BT_A2DP_SEID_RANGE + 1; codec->transport = BT_CAPABILITIES_TRANSPORT_SCO; codec->type = BT_HFP_CODEC_PCM; codec->length = sizeof(*pcm); pcm = (void *) codec; pcm->sampling_rate = 8000; if (dev->headset) { if (headset_get_nrec(dev)) pcm->flags |= BT_PCM_FLAG_NREC; if (!headset_get_sco_hci(dev)) pcm->flags |= BT_PCM_FLAG_PCM_ROUTING; codec->configured = headset_is_active(dev); codec->lock = headset_get_lock(dev); } else { pcm->flags |= BT_PCM_FLAG_NREC; codec->configured = TRUE; codec->lock = 0; } return codec->length; }
static service_type_t select_service(struct audio_device *dev, const char *interface) { if (!interface) { if (dev->sink && avdtp_is_connected(&dev->src, &dev->dst)) return TYPE_SINK; else if (dev->source && avdtp_is_connected(&dev->src, &dev->dst)) return TYPE_SOURCE; else if (dev->headset && headset_is_active(dev)) return TYPE_HEADSET; else if (dev->sink) return TYPE_SINK; else if (dev->source) return TYPE_SOURCE; else if (dev->headset) return TYPE_HEADSET; } else if (!strcmp(interface, AUDIO_SOURCE_INTERFACE) && dev->source) return TYPE_SOURCE; else if (!strcmp(interface, AUDIO_SINK_INTERFACE) && dev->sink) return TYPE_SINK; else if (!strcmp(interface, AUDIO_HEADSET_INTERFACE) && dev->headset) return TYPE_HEADSET; else if (!strcmp(interface, AUDIO_GATEWAY_INTERFACE) && dev->gateway) return TYPE_GATEWAY; return TYPE_NONE; }
uint8_t device_get_state(struct audio_device *dev) { avdtp_state_t sink_state; headset_state_t hs_state; if (dev->sink && sink_is_active(dev)) { sink_state = sink_get_state(dev); return avdtp_to_ipc_state(sink_state); } else if (dev->headset && headset_is_active(dev)) { hs_state = headset_get_state(dev); return hs_to_ipc_state(hs_state); } else if (dev->control && control_is_active(dev)) return STATE_CONNECTED; return STATE_DISCONNECTED; }