diff --git a/editor/debugger/editor_debugger_node.cpp b/editor/debugger/editor_debugger_node.cpp index ea100a0eb26..d63a8921696 100644 --- a/editor/debugger/editor_debugger_node.cpp +++ b/editor/debugger/editor_debugger_node.cpp @@ -871,6 +871,17 @@ void EditorDebuggerNode::live_debug_reparent_node(const NodePath &p_at, const No }); } +void EditorDebuggerNode::set_debug_mute_audio(bool p_mute) { + _for_all(tabs, [&](ScriptEditorDebugger *dbg) { + dbg->set_debug_mute_audio(p_mute); + }); + debug_mute_audio = p_mute; +} + +bool EditorDebuggerNode::get_debug_mute_audio() const { + return debug_mute_audio; +} + void EditorDebuggerNode::set_camera_override(CameraOverride p_override) { _for_all(tabs, [&](ScriptEditorDebugger *dbg) { dbg->set_camera_override(p_override); diff --git a/editor/debugger/editor_debugger_node.h b/editor/debugger/editor_debugger_node.h index 80e9de3baeb..7e573368f47 100644 --- a/editor/debugger/editor_debugger_node.h +++ b/editor/debugger/editor_debugger_node.h @@ -113,6 +113,8 @@ private: bool keep_open = false; String current_uri; + bool debug_mute_audio = false; + CameraOverride camera_override = OVERRIDE_NONE; HashMap breakpoints; @@ -214,6 +216,9 @@ public: void live_debug_duplicate_node(const NodePath &p_at, const String &p_new_name); void live_debug_reparent_node(const NodePath &p_at, const NodePath &p_new_place, const String &p_new_name, int p_at_pos); + void set_debug_mute_audio(bool p_mute); + bool get_debug_mute_audio() const; + void set_camera_override(CameraOverride p_override); CameraOverride get_camera_override(); diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp index a84216eb5eb..bda0c6ef50a 100644 --- a/editor/debugger/script_editor_debugger.cpp +++ b/editor/debugger/script_editor_debugger.cpp @@ -1543,6 +1543,17 @@ void ScriptEditorDebugger::live_debug_reparent_node(const NodePath &p_at, const } } +bool ScriptEditorDebugger::get_debug_mute_audio() const { + return debug_mute_audio; +} + +void ScriptEditorDebugger::set_debug_mute_audio(bool p_mute) { + Array msg; + msg.push_back(p_mute); + _put_msg("scene:debug_mute_audio", msg); + debug_mute_audio = p_mute; +} + CameraOverride ScriptEditorDebugger::get_camera_override() const { return camera_override; } diff --git a/editor/debugger/script_editor_debugger.h b/editor/debugger/script_editor_debugger.h index 45f8a99dd87..60525d2a718 100644 --- a/editor/debugger/script_editor_debugger.h +++ b/editor/debugger/script_editor_debugger.h @@ -183,6 +183,8 @@ private: void _select_thread(int p_index); + bool debug_mute_audio = false; + EditorDebuggerNode::CameraOverride camera_override; void _stack_dump_frame_selected(); @@ -303,6 +305,9 @@ public: void live_debug_duplicate_node(const NodePath &p_at, const String &p_new_name); void live_debug_reparent_node(const NodePath &p_at, const NodePath &p_new_place, const String &p_new_name, int p_at_pos); + bool get_debug_mute_audio() const; + void set_debug_mute_audio(bool p_mute); + EditorDebuggerNode::CameraOverride get_camera_override() const; void set_camera_override(EditorDebuggerNode::CameraOverride p_override); diff --git a/editor/editor_run.cpp b/editor/editor_run.cpp index 1768312cfdd..f7297d280b9 100644 --- a/editor/editor_run.cpp +++ b/editor/editor_run.cpp @@ -73,6 +73,7 @@ Error EditorRun::run(const String &p_scene, const String &p_write_movie, const V bool debug_navigation = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_navigation", false); bool debug_avoidance = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_avoidance", false); bool debug_canvas_redraw = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_canvas_redraw", false); + bool debug_mute_audio = EditorDebuggerNode::get_singleton()->get_debug_mute_audio(); if (debug_collisions) { args.push_back("--debug-collisions"); @@ -94,6 +95,10 @@ Error EditorRun::run(const String &p_scene, const String &p_write_movie, const V args.push_back("--debug-canvas-item-redraw"); } + if (debug_mute_audio) { + args.push_back("--debug-mute-audio"); + } + if (p_write_movie != "") { args.push_back("--write-movie"); args.push_back(p_write_movie); diff --git a/editor/icons/AudioMute.svg b/editor/icons/AudioMute.svg new file mode 100644 index 00000000000..5c28f051a0d --- /dev/null +++ b/editor/icons/AudioMute.svg @@ -0,0 +1 @@ + diff --git a/editor/plugins/game_view_plugin.cpp b/editor/plugins/game_view_plugin.cpp index b2a68aff235..1a01182c33a 100644 --- a/editor/plugins/game_view_plugin.cpp +++ b/editor/plugins/game_view_plugin.cpp @@ -95,6 +95,9 @@ void GameViewDebugger::_session_started(Ref p_session) { Array mode; mode.append(select_mode); p_session->send_message("scene:runtime_node_select_set_mode", mode); + Array mute_audio_data; + mute_audio_data.append(mute_audio); + p_session->send_message("scene:debug_mute_audio", mute_audio_data); emit_signal(SNAME("session_started")); } @@ -169,6 +172,11 @@ void GameViewDebugger::set_select_mode(int p_mode) { } } +void GameViewDebugger::set_debug_mute_audio(bool p_enabled) { + mute_audio = p_enabled; + EditorDebuggerNode::get_singleton()->set_debug_mute_audio(p_enabled); +} + void GameViewDebugger::set_camera_override(bool p_enabled) { EditorDebuggerNode::get_singleton()->set_camera_override(p_enabled ? camera_override_mode : EditorDebuggerNode::OVERRIDE_NONE); } @@ -593,6 +601,13 @@ void GameView::_hide_selection_toggled(bool p_pressed) { EditorSettings::get_singleton()->set_project_metadata("game_view", "hide_selection", p_pressed); } +void GameView::_debug_mute_audio_button_pressed() { + debug_mute_audio = !debug_mute_audio; + debug_mute_audio_button->set_button_icon(get_editor_theme_icon(debug_mute_audio ? SNAME("AudioMute") : SNAME("AudioStreamPlayer"))); + debug_mute_audio_button->set_tooltip_text(debug_mute_audio ? TTRC("Unmute game audio.") : TTRC("Mute game audio.")); + debugger->set_debug_mute_audio(debug_mute_audio); +} + void GameView::_camera_override_button_toggled(bool p_pressed) { _update_debugger_buttons(); @@ -654,6 +669,8 @@ void GameView::_notification(int p_what) { stretch_button->set_button_icon(get_editor_theme_icon(SNAME("Stretch"))); embed_options_menu->set_button_icon(get_editor_theme_icon(SNAME("GuiTabMenuHl"))); + debug_mute_audio_button->set_button_icon(get_editor_theme_icon(debug_mute_audio ? SNAME("AudioMute") : SNAME("AudioStreamPlayer"))); + camera_override_button->set_button_icon(get_editor_theme_icon(SNAME("Camera"))); camera_override_menu->set_button_icon(get_editor_theme_icon(SNAME("GuiTabMenuHl"))); } break; @@ -963,6 +980,14 @@ GameView::GameView(Ref p_debugger, WindowWrapper *p_wrapper) { main_menu_hbox->add_child(memnew(VSeparator)); + debug_mute_audio_button = memnew(Button); + main_menu_hbox->add_child(debug_mute_audio_button); + debug_mute_audio_button->set_theme_type_variation("FlatButton"); + debug_mute_audio_button->connect(SceneStringName(pressed), callable_mp(this, &GameView::_debug_mute_audio_button_pressed)); + debug_mute_audio_button->set_tooltip_text(debug_mute_audio ? TTRC("Unmute game audio.") : TTRC("Mute game audio.")); + + main_menu_hbox->add_child(memnew(VSeparator)); + camera_override_button = memnew(Button); main_menu_hbox->add_child(camera_override_button); camera_override_button->set_toggle_mode(true); diff --git a/editor/plugins/game_view_plugin.h b/editor/plugins/game_view_plugin.h index c1c0b1f66ca..41782b78e6a 100644 --- a/editor/plugins/game_view_plugin.h +++ b/editor/plugins/game_view_plugin.h @@ -52,6 +52,7 @@ private: int node_type = RuntimeNodeSelect::NODE_TYPE_NONE; bool selection_visible = true; int select_mode = RuntimeNodeSelect::SELECT_MODE_SINGLE; + bool mute_audio = false; EditorDebuggerNode::CameraOverride camera_override_mode = EditorDebuggerNode::OVERRIDE_INGAME; void _session_started(Ref p_session); @@ -71,6 +72,8 @@ public: void set_selection_visible(bool p_visible); + void set_debug_mute_audio(bool p_enabled); + void set_camera_override(bool p_enabled); void set_camera_manipulate_mode(EditorDebuggerNode::CameraOverride p_mode); @@ -127,6 +130,8 @@ class GameView : public VBoxContainer { Rect2i floating_window_rect; int floating_window_screen = -1; + bool debug_mute_audio = false; + Button *suspend_button = nullptr; Button *next_frame_button = nullptr; @@ -135,6 +140,8 @@ class GameView : public VBoxContainer { Button *hide_selection = nullptr; + Button *debug_mute_audio_button = nullptr; + Button *camera_override_button = nullptr; MenuButton *camera_override_menu = nullptr; @@ -178,6 +185,8 @@ class GameView : public VBoxContainer { void _hide_selection_toggled(bool p_pressed); + void _debug_mute_audio_button_pressed(); + void _camera_override_button_toggled(bool p_pressed); void _camera_override_menu_id_pressed(int p_id); diff --git a/main/main.cpp b/main/main.cpp index 96c9d8a4e34..39f7c3f9321 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -246,6 +246,7 @@ static bool debug_paths = false; static bool debug_navigation = false; static bool debug_avoidance = false; static bool debug_canvas_item_redraw = false; +static bool debug_mute_audio = false; #endif static int max_fps = -1; static int frame_delay = 0; @@ -1678,6 +1679,8 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph debug_canvas_item_redraw = true; } else if (arg == "--debug-stringnames") { StringName::set_debug_stringnames(true); + } else if (arg == "--debug-mute-audio") { + debug_mute_audio = true; #endif #if defined(TOOLS_ENABLED) && (defined(WINDOWS_ENABLED) || defined(LINUXBSD_ENABLED)) } else if (arg == "--test-rd-support") { @@ -4084,6 +4087,10 @@ int Main::start() { if (debug_canvas_item_redraw) { RenderingServer::get_singleton()->canvas_item_set_debug_redraw(true); } + + if (debug_mute_audio) { + AudioServer::get_singleton()->set_debug_mute(true); + } #endif if (single_threaded_scene) { diff --git a/scene/debugger/scene_debugger.cpp b/scene/debugger/scene_debugger.cpp index a1b92314384..3234239d826 100644 --- a/scene/debugger/scene_debugger.cpp +++ b/scene/debugger/scene_debugger.cpp @@ -52,6 +52,7 @@ #include "scene/main/window.h" #include "scene/resources/packed_scene.h" #include "scene/theme/theme_db.h" +#include "servers/audio_server.h" SceneDebugger::SceneDebugger() { singleton = this; @@ -150,6 +151,11 @@ Error SceneDebugger::parse_message(void *p_user, const String &p_msg, const Arra } else if (p_msg == "next_frame") { _next_frame(); + } else if (p_msg == "debug_mute_audio") { // Enable/disable audio. + ERR_FAIL_COND_V(p_args.is_empty(), ERR_INVALID_DATA); + bool do_mute = p_args[0]; + AudioServer::get_singleton()->set_debug_mute(do_mute); + } else if (p_msg == "override_cameras") { /// Camera ERR_FAIL_COND_V(p_args.is_empty(), ERR_INVALID_DATA); bool enable = p_args[0]; diff --git a/servers/audio_server.cpp b/servers/audio_server.cpp index 2a951c46c3e..b5df08211a8 100644 --- a/servers/audio_server.cpp +++ b/servers/audio_server.cpp @@ -294,7 +294,11 @@ void AudioServer::_driver_process(int p_frames, int32_t *p_buffer) { // The destination start for data will be the same in all cases. int32_t *dest = &p_buffer[from_buf * (cs * 2) + (k * 2)]; +#ifdef DEBUG_ENABLED + if (!debug_mute && master->channels[k].active) { +#else if (master->channels[k].active) { +#endif // DEBUG_ENABLED const AudioFrame *buf = master->channels[k].buffer.ptr(); for (int j = 0; j < to_copy; j++) { @@ -765,6 +769,16 @@ int AudioServer::thread_find_bus_index(const StringName &p_name) { } } +#ifdef DEBUG_ENABLED +void AudioServer::set_debug_mute(bool p_mute) { + debug_mute = p_mute; +} + +bool AudioServer::get_debug_mute() const { + return debug_mute; +} +#endif // DEBUG_ENABLED + void AudioServer::set_bus_count(int p_count) { ERR_FAIL_COND(p_count < 1); ERR_FAIL_INDEX(p_count, 256); diff --git a/servers/audio_server.h b/servers/audio_server.h index d07878a6390..e429c83616b 100644 --- a/servers/audio_server.h +++ b/servers/audio_server.h @@ -228,6 +228,10 @@ private: bool tag_used_audio_streams = false; +#ifdef DEBUG_ENABLED + bool debug_mute = false; +#endif // DEBUG_ENABLED + struct Bus { StringName name; bool solo = false; @@ -366,6 +370,11 @@ public: int thread_get_mix_buffer_size() const; int thread_find_bus_index(const StringName &p_name); +#ifdef DEBUG_ENABLED + void set_debug_mute(bool p_mute); + bool get_debug_mute() const; +#endif // DEBUG_ENABLED + void set_bus_count(int p_count); int get_bus_count() const;