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. *