From 31e486d672e7fef16066b5fda7566c734c0f6ce5 Mon Sep 17 00:00:00 2001 From: Michał Sułek Date: Fri, 21 Feb 2025 16:55:43 +0100 Subject: 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. --- src/plugins/simtech/mm-shared-simtech.c | 61 +++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 2 deletions(-) (limited to 'src/plugins/simtech/mm-shared-simtech.c') 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, @@ -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 -- cgit v1.2.3-70-g09d2