@@ -138,8 +138,8 @@
typedef bool (*virtual_profile_event_cb)(struct userdata *u, pa_droid_profile *p, bool enabling);
struct virtual_profile {
+ bool enabled;
pa_card_profile *parent;
- pa_card_profile *extension;
virtual_profile_event_cb event_cb;
};
@@ -156,14 +156,15 @@
pa_droid_hw_module *hw_module;
pa_droid_card_data card_data;
- pa_droid_profile *old_profile;
+ pa_card_profile *real_profile;
pa_modargs *modargs;
pa_card *card;
};
struct profile_data {
- pa_droid_profile *profile;
+ pa_droid_profile *droid_profile;
+ pa_card_profile *card_profile;
audio_mode_t mode;
bool virtual_profile;
/* Variables for virtual profiles: */
@@ -177,10 +178,12 @@
#define AUDIO_PARAMETER_KEY_CALL_STATE "call_state"
/* From hal/voice_extn/voice_extn.c */
-#define VOICE2_VSID 0x10DC1000
-#define VOLTE_VSID 0x10C02000
-#define QCHAT_VSID 0x10803000
-#define VOWLAN_VSID 0x10002000
+#define VOICE2_VSID (0x10DC1000)
+#define VOLTE_VSID (0x10C02000)
+#define QCHAT_VSID (0x10803000)
+#define VOWLAN_VSID (0x10002000)
+#define VOICEMMODE1_VSID (0x11C05000)
+#define VOICEMMODE2_VSID (0x11DC5000)
/* From hal/voice.h */
#define BASE_CALL_STATE 1
@@ -189,22 +192,28 @@
#define VOICE_VSID 0x10C01000
/* For virtual profiles */
-#define VOICE_SESSION_VOICE1_PROFILE_NAME "voicecall-voice1"
-#define VOICE_SESSION_VOICE1_PROFILE_DESC "Call mode, default to voice 1 vsid"
-#define VOICE_SESSION_VOICE2_PROFILE_NAME "voicecall-voice2"
-#define VOICE_SESSION_VOICE2_PROFILE_DESC "Call mode, default to voice 2 vsid"
-#define VOICE_SESSION_VOLTE_PROFILE_NAME "voicecall-volte"
-#define VOICE_SESSION_VOLTE_PROFILE_DESC "Call mode, default to volte vsid"
-#define VOICE_SESSION_QCHAT_PROFILE_NAME "voicecall-qchat"
-#define VOICE_SESSION_QCHAT_PROFILE_DESC "Call mode, default to qchat vsid"
-#define VOICE_SESSION_VOWLAN_PROFILE_NAME "voicecall-vowlan"
-#define VOICE_SESSION_VOWLAN_PROFILE_DESC "Call mode, default to vowlan vsid"
+#define VOICE_SESSION_VOICE1_PROFILE_NAME "voicecall-voice1"
+#define VOICE_SESSION_VOICE1_PROFILE_DESC "Call mode, default to voice 1 vsid"
+#define VOICE_SESSION_VOICE2_PROFILE_NAME "voicecall-voice2"
+#define VOICE_SESSION_VOICE2_PROFILE_DESC "Call mode, default to voice 2 vsid"
+#define VOICE_SESSION_VOLTE_PROFILE_NAME "voicecall-volte"
+#define VOICE_SESSION_VOLTE_PROFILE_DESC "Call mode, default to volte vsid"
+#define VOICE_SESSION_QCHAT_PROFILE_NAME "voicecall-qchat"
+#define VOICE_SESSION_QCHAT_PROFILE_DESC "Call mode, default to qchat vsid"
+#define VOICE_SESSION_VOWLAN_PROFILE_NAME "voicecall-vowlan"
+#define VOICE_SESSION_VOWLAN_PROFILE_DESC "Call mode, default to vowlan vsid"
+#define VOICE_SESSION_VOICEMMODE1_PROFILE_NAME "voicecall-voicemmode1"
+#define VOICE_SESSION_VOICEMMODE1_PROFILE_DESC "Call mode, default to voicemmode1 vsid"
+#define VOICE_SESSION_VOICEMMODE2_PROFILE_NAME "voicecall-voicemmode2"
+#define VOICE_SESSION_VOICEMMODE2_PROFILE_DESC "Call mode, default to voicemmode2 vsid"
static bool voicecall_voice1_vsid_profile_event_cb(struct userdata *u, pa_droid_profile *p, bool enabling);
static bool voicecall_voice2_vsid_profile_event_cb(struct userdata *u, pa_droid_profile *p, bool enabling);
static bool voicecall_volte_vsid_profile_event_cb(struct userdata *u, pa_droid_profile *p, bool enabling);
static bool voicecall_qchat_vsid_profile_event_cb(struct userdata *u, pa_droid_profile *p, bool enabling);
static bool voicecall_vowlan_vsid_profile_event_cb(struct userdata *u, pa_droid_profile *p, bool enabling);
+static bool voicecall_voicemmode1_vsid_profile_event_cb(struct userdata *u, pa_droid_profile *p, bool enabling);
+static bool voicecall_voicemmode2_vsid_profile_event_cb(struct userdata *u, pa_droid_profile *p, bool enabling);
#endif /* DROID_AUDIO_HAL_USE_VSID */
@@ -216,7 +225,8 @@
cp->available = PA_AVAILABLE_YES;
d = PA_CARD_PROFILE_DATA(cp);
- d->profile = NULL;
+ d->droid_profile = NULL;
+ d->card_profile = cp;
pa_hashmap_put(profiles, cp->name, cp);
}
@@ -246,17 +256,12 @@
cp = pa_card_profile_new(ap->name, ap->description, sizeof(struct profile_data));
cp->available = available;
d = PA_CARD_PROFILE_DATA(cp);
- d->profile = ap;
+ d->droid_profile = ap;
+ d->card_profile = cp;
d->virtual_profile = true;
d->mode = audio_mode;
d->virtual.event_cb = event_cb;
- d->virtual.extension = NULL;
- if (extension_to) {
- ext = PA_CARD_PROFILE_DATA(extension_to);
- ext->virtual.extension = cp;
- d->virtual.parent = extension_to;
- } else
- d->virtual.parent = NULL;
+ d->virtual.parent = extension_to;
pa_hashmap_put(profiles, cp->name, cp);
@@ -330,7 +335,8 @@
cp->max_source_channels = max_channels;
d = PA_CARD_PROFILE_DATA(cp);
- d->profile = ap;
+ d->droid_profile = ap;
+ d->card_profile = cp;
d->virtual_profile = false;
d->mode = AUDIO_MODE_NORMAL;
@@ -361,14 +367,14 @@
d = PA_CARD_PROFILE_DATA(u->card->active_profile);
- if (d->profile && pa_idxset_size(d->profile->output_mappings) > 0) {
- PA_IDXSET_FOREACH(am, d->profile->output_mappings, idx) {
+ if (d->droid_profile && pa_idxset_size(d->droid_profile->output_mappings) > 0) {
+ PA_IDXSET_FOREACH(am, d->droid_profile->output_mappings, idx) {
am->sink = pa_droid_sink_new(u->module, u->modargs, __FILE__, &u->card_data, 0, am, u->card);
}
}
- if (d->profile && pa_idxset_size(d->profile->input_mappings) > 0) {
- PA_IDXSET_FOREACH(am, d->profile->input_mappings, idx) {
+ if (d->droid_profile && pa_idxset_size(d->droid_profile->input_mappings) > 0) {
+ PA_IDXSET_FOREACH(am, d->droid_profile->input_mappings, idx) {
am->source = pa_droid_source_new(u->module, u->modargs, __FILE__, (audio_devices_t) 0, &u->card_data, am, u->card);
}
}
@@ -430,38 +436,39 @@
};
}
+static pa_droid_profile *card_get_droid_profile(pa_card_profile *cp) {
+ struct profile_data *pd;
+
+ pa_assert(cp);
+
+ pd = PA_CARD_PROFILE_DATA(cp);
+ return pd->droid_profile;
+}
+
static bool voicecall_profile_event_cb(struct userdata *u, pa_droid_profile *p, bool enabling) {
+ pa_droid_profile *dp = NULL;
pa_card_profile *cp = NULL;
pa_droid_mapping *am_output;
pa_assert(u);
pa_assert(p);
- pa_assert(u->old_profile);
+ pa_assert(u->real_profile);
- if (!(am_output = pa_droid_idxset_get_primary(u->old_profile->output_mappings))) {
+ dp = card_get_droid_profile(u->real_profile);
+ if (!(am_output = pa_droid_idxset_get_primary(dp->output_mappings))) {
pa_log("Active profile doesn't have primary output device.");
return false;
}
- if (pa_droid_idxset_mapping_with_device(u->old_profile->input_mappings,
- AUDIO_DEVICE_IN_VOICE_CALL))
- cp = pa_hashmap_get(u->card->profiles, VOICE_RECORD_PROFILE_NAME);
-
/* call mode specialities */
if (enabling) {
pa_droid_sink_set_voice_control(am_output->sink, true);
- if (cp && cp->available == PA_AVAILABLE_NO) {
- pa_log_debug("Enable " VOICE_RECORD_PROFILE_NAME " profile.");
- pa_card_profile_set_available(cp, PA_AVAILABLE_YES);
- }
+
if (pa_droid_quirk(u->hw_module, QUIRK_REALCALL))
pa_droid_set_parameters(u->hw_module, VENDOR_EXT_REALCALL_ON);
} else {
pa_droid_sink_set_voice_control(am_output->sink, false);
- if (cp && cp->available == PA_AVAILABLE_YES) {
- pa_log_debug("Disable " VOICE_RECORD_PROFILE_NAME " profile.");
- pa_card_profile_set_available(cp, PA_AVAILABLE_NO);
- }
+
if (pa_droid_quirk(u->hw_module, QUIRK_REALCALL))
pa_droid_set_parameters(u->hw_module, VENDOR_EXT_REALCALL_OFF);
}
@@ -474,8 +481,6 @@
{
|