aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichał Sułek <maldiran@maldiran.com>2025-02-21 16:55:43 +0100
committerMichał Sułek <maldiran@maldiran.com>2025-02-24 16:18:55 +0000
commit31e486d672e7fef16066b5fda7566c734c0f6ce5 (patch)
tree45b5fae8f1ec146754aeeeae21e93a5ffe590b37 /src
parent46d126f5055da6efaa63fb83d9e44eeecc5f1469 (diff)
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.
Diffstat (limited to 'src')
-rw-r--r--src/plugins/simtech/mm-shared-simtech.c61
1 files changed, 59 insertions, 2 deletions
diff --git a/src/plugins/simtech/mm-shared-simtech.c b/src/plugins/simtech/mm-shared-simtech.c
index af89f4e0..673fdd62 100644
--- a/src/plugins/simtech/mm-shared-simtech.c
+++ b/src/plugins/simtech/mm-shared-simtech.c
@@ -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,
@@ -1140,6 +1145,47 @@ mm_shared_simtech_voice_check_support_finish (MMIfaceModemVoice *self,
}
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,
GTask *task)
@@ -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