From 31e486d672e7fef16066b5fda7566c734c0f6ce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Su=C5=82ek?= Date: Fri, 21 Feb 2025 16:55:43 +0100 Subject: [PATCH 1/5] 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(-) 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 From 9477469db40efa5f180fa058b2651b302aaa4e26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Su=C5=82ek?= Date: Sat, 22 Feb 2025 11:12:40 +0100 Subject: [PATCH 2/5] Dan Williams changed g_usleep to g_timeout_add --- src/plugins/simtech/mm-shared-simtech.c | 40 ++++++++++++++++++------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/src/plugins/simtech/mm-shared-simtech.c b/src/plugins/simtech/mm-shared-simtech.c index 673fdd62..42b4e346 100644 --- a/src/plugins/simtech/mm-shared-simtech.c +++ b/src/plugins/simtech/mm-shared-simtech.c @@ -1086,18 +1086,43 @@ cpcmreg_set_ready (MMBaseModem *self, g_object_unref (task); } +static gboolean +call_audio_channel_set (gpointer user_data) +{ + GTask *task; + MMBaseModem *modem; + + task = G_TASK (user_data); + if (g_task_return_error_if_cancelled (task)) { + g_object_unref (task); + return G_SOURCE_REMOVE; + } + + modem = g_task_get_source_object (task); + mm_base_modem_at_command (modem, + setup ? "+CPCMREG=1" : "+CPCMREG=0", + 3, + FALSE, + (GAsyncReadyCallback) cpcmreg_set_ready, + task); + return G_SOURCE_REMOVE; +} + + static void common_setup_cleanup_in_call_audio_channel (MMSharedSimtech *self, gboolean setup, GAsyncReadyCallback callback, gpointer user_data) { - GTask *task; - Private *priv; + GTask *task; + Private *priv; + GCancellable *cancellable; priv = get_private (MM_SHARED_SIMTECH (self)); - task = g_task_new (self, NULL, callback, user_data); + cancellable = mm_base_modem_peek_cancellable (MM_BASE_MODEM (self)); + task = g_task_new (self, cancellable, callback, user_data); /* Do nothing if CPCMREG isn't supported */ if (priv->cpcmreg_support != FEATURE_SUPPORTED) { @@ -1107,14 +1132,7 @@ common_setup_cleanup_in_call_audio_channel (MMSharedSimtech *self, } /* 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, - FALSE, - (GAsyncReadyCallback) cpcmreg_set_ready, - task); + g_timeout_add (100, (GSourceFunc)call_audio_channel_set, task); } void From 60bc73300498151ec7a95a2cfcc51bb33d94e1be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Su=C5=82ek?= Date: Sat, 22 Feb 2025 12:11:40 +0100 Subject: [PATCH 3/5] Was not compiling due to setup being undefined in call_audio_channel_set --- src/plugins/simtech/mm-shared-simtech.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/simtech/mm-shared-simtech.c b/src/plugins/simtech/mm-shared-simtech.c index 42b4e346..897e0d8b 100644 --- a/src/plugins/simtech/mm-shared-simtech.c +++ b/src/plugins/simtech/mm-shared-simtech.c @@ -1093,6 +1093,8 @@ call_audio_channel_set (gpointer user_data) MMBaseModem *modem; task = G_TASK (user_data); + gboolean setup = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(task), "setup")); + if (g_task_return_error_if_cancelled (task)) { g_object_unref (task); return G_SOURCE_REMOVE; @@ -1108,7 +1110,6 @@ call_audio_channel_set (gpointer user_data) return G_SOURCE_REMOVE; } - static void common_setup_cleanup_in_call_audio_channel (MMSharedSimtech *self, gboolean setup, @@ -1123,6 +1124,7 @@ common_setup_cleanup_in_call_audio_channel (MMSharedSimtech *self, cancellable = mm_base_modem_peek_cancellable (MM_BASE_MODEM (self)); task = g_task_new (self, cancellable, callback, user_data); + g_object_set_data(G_OBJECT(task), "setup", GINT_TO_POINTER(setup)); /* Do nothing if CPCMREG isn't supported */ if (priv->cpcmreg_support != FEATURE_SUPPORTED) { From 602808c0ebecae8512a07d32a6bf6e39892f7c5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Su=C5=82ek?= Date: Sat, 22 Feb 2025 12:21:04 +0100 Subject: [PATCH 4/5] Setup variable declared after function call, fixed. --- src/plugins/simtech/mm-shared-simtech.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/simtech/mm-shared-simtech.c b/src/plugins/simtech/mm-shared-simtech.c index 897e0d8b..28a7d6c7 100644 --- a/src/plugins/simtech/mm-shared-simtech.c +++ b/src/plugins/simtech/mm-shared-simtech.c @@ -1091,9 +1091,10 @@ call_audio_channel_set (gpointer user_data) { GTask *task; MMBaseModem *modem; + gboolean setup; task = G_TASK (user_data); - gboolean setup = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(task), "setup")); + setup = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(task), "setup")); if (g_task_return_error_if_cancelled (task)) { g_object_unref (task); From 3966e1c0196b3b2d8df71cb3dbba79b031e06043 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Su=C5=82ek?= Date: Mon, 24 Feb 2025 17:35:47 +0100 Subject: [PATCH 5/5] Fixed code formatting --- src/plugins/simtech/mm-shared-simtech.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/plugins/simtech/mm-shared-simtech.c b/src/plugins/simtech/mm-shared-simtech.c index 28a7d6c7..1e651ecb 100644 --- a/src/plugins/simtech/mm-shared-simtech.c +++ b/src/plugins/simtech/mm-shared-simtech.c @@ -1094,7 +1094,7 @@ call_audio_channel_set (gpointer user_data) gboolean setup; task = G_TASK (user_data); - setup = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(task), "setup")); + setup = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (task), "setup")); if (g_task_return_error_if_cancelled (task)) { g_object_unref (task); @@ -1125,7 +1125,7 @@ common_setup_cleanup_in_call_audio_channel (MMSharedSimtech *self, cancellable = mm_base_modem_peek_cancellable (MM_BASE_MODEM (self)); task = g_task_new (self, cancellable, callback, user_data); - g_object_set_data(G_OBJECT(task), "setup", GINT_TO_POINTER(setup)); + g_object_set_data (G_OBJECT (task), "setup", GINT_TO_POINTER (setup)); /* Do nothing if CPCMREG isn't supported */ if (priv->cpcmreg_support != FEATURE_SUPPORTED) { @@ -1183,8 +1183,8 @@ cpcmfrm_set_ready (MMBaseModem *self, static void cpcmfrm_format_check_and_set_ready (MMBroadbandModem *self, - GAsyncResult *res, - GTask *task) + GAsyncResult *res, + GTask *task) { Private *priv; @@ -1220,7 +1220,7 @@ cpcmreg_format_check_ready (MMBroadbandModem *self, mm_obj_dbg (self, "modem %s USB audio control", (priv->cpcmreg_support == FEATURE_SUPPORTED) ? "supports" : "doesn't support"); /* If USB Audio not supported, we won't check and set its formats */ - if(priv->cpcmreg_support == FEATURE_SUPPORTED) { + if (priv->cpcmreg_support == FEATURE_SUPPORTED) { mm_base_modem_at_command (MM_BASE_MODEM (self), "+CPCMFRM=?", 3,