diff --git a/platform/android/game_menu_utils_jni.cpp b/platform/android/game_menu_utils_jni.cpp
index 5ff8f712359..e56ad3d5f8e 100644
--- a/platform/android/game_menu_utils_jni.cpp
+++ b/platform/android/game_menu_utils_jni.cpp
@@ -133,4 +133,13 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_utils_GameMenuUtils_playMainSc
}
#endif
}
+
+JNIEXPORT void JNICALL Java_org_godotengine_godot_utils_GameMenuUtils_setDebugMuteAudio(JNIEnv *env, jclass clazz, jboolean enabled) {
+#ifdef TOOLS_ENABLED
+ GameViewPlugin *game_view_plugin = _get_game_view_plugin();
+ if (game_view_plugin != nullptr && game_view_plugin->get_debugger().is_valid()) {
+ game_view_plugin->get_debugger()->set_debug_mute_audio(enabled);
+ }
+#endif
+}
}
diff --git a/platform/android/game_menu_utils_jni.h b/platform/android/game_menu_utils_jni.h
index 5720c3fbdc5..d8412a084f2 100644
--- a/platform/android/game_menu_utils_jni.h
+++ b/platform/android/game_menu_utils_jni.h
@@ -43,4 +43,5 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_utils_GameMenuUtils_setCameraM
JNIEXPORT void JNICALL Java_org_godotengine_godot_utils_GameMenuUtils_resetCamera2DPosition(JNIEnv *env, jclass clazz);
JNIEXPORT void JNICALL Java_org_godotengine_godot_utils_GameMenuUtils_resetCamera3DPosition(JNIEnv *env, jclass clazz);
JNIEXPORT void JNICALL Java_org_godotengine_godot_utils_GameMenuUtils_playMainScene(JNIEnv *env, jclass clazz);
+JNIEXPORT void JNICALL Java_org_godotengine_godot_utils_GameMenuUtils_setDebugMuteAudio(JNIEnv *env, jclass clazz, jboolean enabled);
}
diff --git a/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt b/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt
index c9f717ec810..bcb59a3ec1a 100644
--- a/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt
+++ b/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt
@@ -37,7 +37,11 @@ import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
-import android.os.*
+import android.os.Build
+import android.os.Bundle
+import android.os.Debug
+import android.os.Environment
+import android.os.Process
import android.preference.PreferenceManager
import android.util.Log
import android.view.View
@@ -138,6 +142,7 @@ abstract class BaseGodotEditor : GodotActivity(), GameMenuFragment.GameMenuListe
internal const val GAME_MENU_ACTION_RESET_CAMERA_2D_POSITION = "resetCamera2DPosition"
internal const val GAME_MENU_ACTION_RESET_CAMERA_3D_POSITION = "resetCamera3DPosition"
internal const val GAME_MENU_ACTION_EMBED_GAME_ON_PLAY = "embedGameOnPlay"
+ internal const val GAME_MENU_ACTION_SET_DEBUG_MUTE_AUDIO = "setDebugMuteAudio"
private const val GAME_WORKSPACE = "Game"
@@ -753,6 +758,10 @@ abstract class BaseGodotEditor : GodotActivity(), GameMenuFragment.GameMenuListe
val embedded = actionData.getBoolean(KEY_GAME_MENU_ACTION_PARAM1)
embedGameOnPlay(embedded)
}
+ GAME_MENU_ACTION_SET_DEBUG_MUTE_AUDIO -> {
+ val enabled = actionData.getBoolean(KEY_GAME_MENU_ACTION_PARAM1)
+ muteAudio(enabled)
+ }
}
}
@@ -816,6 +825,13 @@ abstract class BaseGodotEditor : GodotActivity(), GameMenuFragment.GameMenuListe
}
}
+ override fun muteAudio(enabled: Boolean) {
+ gameMenuState.putBoolean(GAME_MENU_ACTION_SET_DEBUG_MUTE_AUDIO, enabled)
+ godot?.runOnRenderThread {
+ GameMenuUtils.setDebugMuteAudio(enabled)
+ }
+ }
+
override fun embedGameOnPlay(embedded: Boolean) {
gameMenuState.putBoolean(GAME_MENU_ACTION_EMBED_GAME_ON_PLAY, embedded)
godot?.runOnRenderThread {
diff --git a/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotGame.kt b/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotGame.kt
index 2f0a45f9926..4172ba61408 100644
--- a/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotGame.kt
+++ b/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotGame.kt
@@ -206,6 +206,14 @@ open class GodotGame : BaseGodotGame() {
editorMessageDispatcher.dispatchGameMenuAction(EDITOR_MAIN_INFO, actionBundle)
}
+ override fun muteAudio(enabled: Boolean) {
+ val actionBundle = Bundle().apply {
+ putString(KEY_GAME_MENU_ACTION, GAME_MENU_ACTION_SET_DEBUG_MUTE_AUDIO)
+ putBoolean(KEY_GAME_MENU_ACTION_PARAM1, enabled)
+ }
+ editorMessageDispatcher.dispatchGameMenuAction(EDITOR_MAIN_INFO, actionBundle)
+ }
+
override fun embedGameOnPlay(embedded: Boolean) {
val actionBundle = Bundle().apply {
putString(KEY_GAME_MENU_ACTION, GAME_MENU_ACTION_EMBED_GAME_ON_PLAY)
diff --git a/platform/android/java/editor/src/main/java/org/godotengine/editor/embed/GameMenuFragment.kt b/platform/android/java/editor/src/main/java/org/godotengine/editor/embed/GameMenuFragment.kt
index 9559bcd4307..0c3c76a37d7 100644
--- a/platform/android/java/editor/src/main/java/org/godotengine/editor/embed/GameMenuFragment.kt
+++ b/platform/android/java/editor/src/main/java/org/godotengine/editor/embed/GameMenuFragment.kt
@@ -101,6 +101,7 @@ class GameMenuFragment : Fragment(), PopupMenu.OnMenuItemClickListener {
fun reset2DCamera()
fun reset3DCamera()
fun manipulateCamera(mode: CameraMode)
+ fun muteAudio(enabled: Boolean)
fun isGameEmbeddingSupported(): Boolean
fun embedGameOnPlay(embedded: Boolean)
@@ -148,6 +149,9 @@ class GameMenuFragment : Fragment(), PopupMenu.OnMenuItemClickListener {
private val listSelectButton: RadioButton? by lazy {
view?.findViewById(R.id.game_menu_list_select_button)
}
+ private val audioMuteButton: View? by lazy {
+ view?.findViewById(R.id.game_menu_audio_mute_button)
+ }
private val optionsButton: View? by lazy {
view?.findViewById(R.id.game_menu_options_button)
}
@@ -319,6 +323,13 @@ class GameMenuFragment : Fragment(), PopupMenu.OnMenuItemClickListener {
}
}
}
+ audioMuteButton?.apply{
+ setOnClickListener {
+ val isActivated = !it.isActivated
+ menuListener?.muteAudio(isActivated)
+ it.isActivated = isActivated
+ }
+ }
optionsButton?.setOnClickListener {
popupMenu.show()
}
@@ -351,6 +362,8 @@ class GameMenuFragment : Fragment(), PopupMenu.OnMenuItemClickListener {
toolSelectButton?.isChecked = selectMode == GameMenuListener.SelectMode.SINGLE
listSelectButton?.isChecked = selectMode == GameMenuListener.SelectMode.LIST
+ audioMuteButton?.isActivated = gameMenuState.getBoolean(BaseGodotEditor.GAME_MENU_ACTION_SET_DEBUG_MUTE_AUDIO, false)
+
popupMenu.menu.apply {
if (menuListener?.isGameEmbeddingSupported() == false) {
setGroupEnabled(R.id.group_menu_embed_options, false)
diff --git a/platform/android/java/editor/src/main/res/drawable/audio_player.xml b/platform/android/java/editor/src/main/res/drawable/audio_player.xml
new file mode 100644
index 00000000000..cad4f24e4d3
--- /dev/null
+++ b/platform/android/java/editor/src/main/res/drawable/audio_player.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/platform/android/java/editor/src/main/res/drawable/audio_player_icon_selector.xml b/platform/android/java/editor/src/main/res/drawable/audio_player_icon_selector.xml
new file mode 100644
index 00000000000..237fa08f1d1
--- /dev/null
+++ b/platform/android/java/editor/src/main/res/drawable/audio_player_icon_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/platform/android/java/editor/src/main/res/drawable/audio_player_muted.xml b/platform/android/java/editor/src/main/res/drawable/audio_player_muted.xml
new file mode 100644
index 00000000000..06831891b33
--- /dev/null
+++ b/platform/android/java/editor/src/main/res/drawable/audio_player_muted.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
diff --git a/platform/android/java/editor/src/main/res/layout/game_menu_fragment_layout.xml b/platform/android/java/editor/src/main/res/layout/game_menu_fragment_layout.xml
index ffa5692df56..5160bea73fa 100644
--- a/platform/android/java/editor/src/main/res/layout/game_menu_fragment_layout.xml
+++ b/platform/android/java/editor/src/main/res/layout/game_menu_fragment_layout.xml
@@ -128,6 +128,15 @@
android:drawableStart="@drawable/list_select"
android:padding="15dp" />
+
+
+
diff --git a/platform/android/java/lib/src/org/godotengine/godot/utils/GameMenuUtils.kt b/platform/android/java/lib/src/org/godotengine/godot/utils/GameMenuUtils.kt
index 538bc2ab2c1..d50fbf41615 100644
--- a/platform/android/java/lib/src/org/godotengine/godot/utils/GameMenuUtils.kt
+++ b/platform/android/java/lib/src/org/godotengine/godot/utils/GameMenuUtils.kt
@@ -90,6 +90,9 @@ object GameMenuUtils {
@JvmStatic
external fun playMainScene()
+ @JvmStatic
+ external fun setDebugMuteAudio(enabled: Boolean)
+
/**
* Returns [GameEmbedMode] stored in the editor settings.
*