Fixed the bug regarding SIM7600 modem family that made USB audio to not turn on.

Added the support for 16kHz sample rate for simtech modems and set it as default if available.
This commit is contained in:
Michał Sułek
2025-02-24 16:18:55 +00:00
parent 46d126f505
commit 31e486d672
+59 -2
View File
@@ -52,6 +52,7 @@ typedef struct {
FeatureSupport cgps_support;
/* voice */
MMIfaceModemVoiceInterface *iface_modem_voice_parent;
FeatureSupport cpcmfrm_support;
FeatureSupport cpcmreg_support;
FeatureSupport clcc_urc_support;
GRegex *clcc_urc_regex;
@@ -86,6 +87,7 @@ get_private (MMSharedSimtech *self)
priv->supported_sources = MM_MODEM_LOCATION_SOURCE_NONE;
priv->enabled_sources = MM_MODEM_LOCATION_SOURCE_NONE;
priv->cgps_support = FEATURE_SUPPORT_UNKNOWN;
priv->cpcmfrm_support = FEATURE_SUPPORT_UNKNOWN;
priv->cpcmreg_support = FEATURE_SUPPORT_UNKNOWN;
priv->clcc_urc_support = FEATURE_SUPPORT_UNKNOWN;
priv->clcc_urc_regex = mm_simtech_get_clcc_urc_regex ();
@@ -1104,6 +1106,9 @@ common_setup_cleanup_in_call_audio_channel (MMSharedSimtech *self,
return;
}
/* Some models (like SIM7600) need to wait a bit before they can accept +CPCMREG */
g_usleep(100000);
mm_base_modem_at_command (MM_BASE_MODEM (self),
setup ? "+CPCMREG=1" : "+CPCMREG=0",
3,
@@ -1139,6 +1144,47 @@ mm_shared_simtech_voice_check_support_finish (MMIfaceModemVoice *self,
return g_task_propagate_boolean (G_TASK (res), error);
}
static void
cpcmfrm_set_ready (MMBaseModem *self,
GAsyncResult *res,
GTask *task)
{
GError *error = NULL;
if (!mm_base_modem_at_command_finish (self, res, &error))
g_task_return_error (task, error);
else {
g_task_return_boolean (task, TRUE);
mm_obj_dbg (self, "USB audio 16k sample rate turned on");
}
g_object_unref (task);
}
static void
cpcmfrm_format_check_and_set_ready (MMBroadbandModem *self,
GAsyncResult *res,
GTask *task)
{
Private *priv;
priv = get_private (MM_SHARED_SIMTECH (self));
priv->cpcmfrm_support = (mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, NULL) ?
FEATURE_SUPPORTED : FEATURE_NOT_SUPPORTED);
if (priv->cpcmfrm_support == FEATURE_SUPPORTED) {
mm_base_modem_at_command (MM_BASE_MODEM (self),
"+CPCMFRM=1",
3,
FALSE,
(GAsyncReadyCallback) cpcmfrm_set_ready,
task);
} else {
g_task_return_boolean (task, TRUE);
g_object_unref (task);
}
}
static void
cpcmreg_format_check_ready (MMBroadbandModem *self,
GAsyncResult *res,
@@ -1152,8 +1198,19 @@ cpcmreg_format_check_ready (MMBroadbandModem *self,
FEATURE_SUPPORTED : FEATURE_NOT_SUPPORTED);
mm_obj_dbg (self, "modem %s USB audio control", (priv->cpcmreg_support == FEATURE_SUPPORTED) ? "supports" : "doesn't support");
g_task_return_boolean (task, TRUE);
g_object_unref (task);
/* If USB Audio not supported, we won't check and set its formats */
if(priv->cpcmreg_support == FEATURE_SUPPORTED) {
mm_base_modem_at_command (MM_BASE_MODEM (self),
"+CPCMFRM=?",
3,
TRUE,
(GAsyncReadyCallback) cpcmfrm_format_check_and_set_ready,
task);
} else {
priv->cpcmfrm_support = FEATURE_NOT_SUPPORTED;
g_task_return_boolean (task, TRUE);
g_object_unref (task);
}
}
static void