From a73705bc50f09ae4b177df696fa37b5e20bf200d Mon Sep 17 00:00:00 2001 From: rogerman Date: Fri, 15 Apr 2022 12:34:05 -0700 Subject: [PATCH] Cocoa Port: Polish the behaviors for hardware microphone authorization. (Related to commit efa72df1.) - Hardware microphone authorization is now requested on app startup instead of when a ROM is loaded. - CoreAudioInput is now better at handling situations when the hardware mic is not available, fixing some bugs with the mic level indicator. - Add some helpful tooltips in the Microphone Settings panel when the hardware mic is not authorized. - Add a new idle mic icon to denote when the hardware mic is not available. (The gray color should denote a 'software only' status.) - Further brighten up the microphone icon for when software samples are active to help with visibility when running Dark Mode. --- .../src/frontend/cocoa/ClientInputHandler.cpp | 13 +- .../src/frontend/cocoa/ClientInputHandler.h | 5 +- .../project.pbxproj | 66 +- .../project.pbxproj | 36 +- desmume/src/frontend/cocoa/cocoa_input.h | 11 +- desmume/src/frontend/cocoa/cocoa_input.mm | 33 +- desmume/src/frontend/cocoa/coreaudiosound.cpp | 40 +- desmume/src/frontend/cocoa/coreaudiosound.h | 5 + .../images/Icon_MicrophoneDenied_256x256.png | Bin 8056 -> 0 bytes ...Icon_MicrophoneDenied_DarkMode_256x256.png | Bin 9819 -> 0 bytes .../images/Icon_MicrophoneGray_256x256.png | Bin 20287 -> 18568 bytes .../Icon_MicrophoneIdleNoHardware_256x256.png | Bin 0 -> 10711 bytes .../English.lproj/DisplayWindow.xib | 3456 ++++++++--------- .../translations/English.lproj/MainMenu.xib | 82 +- .../userinterface/EmuControllerDelegate.h | 10 + .../userinterface/EmuControllerDelegate.mm | 176 +- .../cocoa/userinterface/appDelegate.mm | 10 +- 17 files changed, 2031 insertions(+), 1912 deletions(-) delete mode 100644 desmume/src/frontend/cocoa/images/Icon_MicrophoneDenied_256x256.png delete mode 100644 desmume/src/frontend/cocoa/images/Icon_MicrophoneDenied_DarkMode_256x256.png create mode 100644 desmume/src/frontend/cocoa/images/Icon_MicrophoneIdleNoHardware_256x256.png diff --git a/desmume/src/frontend/cocoa/ClientInputHandler.cpp b/desmume/src/frontend/cocoa/ClientInputHandler.cpp index a47c6b278..ebd3763fd 100644 --- a/desmume/src/frontend/cocoa/ClientInputHandler.cpp +++ b/desmume/src/frontend/cocoa/ClientInputHandler.cpp @@ -1,5 +1,5 @@ /* - Copyright (C) 2017 DeSmuME team + Copyright (C) 2017-2022 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -673,6 +673,17 @@ void ClientInputHandler::ApplyInputs() } } +void ClientInputHandler::SetHardwareMicAuthorized(bool isAuthorized) +{ + // Do nothing. This is implementation-dependent. +} + +bool ClientInputHandler::IsHardwareMicAuthorized() +{ + // Do nothing. This is implementation-dependent. + return true; +} + bool ClientInputHandler::IsHardwareMicAvailable() { // Do nothing. This is implementation-dependent. diff --git a/desmume/src/frontend/cocoa/ClientInputHandler.h b/desmume/src/frontend/cocoa/ClientInputHandler.h index f4078dc5f..945b60d4d 100644 --- a/desmume/src/frontend/cocoa/ClientInputHandler.h +++ b/desmume/src/frontend/cocoa/ClientInputHandler.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2017 DeSmuME team + Copyright (C) 2017-2022 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -438,6 +438,9 @@ public: void ProcessInputs(); void ApplyInputs(); + virtual void SetHardwareMicAuthorized(bool isAuthorized); + virtual bool IsHardwareMicAuthorized(); + virtual bool IsHardwareMicAvailable(); virtual void ResetHardwareMic(); virtual uint8_t HandleMicSampleRead(); diff --git a/desmume/src/frontend/cocoa/DeSmuME (Latest).xcodeproj/project.pbxproj b/desmume/src/frontend/cocoa/DeSmuME (Latest).xcodeproj/project.pbxproj index a003e5dff..8fa038845 100755 --- a/desmume/src/frontend/cocoa/DeSmuME (Latest).xcodeproj/project.pbxproj +++ b/desmume/src/frontend/cocoa/DeSmuME (Latest).xcodeproj/project.pbxproj @@ -1332,6 +1332,16 @@ AB3BF4351E256309003E2B24 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB3BF4321E2562F2003E2B24 /* QuartzCore.framework */; }; AB3BF4381E25D9AE003E2B24 /* DisplayViewCALayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3BF4371E25D9AE003E2B24 /* DisplayViewCALayer.mm */; }; AB3BF4391E25D9AE003E2B24 /* DisplayViewCALayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3BF4371E25D9AE003E2B24 /* DisplayViewCALayer.mm */; }; + AB3E8AEC2808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB3E8AEB2808FDF3007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png */; }; + AB3E8AED2808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB3E8AEB2808FDF3007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png */; }; + AB3E8AEE2808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB3E8AEB2808FDF3007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png */; }; + AB3E8AEF2808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB3E8AEB2808FDF3007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png */; }; + AB3E8AF02808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB3E8AEB2808FDF3007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png */; }; + AB3E8AF12808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB3E8AEB2808FDF3007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png */; }; + AB3E8AF22808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB3E8AEB2808FDF3007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png */; }; + AB3E8AF32808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB3E8AEB2808FDF3007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png */; }; + AB3E8AF42808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB3E8AEB2808FDF3007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png */; }; + AB3E8AF52808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB3E8AEB2808FDF3007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png */; }; AB3FBD802176DE95005722D0 /* WifiSettingsPanel.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3FBD7F2176DE95005722D0 /* WifiSettingsPanel.mm */; }; AB3FBD812176DE95005722D0 /* WifiSettingsPanel.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3FBD7F2176DE95005722D0 /* WifiSettingsPanel.mm */; }; AB3FBD822176DE95005722D0 /* WifiSettingsPanel.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3FBD7F2176DE95005722D0 /* WifiSettingsPanel.mm */; }; @@ -2740,16 +2750,6 @@ ABA67CDF2808B97E00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB22808B97D00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16@2x.png */; }; ABA67CE02808B97E00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB22808B97D00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16@2x.png */; }; ABA67CE12808B97E00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB22808B97D00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16@2x.png */; }; - ABA67CE22808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB32808B97D00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png */; }; - ABA67CE32808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB32808B97D00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png */; }; - ABA67CE42808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB32808B97D00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png */; }; - ABA67CE52808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB32808B97D00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png */; }; - ABA67CE62808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB32808B97D00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png */; }; - ABA67CE72808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB32808B97D00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png */; }; - ABA67CE82808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB32808B97D00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png */; }; - ABA67CE92808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB32808B97D00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png */; }; - ABA67CEA2808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB32808B97D00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png */; }; - ABA67CEB2808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB32808B97D00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png */; }; ABA67CEC2808B97E00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB42808B97D00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16.png */; }; ABA67CED2808B97E00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB42808B97D00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16.png */; }; ABA67CEE2808B97E00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB42808B97D00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16.png */; }; @@ -2760,16 +2760,6 @@ ABA67CF32808B97E00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB42808B97D00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16.png */; }; ABA67CF42808B97E00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB42808B97D00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16.png */; }; ABA67CF52808B97E00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB42808B97D00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16.png */; }; - ABA67CF62808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB52808B97D00B5208D /* Icon_MicrophoneDenied_256x256.png */; }; - ABA67CF72808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB52808B97D00B5208D /* Icon_MicrophoneDenied_256x256.png */; }; - ABA67CF82808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB52808B97D00B5208D /* Icon_MicrophoneDenied_256x256.png */; }; - ABA67CF92808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB52808B97D00B5208D /* Icon_MicrophoneDenied_256x256.png */; }; - ABA67CFA2808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB52808B97D00B5208D /* Icon_MicrophoneDenied_256x256.png */; }; - ABA67CFB2808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB52808B97D00B5208D /* Icon_MicrophoneDenied_256x256.png */; }; - ABA67CFC2808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB52808B97D00B5208D /* Icon_MicrophoneDenied_256x256.png */; }; - ABA67CFD2808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB52808B97D00B5208D /* Icon_MicrophoneDenied_256x256.png */; }; - ABA67CFE2808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB52808B97D00B5208D /* Icon_MicrophoneDenied_256x256.png */; }; - ABA67CFF2808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB52808B97D00B5208D /* Icon_MicrophoneDenied_256x256.png */; }; ABA67D002808B97E00B5208D /* Icon_VolumeFull_DarkMode_16x16@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB62808B97D00B5208D /* Icon_VolumeFull_DarkMode_16x16@2x.png */; }; ABA67D012808B97E00B5208D /* Icon_VolumeFull_DarkMode_16x16@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB62808B97D00B5208D /* Icon_VolumeFull_DarkMode_16x16@2x.png */; }; ABA67D022808B97E00B5208D /* Icon_VolumeFull_DarkMode_16x16@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA67CB62808B97D00B5208D /* Icon_VolumeFull_DarkMode_16x16@2x.png */; }; @@ -3564,6 +3554,7 @@ AB3BF4401E262943003E2B24 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; }; AB3E34C7134AF4500056477A /* cocoa_output.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_output.h; sourceTree = ""; }; AB3E34C8134AF4500056477A /* cocoa_output.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_output.mm; sourceTree = ""; }; + AB3E8AEB2808FDF3007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneIdleNoHardware_256x256.png; path = images/Icon_MicrophoneIdleNoHardware_256x256.png; sourceTree = ""; }; AB3FBD7E2176DE95005722D0 /* WifiSettingsPanel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WifiSettingsPanel.h; sourceTree = ""; }; AB3FBD7F2176DE95005722D0 /* WifiSettingsPanel.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = WifiSettingsPanel.mm; sourceTree = ""; }; AB4055ED169F59380016AC3E /* AsmJit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsmJit.h; sourceTree = ""; }; @@ -3764,9 +3755,7 @@ ABA67CB02808B97C00B5208D /* Icon_VolumeOneThird_DarkMode_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeOneThird_DarkMode_16x16.png; path = images/Icon_VolumeOneThird_DarkMode_16x16.png; sourceTree = ""; }; ABA67CB12808B97D00B5208D /* Icon_VolumeOneThird_DarkMode_16x16@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon_VolumeOneThird_DarkMode_16x16@2x.png"; path = "images/Icon_VolumeOneThird_DarkMode_16x16@2x.png"; sourceTree = ""; }; ABA67CB22808B97D00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon_VolumeTwoThird_DarkMode_16x16@2x.png"; path = "images/Icon_VolumeTwoThird_DarkMode_16x16@2x.png"; sourceTree = ""; }; - ABA67CB32808B97D00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneDenied_DarkMode_256x256.png; path = images/Icon_MicrophoneDenied_DarkMode_256x256.png; sourceTree = ""; }; ABA67CB42808B97D00B5208D /* Icon_VolumeTwoThird_DarkMode_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeTwoThird_DarkMode_16x16.png; path = images/Icon_VolumeTwoThird_DarkMode_16x16.png; sourceTree = ""; }; - ABA67CB52808B97D00B5208D /* Icon_MicrophoneDenied_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneDenied_256x256.png; path = images/Icon_MicrophoneDenied_256x256.png; sourceTree = ""; }; ABA67CB62808B97D00B5208D /* Icon_VolumeFull_DarkMode_16x16@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon_VolumeFull_DarkMode_16x16@2x.png"; path = "images/Icon_VolumeFull_DarkMode_16x16@2x.png"; sourceTree = ""; }; ABA67CB72808B97E00B5208D /* Icon_VolumeFull_DarkMode_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeFull_DarkMode_16x16.png; path = images/Icon_VolumeFull_DarkMode_16x16.png; sourceTree = ""; }; ABA67CB82808B97E00B5208D /* Icon_MicrophoneOff_DarkMode_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneOff_DarkMode_256x256.png; path = images/Icon_MicrophoneOff_DarkMode_256x256.png; sourceTree = ""; }; @@ -5179,10 +5168,9 @@ ABB0FBC81A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png */, ABB0FBC91A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png */, ABC503AC1AAC2B71002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png */, - ABA67CB52808B97D00B5208D /* Icon_MicrophoneDenied_256x256.png */, - ABA67CB32808B97D00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png */, ABB0FBD81A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png */, ABB0FBCA1A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png */, + AB3E8AEB2808FDF3007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png */, ABA67CB82808B97E00B5208D /* Icon_MicrophoneOff_DarkMode_256x256.png */, ABB0FBCB1A9EED350060C55A /* Icon_MicrophoneRed_256x256.png */, AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */, @@ -5959,7 +5947,6 @@ ABA67D162808B97E00B5208D /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */, 8C43E75127E3CD0100A35F65 /* InfoPlist.strings in Resources */, 8C43E75227E3CD0100A35F65 /* MainMenu.xib in Resources */, - ABA67CF82808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */, 8C43E75327E3CD0100A35F65 /* Localizable.strings in Resources */, 8C43E75427E3CD0100A35F65 /* Icon_ActionReplay_32x32.png in Resources */, 8C43E75527E3CD0100A35F65 /* Icon_CodeBreaker_32x32.png in Resources */, @@ -6026,6 +6013,7 @@ 8C43E78C27E3CD0100A35F65 /* Icon_DSButtonB_420x420.png in Resources */, 8C43E78D27E3CD0100A35F65 /* Icon_Piano_256x256.png in Resources */, 8C43E78E27E3CD0100A35F65 /* Icon_FrameAdvance_420x420.png in Resources */, + AB3E8AEE2808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */, 8C43E78F27E3CD0100A35F65 /* Icon_DSButtonL_420x420.png in Resources */, 8C43E79027E3CD0100A35F65 /* Icon_DSButtonR_420x420.png in Resources */, 8C43E79127E3CD0100A35F65 /* Icon_DSButtonSelect_420x420.png in Resources */, @@ -6051,7 +6039,6 @@ 8C43E7A427E3CD0100A35F65 /* Icon_MicrophoneRed_256x256.png in Resources */, 8C43E7A527E3CD0100A35F65 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */, 8C43E7A627E3CD0100A35F65 /* SourceSansPro-Bold.otf in Resources */, - ABA67CE42808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */, 8C43E7A727E3CD0100A35F65 /* Image_GuitarGrip.png in Resources */, 8C43E7A827E3CD0100A35F65 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */, 8C43E7A927E3CD0100A35F65 /* README.MAC in Resources */, @@ -6079,7 +6066,6 @@ ABA67D172808B97E00B5208D /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */, 8C43E8AF27E3CD4C00A35F65 /* InfoPlist.strings in Resources */, 8C43E8B027E3CD4C00A35F65 /* MainMenu.xib in Resources */, - ABA67CF92808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */, 8C43E8B127E3CD4C00A35F65 /* Localizable.strings in Resources */, 8C43E8B227E3CD4C00A35F65 /* Icon_ActionReplay_32x32.png in Resources */, 8C43E8B327E3CD4C00A35F65 /* Icon_CodeBreaker_32x32.png in Resources */, @@ -6146,6 +6132,7 @@ 8C43E8EA27E3CD4C00A35F65 /* Icon_DSButtonB_420x420.png in Resources */, 8C43E8EB27E3CD4C00A35F65 /* Icon_Piano_256x256.png in Resources */, 8C43E8EC27E3CD4C00A35F65 /* Icon_FrameAdvance_420x420.png in Resources */, + AB3E8AEF2808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */, 8C43E8ED27E3CD4C00A35F65 /* Icon_DSButtonL_420x420.png in Resources */, 8C43E8EE27E3CD4C00A35F65 /* Icon_DSButtonR_420x420.png in Resources */, 8C43E8EF27E3CD4C00A35F65 /* Icon_DSButtonSelect_420x420.png in Resources */, @@ -6171,7 +6158,6 @@ 8C43E90227E3CD4C00A35F65 /* Icon_MicrophoneRed_256x256.png in Resources */, 8C43E90327E3CD4C00A35F65 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */, 8C43E90427E3CD4C00A35F65 /* SourceSansPro-Bold.otf in Resources */, - ABA67CE52808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */, 8C43E90527E3CD4C00A35F65 /* Image_GuitarGrip.png in Resources */, 8C43E90627E3CD4C00A35F65 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */, 8C43E90727E3CD4C00A35F65 /* README.MAC in Resources */, @@ -6199,7 +6185,6 @@ ABA67D1D2808B97E00B5208D /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */, 8CCD83C227E40B730024BDD5 /* InfoPlist.strings in Resources */, 8CCD83C327E40B730024BDD5 /* MainMenu.xib in Resources */, - ABA67CFF2808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */, 8CCD83C427E40B730024BDD5 /* Localizable.strings in Resources */, 8CCD83C527E40B730024BDD5 /* Icon_ActionReplay_32x32.png in Resources */, 8CCD83C627E40B730024BDD5 /* Icon_CodeBreaker_32x32.png in Resources */, @@ -6266,6 +6251,7 @@ 8CCD83FD27E40B730024BDD5 /* Icon_DSButtonB_420x420.png in Resources */, 8CCD83FE27E40B730024BDD5 /* Icon_Piano_256x256.png in Resources */, 8CCD83FF27E40B730024BDD5 /* Icon_FrameAdvance_420x420.png in Resources */, + AB3E8AF52808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */, 8CCD840027E40B730024BDD5 /* Icon_DSButtonL_420x420.png in Resources */, 8CCD840127E40B730024BDD5 /* Icon_DSButtonR_420x420.png in Resources */, 8CCD840227E40B730024BDD5 /* Icon_DSButtonSelect_420x420.png in Resources */, @@ -6291,7 +6277,6 @@ 8CCD841527E40B730024BDD5 /* Icon_MicrophoneRed_256x256.png in Resources */, 8CCD841627E40B730024BDD5 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */, 8CCD841727E40B730024BDD5 /* SourceSansPro-Bold.otf in Resources */, - ABA67CEB2808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */, 8CCD841827E40B730024BDD5 /* Image_GuitarGrip.png in Resources */, 8CCD841927E40B730024BDD5 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */, 8CCD841A27E40B730024BDD5 /* README.MAC in Resources */, @@ -6319,7 +6304,6 @@ ABA67D1B2808B97E00B5208D /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */, AB36C74227F2C8AE00C763C8 /* InfoPlist.strings in Resources */, AB36C74327F2C8AE00C763C8 /* MainMenu.xib in Resources */, - ABA67CFD2808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */, AB36C74427F2C8AE00C763C8 /* Localizable.strings in Resources */, AB36C74527F2C8AE00C763C8 /* Icon_ActionReplay_32x32.png in Resources */, AB36C74627F2C8AE00C763C8 /* Icon_CodeBreaker_32x32.png in Resources */, @@ -6386,6 +6370,7 @@ AB36C77D27F2C8AE00C763C8 /* Icon_DSButtonB_420x420.png in Resources */, AB36C77E27F2C8AE00C763C8 /* Icon_Piano_256x256.png in Resources */, AB36C77F27F2C8AE00C763C8 /* Icon_FrameAdvance_420x420.png in Resources */, + AB3E8AF32808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */, AB36C78027F2C8AE00C763C8 /* Icon_DSButtonL_420x420.png in Resources */, AB36C78127F2C8AE00C763C8 /* Icon_DSButtonR_420x420.png in Resources */, AB36C78227F2C8AE00C763C8 /* Icon_DSButtonSelect_420x420.png in Resources */, @@ -6411,7 +6396,6 @@ AB36C79527F2C8AE00C763C8 /* Icon_MicrophoneRed_256x256.png in Resources */, AB36C79627F2C8AE00C763C8 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */, AB36C79727F2C8AE00C763C8 /* SourceSansPro-Bold.otf in Resources */, - ABA67CE92808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */, AB36C79827F2C8AE00C763C8 /* Image_GuitarGrip.png in Resources */, AB36C79927F2C8AE00C763C8 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */, AB36C79A27F2C8AE00C763C8 /* README.MAC in Resources */, @@ -6439,7 +6423,6 @@ ABA67D1A2808B97E00B5208D /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */, AB4979C827F2E97A00E8A244 /* InfoPlist.strings in Resources */, AB4979C927F2E97A00E8A244 /* MainMenu.xib in Resources */, - ABA67CFC2808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */, AB4979CA27F2E97A00E8A244 /* Localizable.strings in Resources */, AB4979CB27F2E97A00E8A244 /* Icon_ActionReplay_32x32.png in Resources */, AB4979CC27F2E97A00E8A244 /* Icon_CodeBreaker_32x32.png in Resources */, @@ -6506,6 +6489,7 @@ AB497A0327F2E97A00E8A244 /* Icon_DSButtonB_420x420.png in Resources */, AB497A0427F2E97A00E8A244 /* Icon_Piano_256x256.png in Resources */, AB497A0527F2E97A00E8A244 /* Icon_FrameAdvance_420x420.png in Resources */, + AB3E8AF22808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */, AB497A0627F2E97A00E8A244 /* Icon_DSButtonL_420x420.png in Resources */, AB497A0727F2E97A00E8A244 /* Icon_DSButtonR_420x420.png in Resources */, AB497A0827F2E97A00E8A244 /* Icon_DSButtonSelect_420x420.png in Resources */, @@ -6531,7 +6515,6 @@ AB497A1B27F2E97A00E8A244 /* Icon_MicrophoneRed_256x256.png in Resources */, AB497A1C27F2E97A00E8A244 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */, AB497A1D27F2E97A00E8A244 /* SourceSansPro-Bold.otf in Resources */, - ABA67CE82808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */, AB497A1E27F2E97A00E8A244 /* Image_GuitarGrip.png in Resources */, AB497A1F27F2E97A00E8A244 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */, AB497A2027F2E97A00E8A244 /* README.MAC in Resources */, @@ -6559,7 +6542,6 @@ ABA67D192808B97E00B5208D /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */, AB79014D215B84F20082AE82 /* InfoPlist.strings in Resources */, AB79014E215B84F20082AE82 /* MainMenu.xib in Resources */, - ABA67CFB2808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */, AB79014F215B84F20082AE82 /* Localizable.strings in Resources */, AB790150215B84F20082AE82 /* Icon_ActionReplay_32x32.png in Resources */, AB790151215B84F20082AE82 /* Icon_CodeBreaker_32x32.png in Resources */, @@ -6626,6 +6608,7 @@ AB790188215B84F20082AE82 /* Icon_DSButtonB_420x420.png in Resources */, AB790189215B84F20082AE82 /* Icon_Piano_256x256.png in Resources */, AB79018A215B84F20082AE82 /* Icon_FrameAdvance_420x420.png in Resources */, + AB3E8AF12808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */, AB79018B215B84F20082AE82 /* Icon_DSButtonL_420x420.png in Resources */, AB79018C215B84F20082AE82 /* Icon_DSButtonR_420x420.png in Resources */, AB79018D215B84F20082AE82 /* Icon_DSButtonSelect_420x420.png in Resources */, @@ -6651,7 +6634,6 @@ AB7901A0215B84F20082AE82 /* Icon_MicrophoneRed_256x256.png in Resources */, AB7901A1215B84F20082AE82 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */, AB7901A2215B84F20082AE82 /* SourceSansPro-Bold.otf in Resources */, - ABA67CE72808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */, AB7901A3215B84F20082AE82 /* Image_GuitarGrip.png in Resources */, AB7901A4215B84F20082AE82 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */, AB7901A5215B84F20082AE82 /* README.MAC in Resources */, @@ -6679,7 +6661,6 @@ ABA67D142808B97E00B5208D /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */, AB796CAF15CDCBA200C59155 /* InfoPlist.strings in Resources */, AB796CB015CDCBA200C59155 /* MainMenu.xib in Resources */, - ABA67CF62808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */, AB796CB115CDCBA200C59155 /* Localizable.strings in Resources */, AB796CB215CDCBA200C59155 /* Icon_ActionReplay_32x32.png in Resources */, AB796CB315CDCBA200C59155 /* Icon_CodeBreaker_32x32.png in Resources */, @@ -6746,6 +6727,7 @@ AB796CD815CDCBA200C59155 /* Icon_DSButtonB_420x420.png in Resources */, AB681027187D4AEF0049F2C2 /* Icon_Piano_256x256.png in Resources */, ABDDF7C91898F032007583C1 /* Icon_FrameAdvance_420x420.png in Resources */, + AB3E8AEC2808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */, AB796CD915CDCBA200C59155 /* Icon_DSButtonL_420x420.png in Resources */, AB796CDA15CDCBA200C59155 /* Icon_DSButtonR_420x420.png in Resources */, AB796CDB15CDCBA200C59155 /* Icon_DSButtonSelect_420x420.png in Resources */, @@ -6771,7 +6753,6 @@ ABB0FBD51A9EED350060C55A /* Icon_MicrophoneRed_256x256.png in Resources */, AB68101F187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */, ABA7313B1BB5104200B26147 /* SourceSansPro-Bold.otf in Resources */, - ABA67CE22808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */, ABAB454F187CDB70007BE20C /* Image_GuitarGrip.png in Resources */, AB681021187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */, AB796CEC15CDCBA200C59155 /* README.MAC in Resources */, @@ -6799,7 +6780,6 @@ ABA67D182808B97E00B5208D /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */, AB79FFF0215B84E50082AE82 /* InfoPlist.strings in Resources */, AB79FFF1215B84E50082AE82 /* MainMenu.xib in Resources */, - ABA67CFA2808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */, AB79FFF2215B84E50082AE82 /* Localizable.strings in Resources */, AB79FFF3215B84E50082AE82 /* Icon_ActionReplay_32x32.png in Resources */, AB79FFF4215B84E50082AE82 /* Icon_CodeBreaker_32x32.png in Resources */, @@ -6866,6 +6846,7 @@ AB79002B215B84E50082AE82 /* Icon_DSButtonB_420x420.png in Resources */, AB79002C215B84E50082AE82 /* Icon_Piano_256x256.png in Resources */, AB79002D215B84E50082AE82 /* Icon_FrameAdvance_420x420.png in Resources */, + AB3E8AF02808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */, AB79002E215B84E50082AE82 /* Icon_DSButtonL_420x420.png in Resources */, AB79002F215B84E50082AE82 /* Icon_DSButtonR_420x420.png in Resources */, AB790030215B84E50082AE82 /* Icon_DSButtonSelect_420x420.png in Resources */, @@ -6891,7 +6872,6 @@ AB790043215B84E50082AE82 /* Icon_MicrophoneRed_256x256.png in Resources */, AB790044215B84E50082AE82 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */, AB790045215B84E50082AE82 /* SourceSansPro-Bold.otf in Resources */, - ABA67CE62808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */, AB790046215B84E50082AE82 /* Image_GuitarGrip.png in Resources */, AB790047215B84E50082AE82 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */, AB790048215B84E50082AE82 /* README.MAC in Resources */, @@ -6919,7 +6899,6 @@ ABA67D152808B97E00B5208D /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */, AB8F3C221A53AC2600A80BF6 /* InfoPlist.strings in Resources */, AB8F3C231A53AC2600A80BF6 /* MainMenu.xib in Resources */, - ABA67CF72808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */, AB8F3C241A53AC2600A80BF6 /* Localizable.strings in Resources */, AB8F3C251A53AC2600A80BF6 /* Icon_ActionReplay_32x32.png in Resources */, AB8F3C261A53AC2600A80BF6 /* Icon_CodeBreaker_32x32.png in Resources */, @@ -6986,6 +6965,7 @@ AB8F3C541A53AC2600A80BF6 /* Icon_DSButtonB_420x420.png in Resources */, AB8F3C551A53AC2600A80BF6 /* Icon_Piano_256x256.png in Resources */, AB8F3C561A53AC2600A80BF6 /* Icon_FrameAdvance_420x420.png in Resources */, + AB3E8AED2808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */, AB8F3C571A53AC2600A80BF6 /* Icon_DSButtonL_420x420.png in Resources */, AB8F3C581A53AC2600A80BF6 /* Icon_DSButtonR_420x420.png in Resources */, AB8F3C591A53AC2600A80BF6 /* Icon_DSButtonSelect_420x420.png in Resources */, @@ -7011,7 +6991,6 @@ ABB0FBD71A9EED350060C55A /* Icon_MicrophoneRed_256x256.png in Resources */, AB8F3C6C1A53AC2600A80BF6 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */, ABA7313D1BB5104200B26147 /* SourceSansPro-Bold.otf in Resources */, - ABA67CE32808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */, AB8F3C6D1A53AC2600A80BF6 /* Image_GuitarGrip.png in Resources */, AB8F3C6E1A53AC2600A80BF6 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */, AB8F3C6F1A53AC2600A80BF6 /* README.MAC in Resources */, @@ -7048,7 +7027,6 @@ ABA67D1C2808B97E00B5208D /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */, ABD2CCF626E05CB000FB15F7 /* InfoPlist.strings in Resources */, ABD2CCF726E05CB000FB15F7 /* MainMenu.xib in Resources */, - ABA67CFE2808B97E00B5208D /* Icon_MicrophoneDenied_256x256.png in Resources */, ABD2CCF826E05CB000FB15F7 /* Localizable.strings in Resources */, ABD2CCF926E05CB000FB15F7 /* Icon_ActionReplay_32x32.png in Resources */, ABD2CCFA26E05CB000FB15F7 /* Icon_CodeBreaker_32x32.png in Resources */, @@ -7115,6 +7093,7 @@ ABD2CD3126E05CB000FB15F7 /* Icon_DSButtonB_420x420.png in Resources */, ABD2CD3226E05CB000FB15F7 /* Icon_Piano_256x256.png in Resources */, ABD2CD3326E05CB000FB15F7 /* Icon_FrameAdvance_420x420.png in Resources */, + AB3E8AF42808FDF4007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */, ABD2CD3426E05CB000FB15F7 /* Icon_DSButtonL_420x420.png in Resources */, ABD2CD3526E05CB000FB15F7 /* Icon_DSButtonR_420x420.png in Resources */, ABD2CD3626E05CB000FB15F7 /* Icon_DSButtonSelect_420x420.png in Resources */, @@ -7140,7 +7119,6 @@ ABD2CD4926E05CB000FB15F7 /* Icon_MicrophoneRed_256x256.png in Resources */, ABD2CD4A26E05CB000FB15F7 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */, ABD2CD4B26E05CB000FB15F7 /* SourceSansPro-Bold.otf in Resources */, - ABA67CEA2808B97E00B5208D /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */, ABD2CD4C26E05CB000FB15F7 /* Image_GuitarGrip.png in Resources */, ABD2CD4D26E05CB000FB15F7 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */, ABD2CD4E26E05CB000FB15F7 /* README.MAC in Resources */, diff --git a/desmume/src/frontend/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj b/desmume/src/frontend/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj index 34eb5b9b5..baa1bd541 100755 --- a/desmume/src/frontend/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj +++ b/desmume/src/frontend/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj @@ -838,6 +838,11 @@ AB6A198416CAD66900384EED /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A198216CAD66900384EED /* cocoa_GPU.mm */; }; AB6A198516CAD66900384EED /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A198216CAD66900384EED /* cocoa_GPU.mm */; }; AB6A198616CAD66900384EED /* cocoa_GPU.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6A198216CAD66900384EED /* cocoa_GPU.mm */; }; + AB6D78942809FA43007C6B0A /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB6D78932809FA43007C6B0A /* Icon_MicrophoneIdleNoHardware_256x256.png */; }; + AB6D78952809FA43007C6B0A /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB6D78932809FA43007C6B0A /* Icon_MicrophoneIdleNoHardware_256x256.png */; }; + AB6D78962809FA43007C6B0A /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB6D78932809FA43007C6B0A /* Icon_MicrophoneIdleNoHardware_256x256.png */; }; + AB6D78972809FA43007C6B0A /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB6D78932809FA43007C6B0A /* Icon_MicrophoneIdleNoHardware_256x256.png */; }; + AB6D78982809FA43007C6B0A /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB6D78932809FA43007C6B0A /* Icon_MicrophoneIdleNoHardware_256x256.png */; }; AB700DBA16CDDBC400FBD336 /* DisplayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB700DB816CDDBC400FBD336 /* DisplayWindow.xib */; }; AB700DBB16CDDBC400FBD336 /* DisplayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB700DB816CDDBC400FBD336 /* DisplayWindow.xib */; }; AB700DBC16CDDBC400FBD336 /* DisplayWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = AB700DB816CDDBC400FBD336 /* DisplayWindow.xib */; }; @@ -1159,8 +1164,6 @@ ABA1658F2808BD6A00C8CFF5 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165812808BD6A00C8CFF5 /* Icon_ActionReplay_32x32.png */; }; ABA165902808BD6A00C8CFF5 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165822808BD6A00C8CFF5 /* Icon_CodeBreaker_32x32.png */; }; ABA165912808BD6A00C8CFF5 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165832808BD6A00C8CFF5 /* Icon_DeSmuME_32x32.png */; }; - ABA165922808BD6A00C8CFF5 /* Icon_MicrophoneDenied_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165842808BD6A00C8CFF5 /* Icon_MicrophoneDenied_256x256.png */; }; - ABA165932808BD6A00C8CFF5 /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165852808BD6A00C8CFF5 /* Icon_MicrophoneDenied_DarkMode_256x256.png */; }; ABA165942808BD6A00C8CFF5 /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165862808BD6A00C8CFF5 /* Icon_MicrophoneOff_DarkMode_256x256.png */; }; ABA165952808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165872808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16.png */; }; ABA165962808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165882808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16@2x.png */; }; @@ -1173,8 +1176,6 @@ ABA1659D2808BD6A00C8CFF5 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165812808BD6A00C8CFF5 /* Icon_ActionReplay_32x32.png */; }; ABA1659E2808BD6A00C8CFF5 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165822808BD6A00C8CFF5 /* Icon_CodeBreaker_32x32.png */; }; ABA1659F2808BD6A00C8CFF5 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165832808BD6A00C8CFF5 /* Icon_DeSmuME_32x32.png */; }; - ABA165A02808BD6A00C8CFF5 /* Icon_MicrophoneDenied_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165842808BD6A00C8CFF5 /* Icon_MicrophoneDenied_256x256.png */; }; - ABA165A12808BD6A00C8CFF5 /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165852808BD6A00C8CFF5 /* Icon_MicrophoneDenied_DarkMode_256x256.png */; }; ABA165A22808BD6A00C8CFF5 /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165862808BD6A00C8CFF5 /* Icon_MicrophoneOff_DarkMode_256x256.png */; }; ABA165A32808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165872808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16.png */; }; ABA165A42808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165882808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16@2x.png */; }; @@ -1187,8 +1188,6 @@ ABA165AB2808BD6A00C8CFF5 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165812808BD6A00C8CFF5 /* Icon_ActionReplay_32x32.png */; }; ABA165AC2808BD6A00C8CFF5 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165822808BD6A00C8CFF5 /* Icon_CodeBreaker_32x32.png */; }; ABA165AD2808BD6A00C8CFF5 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165832808BD6A00C8CFF5 /* Icon_DeSmuME_32x32.png */; }; - ABA165AE2808BD6A00C8CFF5 /* Icon_MicrophoneDenied_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165842808BD6A00C8CFF5 /* Icon_MicrophoneDenied_256x256.png */; }; - ABA165AF2808BD6A00C8CFF5 /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165852808BD6A00C8CFF5 /* Icon_MicrophoneDenied_DarkMode_256x256.png */; }; ABA165B02808BD6A00C8CFF5 /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165862808BD6A00C8CFF5 /* Icon_MicrophoneOff_DarkMode_256x256.png */; }; ABA165B12808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165872808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16.png */; }; ABA165B22808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165882808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16@2x.png */; }; @@ -1201,8 +1200,6 @@ ABA165B92808BD6A00C8CFF5 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165812808BD6A00C8CFF5 /* Icon_ActionReplay_32x32.png */; }; ABA165BA2808BD6A00C8CFF5 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165822808BD6A00C8CFF5 /* Icon_CodeBreaker_32x32.png */; }; ABA165BB2808BD6A00C8CFF5 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165832808BD6A00C8CFF5 /* Icon_DeSmuME_32x32.png */; }; - ABA165BC2808BD6A00C8CFF5 /* Icon_MicrophoneDenied_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165842808BD6A00C8CFF5 /* Icon_MicrophoneDenied_256x256.png */; }; - ABA165BD2808BD6A00C8CFF5 /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165852808BD6A00C8CFF5 /* Icon_MicrophoneDenied_DarkMode_256x256.png */; }; ABA165BE2808BD6A00C8CFF5 /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165862808BD6A00C8CFF5 /* Icon_MicrophoneOff_DarkMode_256x256.png */; }; ABA165BF2808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165872808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16.png */; }; ABA165C02808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165882808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16@2x.png */; }; @@ -1215,8 +1212,6 @@ ABA165C72808BD6A00C8CFF5 /* Icon_ActionReplay_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165812808BD6A00C8CFF5 /* Icon_ActionReplay_32x32.png */; }; ABA165C82808BD6A00C8CFF5 /* Icon_CodeBreaker_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165822808BD6A00C8CFF5 /* Icon_CodeBreaker_32x32.png */; }; ABA165C92808BD6A00C8CFF5 /* Icon_DeSmuME_32x32.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165832808BD6A00C8CFF5 /* Icon_DeSmuME_32x32.png */; }; - ABA165CA2808BD6A00C8CFF5 /* Icon_MicrophoneDenied_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165842808BD6A00C8CFF5 /* Icon_MicrophoneDenied_256x256.png */; }; - ABA165CB2808BD6A00C8CFF5 /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165852808BD6A00C8CFF5 /* Icon_MicrophoneDenied_DarkMode_256x256.png */; }; ABA165CC2808BD6A00C8CFF5 /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165862808BD6A00C8CFF5 /* Icon_MicrophoneOff_DarkMode_256x256.png */; }; ABA165CD2808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165872808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16.png */; }; ABA165CE2808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = ABA165882808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16@2x.png */; }; @@ -2057,6 +2052,7 @@ AB6A187B16C9951C00384EED /* EmuControllerDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = EmuControllerDelegate.mm; sourceTree = ""; }; AB6A198116CAD66900384EED /* cocoa_GPU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_GPU.h; sourceTree = ""; }; AB6A198216CAD66900384EED /* cocoa_GPU.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_GPU.mm; sourceTree = ""; }; + AB6D78932809FA43007C6B0A /* Icon_MicrophoneIdleNoHardware_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneIdleNoHardware_256x256.png; path = images/Icon_MicrophoneIdleNoHardware_256x256.png; sourceTree = ""; }; AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail_nand.cpp; sourceTree = ""; }; AB6FE66A26E6F7C2002B2106 /* GPU_Operations_AVX2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GPU_Operations_AVX2.cpp; sourceTree = ""; }; AB6FE66B26E6F7C2002B2106 /* GPU_Operations_AVX2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPU_Operations_AVX2.h; sourceTree = ""; }; @@ -2092,8 +2088,6 @@ ABA165812808BD6A00C8CFF5 /* Icon_ActionReplay_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_ActionReplay_32x32.png; path = images/Icon_ActionReplay_32x32.png; sourceTree = ""; }; ABA165822808BD6A00C8CFF5 /* Icon_CodeBreaker_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_CodeBreaker_32x32.png; path = images/Icon_CodeBreaker_32x32.png; sourceTree = ""; }; ABA165832808BD6A00C8CFF5 /* Icon_DeSmuME_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DeSmuME_32x32.png; path = images/Icon_DeSmuME_32x32.png; sourceTree = ""; }; - ABA165842808BD6A00C8CFF5 /* Icon_MicrophoneDenied_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneDenied_256x256.png; path = images/Icon_MicrophoneDenied_256x256.png; sourceTree = ""; }; - ABA165852808BD6A00C8CFF5 /* Icon_MicrophoneDenied_DarkMode_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneDenied_DarkMode_256x256.png; path = images/Icon_MicrophoneDenied_DarkMode_256x256.png; sourceTree = ""; }; ABA165862808BD6A00C8CFF5 /* Icon_MicrophoneOff_DarkMode_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneOff_DarkMode_256x256.png; path = images/Icon_MicrophoneOff_DarkMode_256x256.png; sourceTree = ""; }; ABA165872808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeFull_DarkMode_16x16.png; path = images/Icon_VolumeFull_DarkMode_16x16.png; sourceTree = ""; }; ABA165882808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon_VolumeFull_DarkMode_16x16@2x.png"; path = "images/Icon_VolumeFull_DarkMode_16x16@2x.png"; sourceTree = ""; }; @@ -3336,10 +3330,9 @@ AB1CC8161AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png */, AB1CC8171AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png */, ABACB7391AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png */, - ABA165842808BD6A00C8CFF5 /* Icon_MicrophoneDenied_256x256.png */, - ABA165852808BD6A00C8CFF5 /* Icon_MicrophoneDenied_DarkMode_256x256.png */, AB1CC8181AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png */, AB1CC8191AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png */, + AB6D78932809FA43007C6B0A /* Icon_MicrophoneIdleNoHardware_256x256.png */, ABA165862808BD6A00C8CFF5 /* Icon_MicrophoneOff_DarkMode_256x256.png */, AB1CC81A1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png */, AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */, @@ -4011,8 +4004,6 @@ ABA1658F2808BD6A00C8CFF5 /* Icon_ActionReplay_32x32.png in Resources */, ABA165902808BD6A00C8CFF5 /* Icon_CodeBreaker_32x32.png in Resources */, ABA165912808BD6A00C8CFF5 /* Icon_DeSmuME_32x32.png in Resources */, - ABA165922808BD6A00C8CFF5 /* Icon_MicrophoneDenied_256x256.png in Resources */, - ABA165932808BD6A00C8CFF5 /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */, ABA165942808BD6A00C8CFF5 /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */, ABA165952808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16.png in Resources */, ABA165962808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16@2x.png in Resources */, @@ -4022,6 +4013,7 @@ ABA1659A2808BD6A00C8CFF5 /* Icon_VolumeOneThird_DarkMode_16x16@2x.png in Resources */, ABA1659B2808BD6A00C8CFF5 /* Icon_VolumeTwoThird_DarkMode_16x16.png in Resources */, ABA1659C2808BD6A00C8CFF5 /* Icon_VolumeTwoThird_DarkMode_16x16@2x.png in Resources */, + AB6D78942809FA43007C6B0A /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4131,8 +4123,6 @@ ABA1659D2808BD6A00C8CFF5 /* Icon_ActionReplay_32x32.png in Resources */, ABA1659E2808BD6A00C8CFF5 /* Icon_CodeBreaker_32x32.png in Resources */, ABA1659F2808BD6A00C8CFF5 /* Icon_DeSmuME_32x32.png in Resources */, - ABA165A02808BD6A00C8CFF5 /* Icon_MicrophoneDenied_256x256.png in Resources */, - ABA165A12808BD6A00C8CFF5 /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */, ABA165A22808BD6A00C8CFF5 /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */, ABA165A32808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16.png in Resources */, ABA165A42808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16@2x.png in Resources */, @@ -4142,6 +4132,7 @@ ABA165A82808BD6A00C8CFF5 /* Icon_VolumeOneThird_DarkMode_16x16@2x.png in Resources */, ABA165A92808BD6A00C8CFF5 /* Icon_VolumeTwoThird_DarkMode_16x16.png in Resources */, ABA165AA2808BD6A00C8CFF5 /* Icon_VolumeTwoThird_DarkMode_16x16@2x.png in Resources */, + AB6D78952809FA43007C6B0A /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4251,8 +4242,6 @@ ABA165C72808BD6A00C8CFF5 /* Icon_ActionReplay_32x32.png in Resources */, ABA165C82808BD6A00C8CFF5 /* Icon_CodeBreaker_32x32.png in Resources */, ABA165C92808BD6A00C8CFF5 /* Icon_DeSmuME_32x32.png in Resources */, - ABA165CA2808BD6A00C8CFF5 /* Icon_MicrophoneDenied_256x256.png in Resources */, - ABA165CB2808BD6A00C8CFF5 /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */, ABA165CC2808BD6A00C8CFF5 /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */, ABA165CD2808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16.png in Resources */, ABA165CE2808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16@2x.png in Resources */, @@ -4262,6 +4251,7 @@ ABA165D22808BD6A00C8CFF5 /* Icon_VolumeOneThird_DarkMode_16x16@2x.png in Resources */, ABA165D32808BD6A00C8CFF5 /* Icon_VolumeTwoThird_DarkMode_16x16.png in Resources */, ABA165D42808BD6A00C8CFF5 /* Icon_VolumeTwoThird_DarkMode_16x16@2x.png in Resources */, + AB6D78982809FA43007C6B0A /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4371,8 +4361,6 @@ ABA165B92808BD6A00C8CFF5 /* Icon_ActionReplay_32x32.png in Resources */, ABA165BA2808BD6A00C8CFF5 /* Icon_CodeBreaker_32x32.png in Resources */, ABA165BB2808BD6A00C8CFF5 /* Icon_DeSmuME_32x32.png in Resources */, - ABA165BC2808BD6A00C8CFF5 /* Icon_MicrophoneDenied_256x256.png in Resources */, - ABA165BD2808BD6A00C8CFF5 /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */, ABA165BE2808BD6A00C8CFF5 /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */, ABA165BF2808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16.png in Resources */, ABA165C02808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16@2x.png in Resources */, @@ -4382,6 +4370,7 @@ ABA165C42808BD6A00C8CFF5 /* Icon_VolumeOneThird_DarkMode_16x16@2x.png in Resources */, ABA165C52808BD6A00C8CFF5 /* Icon_VolumeTwoThird_DarkMode_16x16.png in Resources */, ABA165C62808BD6A00C8CFF5 /* Icon_VolumeTwoThird_DarkMode_16x16@2x.png in Resources */, + AB6D78972809FA43007C6B0A /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4491,8 +4480,6 @@ ABA165AB2808BD6A00C8CFF5 /* Icon_ActionReplay_32x32.png in Resources */, ABA165AC2808BD6A00C8CFF5 /* Icon_CodeBreaker_32x32.png in Resources */, ABA165AD2808BD6A00C8CFF5 /* Icon_DeSmuME_32x32.png in Resources */, - ABA165AE2808BD6A00C8CFF5 /* Icon_MicrophoneDenied_256x256.png in Resources */, - ABA165AF2808BD6A00C8CFF5 /* Icon_MicrophoneDenied_DarkMode_256x256.png in Resources */, ABA165B02808BD6A00C8CFF5 /* Icon_MicrophoneOff_DarkMode_256x256.png in Resources */, ABA165B12808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16.png in Resources */, ABA165B22808BD6A00C8CFF5 /* Icon_VolumeFull_DarkMode_16x16@2x.png in Resources */, @@ -4502,6 +4489,7 @@ ABA165B62808BD6A00C8CFF5 /* Icon_VolumeOneThird_DarkMode_16x16@2x.png in Resources */, ABA165B72808BD6A00C8CFF5 /* Icon_VolumeTwoThird_DarkMode_16x16.png in Resources */, ABA165B82808BD6A00C8CFF5 /* Icon_VolumeTwoThird_DarkMode_16x16@2x.png in Resources */, + AB6D78962809FA43007C6B0A /* Icon_MicrophoneIdleNoHardware_256x256.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/desmume/src/frontend/cocoa/cocoa_input.h b/desmume/src/frontend/cocoa/cocoa_input.h index 104873265..473627bc2 100644 --- a/desmume/src/frontend/cocoa/cocoa_input.h +++ b/desmume/src/frontend/cocoa/cocoa_input.h @@ -32,7 +32,8 @@ class AudioSampleBlockGenerator; - (void) doMicLevelUpdateFromController:(CocoaDSController *)cdsController; - (void) doMicHardwareStateChangedFromController:(CocoaDSController *)cdsController isEnabled:(BOOL)isHardwareEnabled - isLocked:(BOOL)isHardwareLocked; + isLocked:(BOOL)isHardwareLocked + isAuthorized:(BOOL)isAuthorized; - (void) doMicHardwareGainChangedFromController:(CocoaDSController *)cdsController gain:(float)gainValue; @@ -56,6 +57,7 @@ class AudioSampleBlockGenerator; @property (assign) BOOL autohold; @property (assign) NSInteger paddleAdjust; @property (assign) NSInteger stylusPressure; +@property (assign) BOOL hardwareMicAuthorization; @property (readonly) BOOL isHardwareMicAvailable; @property (readonly) BOOL isHardwareMicIdle; @property (readonly) BOOL isHardwareMicInClip; @@ -81,7 +83,8 @@ class AudioSampleBlockGenerator; - (void) handleMicHardwareStateChanged:(CoreAudioInputDeviceInfo *)deviceInfo isEnabled:(BOOL)isHardwareEnabled - isLocked:(BOOL)isHardwareLocked; + isLocked:(BOOL)isHardwareLocked + isAuthorized:(BOOL)isAuthorized; - (void) handleMicHardwareGainChanged:(float)gainValue; @end @@ -101,6 +104,9 @@ public: void StartHardwareMicDevice(); + virtual void SetHardwareMicAuthorized(bool isAuthorized); + virtual bool IsHardwareMicAuthorized(); + virtual bool IsHardwareMicAvailable(); virtual void ReportAverageMicLevel(); @@ -123,6 +129,7 @@ uint8_t CASampleReadCallback(void *inParam1, void *inParam2); void CAHardwareStateChangedCallback(CoreAudioInputDeviceInfo *deviceInfo, const bool isHardwareEnabled, const bool isHardwareLocked, + const bool isHardwareAuthorized, void *inParam1, void *inParam2); void CAHardwareGainChangedCallback(float normalizedGain, void *inParam1, void *inParam2); diff --git a/desmume/src/frontend/cocoa/cocoa_input.mm b/desmume/src/frontend/cocoa/cocoa_input.mm index 0f79456ea..1449904b9 100644 --- a/desmume/src/frontend/cocoa/cocoa_input.mm +++ b/desmume/src/frontend/cocoa/cocoa_input.mm @@ -34,6 +34,7 @@ @dynamic autohold; @dynamic paddleAdjust; @synthesize stylusPressure; +@dynamic hardwareMicAuthorization; @dynamic isHardwareMicAvailable; @dynamic isHardwareMicIdle; @dynamic isHardwareMicInClip; @@ -84,6 +85,16 @@ return inputHandler; } +- (void) setHardwareMicAuthorization:(BOOL)isAuthorized +{ + inputHandler->SetHardwareMicAuthorized((isAuthorized) ? true : false); +} + +- (BOOL) hardwareMicAuthorization +{ + return (inputHandler->IsHardwareMicAuthorized()) ? YES : NO; +} + - (BOOL) isHardwareMicAvailable { return (inputHandler->IsHardwareMicAvailable()) ? YES : NO; @@ -237,6 +248,7 @@ - (void) handleMicHardwareStateChanged:(CoreAudioInputDeviceInfo *)deviceInfo isEnabled:(BOOL)isHardwareEnabled isLocked:(BOOL)isHardwareLocked + isAuthorized:(BOOL)isAuthorized { NSAutoreleasePool *tempPool = [[NSAutoreleasePool alloc] init]; @@ -261,11 +273,12 @@ inputHandler->ClearAverageMicLevel(); inputHandler->ReportAverageMicLevel(); - if ( (delegate != nil) && [delegate respondsToSelector:@selector(doMicHardwareStateChangedFromController:isEnabled:isLocked:)] ) + if ( (delegate != nil) && [delegate respondsToSelector:@selector(doMicHardwareStateChangedFromController:isEnabled:isLocked:isAuthorized:)] ) { [[self delegate] doMicHardwareStateChangedFromController:self isEnabled:isHardwareEnabled - isLocked:isHardwareLocked]; + isLocked:isHardwareLocked + isAuthorized:isAuthorized]; } [tempPool release]; @@ -319,9 +332,19 @@ void MacInputHandler::StartHardwareMicDevice() this->_CAInputDevice->Start(); } +void MacInputHandler::SetHardwareMicAuthorized(bool isAuthorized) +{ + this->_CAInputDevice->SetHardwareAuthorized(isAuthorized); +} + +bool MacInputHandler::IsHardwareMicAuthorized() +{ + return this->_CAInputDevice->IsHardwareAuthorized(); +} + bool MacInputHandler::IsHardwareMicAvailable() { - return ( this->_CAInputDevice->IsHardwareEnabled() && !this->_CAInputDevice->IsHardwareLocked() ); + return ( this->_CAInputDevice->IsHardwareEnabled() && !this->_CAInputDevice->IsHardwareLocked() && this->_CAInputDevice->IsHardwareAuthorized() ); } void MacInputHandler::ReportAverageMicLevel() @@ -388,13 +411,15 @@ uint8_t CASampleReadCallback(void *inParam1, void *inParam2) void CAHardwareStateChangedCallback(CoreAudioInputDeviceInfo *deviceInfo, const bool isHardwareEnabled, const bool isHardwareLocked, + const bool isHardwareAuthorized, void *inParam1, void *inParam2) { CocoaDSController *cdsController = (CocoaDSController *)inParam1; [cdsController handleMicHardwareStateChanged:(CoreAudioInputDeviceInfo *)deviceInfo isEnabled:((isHardwareEnabled) ? YES : NO) - isLocked:((isHardwareLocked) ? YES : NO)]; + isLocked:((isHardwareLocked) ? YES : NO) + isAuthorized:((isHardwareAuthorized) ? YES : NO)]; } void CAHardwareGainChangedCallback(float normalizedGain, void *inParam1, void *inParam2) diff --git a/desmume/src/frontend/cocoa/coreaudiosound.cpp b/desmume/src/frontend/cocoa/coreaudiosound.cpp index 212d4e680..8bd184adb 100644 --- a/desmume/src/frontend/cocoa/coreaudiosound.cpp +++ b/desmume/src/frontend/cocoa/coreaudiosound.cpp @@ -49,6 +49,7 @@ CoreAudioInput::CoreAudioInput() _isPaused = true; _isHardwareEnabled = false; _isHardwareLocked = true; + _isHardwareAuthorized = true; _captureFrames = 0; _auHALInputDevice = NULL; @@ -514,7 +515,7 @@ void CoreAudioInput::Start() this->_isHardwareEnabled = false; } - if (this->IsHardwareEnabled() && !this->IsHardwareLocked() && !this->GetPauseState()) + if (this->IsHardwareEnabled() && this->IsHardwareAuthorized() && !this->IsHardwareLocked() && !this->GetPauseState()) { AudioOutputUnitStart(this->_auHALInputDevice); } @@ -532,6 +533,7 @@ void CoreAudioInput::Start() this->_hwStateChangedCallbackFunc(&this->_hwDeviceInfo, this->IsHardwareEnabled(), this->IsHardwareLocked(), + this->IsHardwareAuthorized(), this->_hwStateChangedCallbackParam1, this->_hwStateChangedCallbackParam2); } @@ -575,6 +577,22 @@ bool CoreAudioInput::IsHardwareLocked() const return this->_isHardwareLocked; } +bool CoreAudioInput::IsHardwareAuthorized() const +{ + return this->_isHardwareAuthorized; +} + +void CoreAudioInput::SetHardwareAuthorized(bool isAuthorized) +{ + const bool didStateChange = (this->_isHardwareAuthorized != isAuthorized); + + this->_isHardwareAuthorized = isAuthorized; + if (didStateChange) + { + this->SetPauseState( this->GetPauseState() ); + } +} + bool CoreAudioInput::GetPauseState() const { return this->_isPaused; @@ -582,22 +600,24 @@ bool CoreAudioInput::GetPauseState() const void CoreAudioInput::SetPauseState(bool pauseState) { - if (pauseState && !this->GetPauseState()) + if (!this->_isPaused && pauseState) { + this->_isPaused = true; + apple_unfairlock_lock(this->_unfairlockAUHAL); AudioOutputUnitStop(this->_auHALInputDevice); apple_unfairlock_unlock(this->_unfairlockAUHAL); AUGraphStop(this->_auGraph); } - else if (!pauseState && this->GetPauseState() && !this->IsHardwareLocked()) + else if (this->_isPaused && !pauseState) { + this->_isPaused = false; + apple_unfairlock_lock(this->_unfairlockAUHAL); AudioOutputUnitStart(this->_auHALInputDevice); apple_unfairlock_unlock(this->_unfairlockAUHAL); AUGraphStart(this->_auGraph); } - - this->_isPaused = (this->IsHardwareLocked()) ? true : pauseState; } float CoreAudioInput::GetNormalizedGain() const @@ -683,15 +703,18 @@ void CoreAudioInput::UpdateHardwareLock() hardwareLocked = true; } + const bool didStateChange = (this->_isHardwareLocked != hardwareLocked); this->_isHardwareLocked = hardwareLocked; - if (this->_isHardwareLocked && !this->GetPauseState()) + + if (didStateChange) { - this->SetPauseState(true); + this->SetPauseState( this->GetPauseState() ); } this->_hwStateChangedCallbackFunc(&this->_hwDeviceInfo, this->IsHardwareEnabled(), this->IsHardwareLocked(), + this->IsHardwareAuthorized(), this->_hwStateChangedCallbackParam1, this->_hwStateChangedCallbackParam2); } @@ -708,7 +731,7 @@ uint8_t CoreAudioInput::generateSample() { uint8_t theSample = MIC_NULL_SAMPLE_VALUE; - if (this->_isPaused) + if ( this->GetPauseState() || !this->IsHardwareEnabled() || this->IsHardwareLocked() || !this->IsHardwareAuthorized() ) { return theSample; } @@ -866,6 +889,7 @@ void CoreAudioInputAUHALChanged(void *inRefCon, void CoreAudioInputDefaultHardwareStateChangedCallback(CoreAudioInputDeviceInfo *deviceInfo, const bool isHardwareEnabled, const bool isHardwareLocked, + const bool isHardwareAuthorized, void *inParam1, void *inParam2) { diff --git a/desmume/src/frontend/cocoa/coreaudiosound.h b/desmume/src/frontend/cocoa/coreaudiosound.h index e849be7ec..f01ee1b0b 100644 --- a/desmume/src/frontend/cocoa/coreaudiosound.h +++ b/desmume/src/frontend/cocoa/coreaudiosound.h @@ -40,6 +40,7 @@ typedef CoreAudioInputDeviceInfo CoreAudioInputDeviceInfo; typedef void (*CoreAudioInputHardwareStateChangedCallback)(CoreAudioInputDeviceInfo *deviceInfo, const bool isHardwareEnabled, const bool isHardwareLocked, + const bool isHardwareAuthorized, void *inParam1, void *inParam2); @@ -75,6 +76,7 @@ private: CoreAudioInputDeviceInfo _hwDeviceInfo; bool _isHardwareEnabled; bool _isHardwareLocked; + bool _isHardwareAuthorized; OSStatus InitInputAUHAL(UInt32 deviceID); @@ -93,6 +95,8 @@ public: bool IsHardwareEnabled() const; bool IsHardwareLocked() const; + bool IsHardwareAuthorized() const; + void SetHardwareAuthorized(bool isAuthorized); bool GetPauseState() const; void SetPauseState(bool pauseState); float GetNormalizedGain() const; @@ -174,6 +178,7 @@ OSStatus CoreAudioOutputRenderCallback(void *inRefCon, void CoreAudioInputDefaultHardwareStateChangedCallback(CoreAudioInputDeviceInfo *deviceInfo, const bool isHardwareEnabled, const bool isHardwareLocked, + const bool isHardwareAuthorized, void *inParam1, void *inParam2); diff --git a/desmume/src/frontend/cocoa/images/Icon_MicrophoneDenied_256x256.png b/desmume/src/frontend/cocoa/images/Icon_MicrophoneDenied_256x256.png deleted file mode 100644 index c3f8ec69400c1499363e80c01e56f28bc3ce3c27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8056 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 J8dHzx{|8Zl_(A{x diff --git a/desmume/src/frontend/cocoa/images/Icon_MicrophoneDenied_DarkMode_256x256.png b/desmume/src/frontend/cocoa/images/Icon_MicrophoneDenied_DarkMode_256x256.png deleted file mode 100644 index 3e50e14546c18481ea557fe568c058724f52f615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9819 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
    d84DSPV8 zg{XpH&uo9u=K;|LE;x99aC>F^sISznzG-Y~N)z2)I}sar#X*=l2}rMA~9!rNTB70%N(>ajHP^D++j6AjOpBS zlqNyWVMd0C?Z{SAzf@<*<)Zl-H`qC7RQ~e9sXXE6 zqA4*X*XD8Pri;LIblf@*VEGEQh=BUK9~#!c-rWJWLABQM>r0p(2Xp(J@tiSp@hoa4 zA0T4(Qi5$!0I+YIdR?xK>CwvDAl`1*E9wcnM$m3tWq5>d$BPiGPY#R*w?l13loAJE zk0PAp-7aM%2}R*+Q%Fo~5H}DRO{%e_x5>+7#2uw2XU4o-JOMCMIMF`U>E6}mL5HC{ zYpmoIr@-mz2+a931ZB1({^266lKg@^()Pm|T{GFmH@Bqjio3#4Ng~HEs3S0{5dh*7 zA)a_uG(&v{`)9PMMg3FkTZw=(;$FX6pB0j(kxvgYhFlfDx0oj2G1{dvG_BB6W>Myv zVl2Sd4)(vE%hF2zYqXdvoh0j=QgP&^&2bMmmdcscIO4@0E#oU)j1gMgQQfGlv+?*3 zux?gehyePi{N?)DPG#wla=O-M4uZQBgUg-Ji!5t3G5a20Jmo^i1-J}$@n5YQNqph& z#I`iqt*WFoBxCU;&WUMOO{wWFrk~fCTF2<2^&PBmsp7Zf`zv2WBy?pN&1!)1-$KS? zyW(k?ln$F`8U2wDu06p-k3aKpl=-tdK>(kh054jy2KJ>48qa$sd6kv&dh1G_ zMw)L1OP0PvJdM)`;bsjR)&QvW+61VGuPUO$Oyb4Xk;vq|1UiM&yCM4gz*RU(YHSAb*aU5oT{1hOZyk{3lqT*susL`-*RVT zUzYd98;#(P?vYuA+<>f6s6g3Fd&~$M&>kaNwoAy7Md00eH?j3Eu`)~+GZxN?Pz;aa zrW~9bC?uvih-U$2Z4-1B2m&ul1@lvBzyhs8(!oHoo`0h8Kw0prh57$^{7bTZk6wpn zjLoOX!5}JYDMj4C+iOs(7`5ldJr1EvwNPvxJj9X(f9G+;H6@&YxS1^UI#L?YL36JS z(s{!1c|FDuBvl=My^QMc$y-tmTUwlKfC)ZekuDI`wif#b{wrPC>-|?5C}aZ6QY%$B ztEMLT(%FuGBkp%NTC{FkS+_lEuJo60p!!}-47+jnU-|EkO3FuekhoB z%4Q>UmsT* zPS26davgl-HHLg8Z=eXbH;`F+4B#%g7eU+K+oMa4wjrh*uFA^-u9iBbV(_pHp$Yiw z7pb%sfWT)T;M7KdF^0}1V(kO#F5{=DM~G_?AlvRNO2(Va{46`$!~pvY#S zk?aX!7|1TOmpKM0vpFIN1z`!bJH^*j>)`Kc(>JOWqt5{*U7!@m@_~@fv$C;Nxo9PL zxj2V1#^-mPp+uY}SYjd(fC>QgLCI<4m|MkyYMYS&w3oIyuR>po)S|~fy71TsfM)Pi zD}N~eEU(rv4v*xn=sweWmkGtxz`~|LIr4+uo87$9>GDpOo1)JK^*gwsPk?U{50LHygAR3S;mZ3;?S51bvCw&<_1sE8ftZaXifx!Rm z@9z(n2H`alcmu}QnS$$iA`>;9(;UnP2eS^0<%rr)2q{ktSo2}Qp5i@IE)6VN4@dv) zxzIpn%DMvdJ449qA@<4QYrnH&{FXteRF|Iyit}}TGmVjvkyPcsIyGJrJb}3HeE9u7 z;u*ZpTJ3F|5-aGVa{&FG&Tp;E3xsI0`+GMymmjy7Z0O28hx)C*3j>@Pnvd(`IH;U3 zxO(5XqN3tPIVVBy>CthrDM6)`9>@x9cG8nih}sh}&NUBZm`)UWe4^Yk?y`>z>l>(j z{JfeY$WP4;ESy_-lnUDU=Qbg^L#jgoST~gfzJ0 z1g+A0T!Tl-9B|H?)Sfg#FcHV=D6Hh-Bm5P}-XQYua}O+3NkL8uB2%6%OjDLD^6!+NRnh)@;2ev!&1un%p0cp4g3B>2nC$t?GLEpIDzlmyNw(yumq&T@x0s1;(ROh>i9{EcYF5d#L2Y&knWSGB z3jX{1+fiJ{tp^sHk)EpM_)Z{L4I?s~)vK8253 zwApx3et!NR`P8y514o^pBbV>{oJPA^;vR2-fQ3gk5adsF{6WTPbkV^dUSxOSw{PEC zf3`%9q-#Fjb63Vq>QDkHGTnlBG=!|Gv=b=}ICCR*M+~V344q@4^SkRa%>Qud7Bi#_ z1fBvEYe$1GhuH3;_J?%Q8ex1UtZ05h!&Lg+fVDGZVU2 zX`8Jf7rpL-vTtRuA#CLYsyJ$!Bi^Qxykp5^G6o&rVIi5ip&mmZ5N30YlIyU=R_i+Y z`t5SvZw_C0Y-{-eOl%0px*Y7WfV@mrvrQ};^waS0u;}Udj``m7i~d*7CL7&gg|@V` zlw7)W$Y0EDl5ZDK5 z4?9SvPk~|lO;jo=Dg}o#E;V|l`^y=N9f>uTQaZ1yTAOPne;yPoK0dyPfq~(HChm~_ zP3S@GPi5yf^!hj1&ldJS-h-Q*xae1W7sTit?rEfo3UsB%_{UWcQ*PHT)zP9Jf4M~V z$Cm-qiDit0W-67MxxKv|`fz2edPnV*(v6p`qOW zqR5|sL)!eR1~}`UyUCU$*Ru)`SwCJ+y7_?i0vsuuOUfUL9ig?S!8l;kK*kpfN5Qs1 zi+x3i0hYDdC>HHvZG-sGb<23oahpim+s(QbVo>QO`sNY{e0TN+GwTQ zDsHhLZ>%pkAb%(|F46*g+ zMU*ew#aTD58>%a!89!~LeB1J`8+*oUKDlC$k&Ld-%=~J7G(wUpnYUj0VB`^)kpJ=I z>UijCI#~gNvytb;W~li@9PIC8Bf-?GgqD_?stD2sD}3e!gM8Q$8|7Q4Nz&IsWs%2r zd0vL0*0N!uEZaklc319M{nYaNx^sa3)Ybjr$KhC1!xphJXmeSR-Fl?}R%_6zi@=@d(!QBDr{xalHIo zk{PE<=AU7D$tszAD4Yy1Te3RpFg~*fRf_qY!Rd7vT+hC1M`^*{0+|37JV<3|Fa=7zV-ZO7sm z-IJp5(3>0llDYpRETXMcAGi^Y*h6@($Mlz8c8N(e3Uf@FipLjBa(OXnazZ5o9;ISG z|7auctjweOQi3G8(nVbNw@3)hQ)0yHARNYMq)lUaD|P)uy?{ys*G@qrzWXP8tFPqh zuIxG95e@l++DUk;!patwM-7tyh3p|)O(#B`RWK;SyTwKXwfK13HL!_);5gIH&DOQYM4jRjM!Qjc zd@SMZF()n#2dz<>cU%=yc*F5fvHWzh1J~iDi|XC)QjeHJPAIiM(1+0+b<53QX912) z_Y~YoVo~j}_}O5UwIs<2K29Iit{S{s<>>uC{ckV%pHTCjP5v;tY^jVVm%+3wfTyNH zct-rrwKk7lkU0sj|5GPd@$!J4M>t|thc=w05h%7nXr?EqWfujs$AZIEqJ*3%R5QZ5 zt(JR^kWJKJP;h>KHc~02dp6!wlhzEfUkfTM;X2C6`g{aWXeRQG9H8@Vi=2mdXcJzv z=8=r=Sf84jI;!@W@7>mwSl8^9NY7mqUdumMejTKf<2Uh+9kI=d-6Ho@wz+SsNM#?H z;&Dt3z5+OJ{@sjOqh7RKZ!kaq31MM*_3a-nB)>lspK$Ym_BVOP$MV^x|Fp?R-TQfs7mH#N(Yw+yFQ+2VG+A8naKbAR*v8ImX~?Fk9t23Aug_;k zwV!n1mIz0QZ_TIH$I#XXC!F_A$m0gS8xfr)PNOcKaw9rO5IW*dn@VMZwC8l^Ek&H! z)isy%st3N@Vjy{)Jk0v&(W8m|jGc!0E)5M05m)v@!z{ktJfiNbcf19n`@=*Ys*vLqD{+!N#34W`RG><$Vkn9^cdeJgUrnGna0DECy_bg4kyj5 zyk8SKk~|TIkaGRcOC{f1_PQRd|L!0#B&pvi-!_OtL}G4NS9!z;~001q}|Z zZ_)#X6niq`4d#y^xYI47xSQ){S@W4_mk$qTzDx{&$;L^Vy>bngiqp1zm0^xz@i7cr zH)n`nO9VUT#J^D5g*w~|#?{y>xsEM8A@`Y2DLUw(+ln@VOggvf&V6QPPKzvm)tGu3 zim~^J#M}#4e~^&x8ciR+NSv3hmb`;hs@{ezY_-olj<#xS@}vvYv%*@^itwh;%wYqu zF(AKyM%d5Q9%Hqm+Yd}v_$QJnXTHlFsK0hT#_GV!{PZP%+jNf4wFu6`S544?abMPr zAneyfK1`!!DaU&izLG3&J%b3ez~MPpsaBPJek|{?6p8XjK}i!4I%2;7rf3?BSt)qO zJ}zba(al`OMjj=-Kz*J_`)!*rfqUB}PGRkTFTZt{evzV&yZrf3oMwEGfqRp3dZ+h? zc87Y=DIVyz9>~*PI%;OtDOkqCOMkNV-18RV=aizHk&?d)s+B{$cbHz%imqAS5svSt zi*o%Txks-mSSM%xPOH*6v{o_hi8EDwrv@^~VhL1E4EbkgkD?|(mpdu8E8<$%6^p8m zy)*3A?aY;JYP7n`=8Cx0zZ<%OA>|M!my#zGOOR20NU=dGr+bp3L+I-G*GG5Die{ID zP)jqOi92KV;a{`9zbBnii<(CdB+nB|#m+qtm@E_JpWwbd!eQGBJq;3yfp9Y{l~WhC zT~5xB{rkdww{b%3J@xOa0|Wpt@cyd>n7aP`UV{uE%_Ps|>%0f)-uQ7ERV0x4dPhkt zLV9Q>1_3yZaLTtYUXF$@szUQGZYrQ8%H{TcglpX_E;@02X4UT*aw^O^q*6k6$BkR5 z%j;NW(Rv^Ssx@7(ibP^K z>XUUkw0;N4)6EdOtH%%;+xMO;_Omh(aY2L2ecM91p~oou08N$0Ust?UaaDr{6*{~Z zdbWQcd8{219(3?YY;B(yZelVa4(@fCud3@Wh%$xG43C<*<{HCTpU2s%`MN!6K6~uY zsryg;5KlnC4ACZHnh%p?ICa%pjeUAK_jyFbZ6hC6SG7$~r(R2gRsra%)XXPj@T_#+ zef^7(E<>~OUT#+ZsiVU_0`AMk$EjWfp4773E_y2{@Q*4sV{ay{(ahP_;l)(wS!KY# zOiV^lD|2M^sajrhFwgv5}>mw9JoostCK34ILQp4?U0TX4!diyF0A@*rn^_ zR&$d-YL*e0`l^SYp@f`N(nqQS0!oh07pskJXVA89O1{0#t~nQm$Jr7!;6z#U`_sEN zI<6t%n6E$<)d65Db_x?UuP2DqeFw_1=NQ^)Z5L4WI$}=&vrPqdroUTTh@~B@%{Dx!mnq}dx4%u?E$YMSG zfBrDe{c!KKrSezCnir$5uP+puG`s6`=J;l%agYQYyvoqm5XIz0}2 zjiJ!%-~1#8^k3I>%seoD*kzbd*XvXWA<0HhI@O(j+bFrap)Jiq*bBp$_lQ2&+Sv&P z5w0gB^!To_v0dm0OUH;KhfvAWR6-`=Bic@|7^cch=UF3GiIWV?1{dMFp{lPfHb=rs zKU*Bw$ziJ#$ZwoOd@1|c8$n~}YKYSC>#Qtfz9^`k!~V!4v-Fb4B! ziU1}acu*$-4_{Lv?+?+Hqv3B}H;U|6NhsrL#nwXC@4piU)_QiQ(QYF}pc&S5C|B1P z!w#o(A^{kg4<9MV22sY{4fhD@(Ufo1WHht9$m-Y;sid;xFxkNd9qf_H)9 zZ*&)u9HFH)8ln}SfIOSR;$)iToMviB2i3t4ZuZ9j(?cpRA79lLrd^O@FBlUDP(U5_ zDQ*(IqM?OC%<^6IE(k^q9M?e@zL7-xFzB}jF7I4>qW;q&Sx&-ju#VuV=nOI4;B2`- zrK??!gH-OoU9b#A%c3&afyCH5MCoK`I%|WSaEHqCy)&BBv*O)Mh5<$dd@3#$X^=ON zfhSiA#<*>L9%^{r-M#1Vhc-mFBw$9nO;cLh!%r~`(Qlg(&yVLXbiE6gV(0>o4eltf zWui7)?J1owQ`l;fO0ju?s}5!IS8NFL5nEKvjmU%OgfQ@&FW2S*eDMoC7Ze^_ki~PqRu^xJ_=ccpTCx|F(YgFCV_kP(W3s_|E1mv fti_@Z9x*bvunp#$+GBUEgyLdnySj!1r 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 literal 20287 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

    ATR_20fEoljisM>x&e}PfWU6 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 C@~nCQ diff --git a/desmume/src/frontend/cocoa/images/Icon_MicrophoneIdleNoHardware_256x256.png b/desmume/src/frontend/cocoa/images/Icon_MicrophoneIdleNoHardware_256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..5512048b999816525f64ce640576b3403621c729 GIT binary patch literal 10711 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 - - 1060 - 17G3025 - 851 - 1561.60.100 - 911.10 - - com.apple.InterfaceBuilder.CocoaPlugin - 851 - - - - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - - DisplayWindowController - - - FirstResponder - - - NSApplication - - - 271 - 2 - {{830, 370}, {256, 408}} - 74973184 - DeSmuME - NSWindow - - - D5552DCE-722B-4ECB-8E0A-8B7CF76EAC70 - - - YES - YES - YES - YES - 1 - 2 - - - - 0135754F-463F-4625-9D27-DEF701AEF50E - - Open ROM - Open ROM - - - - NSImage - Icon_OpenROM_420x420 - - - - {0, 0} - {0, 0} - YES - YES - -1 - YES - 0 - - - - 039A3D54-15EA-4743-88B7-60517113C193 - - Toggle Displays - Toggle Displays - - - - NSImage - Icon_DisplayToggle_420x420 - - - - {0, 0} - {0, 0} - YES - YES - -1 - YES - 0 - - - - 2E728430-6055-404B-944F-25594ACBEC39 - - Execute - Execute/Pause - - - - NSImage - Icon_Execute_420x420 - - - - {0, 0} - {0, 0} - YES - YES - -1 - YES - 0 - - - - 321036F9-6034-47B1-9CC5-2461D98700F0 - - Reset - Reset - - - - NSImage - Icon_Reset_420x420 - - - - {0, 0} - {0, 0} - YES - YES - -1 - YES - 0 - - - - 41A299FB-4A95-4FA3-9982-8523FF04ACDE - - Rotate Right - Rotate Right - - - - NSImage - Icon_RotateCW_420x420 - - - - {0, 0} - {0, 0} - YES - YES - 90 - YES - 0 - - - - 8A505B61-7B2E-49ED-B6A0-DBE0A72DB48D - - Enable HUD - Enable/Disable HUD - - - - NSImage - Icon_ShowHUD_420x420 - - - - {0, 0} - {0, 0} - YES - YES - -1 - YES - 0 - - - - C626F2C1-4353-4288-AD59-40FB7F4C1A58 - - Rotate Left - Rotate Left - - - - NSImage - Icon_RotateCCW_420x420 - - - - {0, 0} - {0, 0} - YES - YES - -90 - YES - 0 - - - - D3628D4D-C39F-4CC3-B82F-7CC0F699B953 - - Frame Advance - Frame Advance - - - - NSImage - Icon_FrameAdvance_420x420 - - - - {0, 0} - {0, 0} - YES - YES - -1 - YES - 0 - - - - EDBFD998-E031-4AC5-A86A-7114D66FF847 - - Speed 2x - Speed 1x/2x - - - - NSImage - Icon_Speed2x_420x420 - - - - {0, 0} - {0, 0} - YES - YES - 200 - YES - 0 - - - NSToolbarFlexibleSpaceItem - - Flexible Space - - - - - - {1, 5} - {20000, 32} - YES - YES - -1 - YES - 0 - - YES - YES - - - 1048576 - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - - - - NSToolbarSpaceItem - - Space - - - - - - {32, 5} - {32, 10000} - YES - YES - -1 - YES - 0 - - YES - YES - - - 1048576 - 2147483647 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {1.7976931348623157e+308, 1.7976931348623157e+308} - {256, 408} - - - - 256 - - - - - 5156 - {{2, 3}, {16, 16}} - - 28938 - 100 - - - - - 294 - {{17, 5}, {137, 14}} - - YES - - 68157504 - 272634880 - - - .SFNSText - 11 - 3088 - - Status Text - - - 6 - System - controlColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 6 - System - controlTextColor - - 3 - MAA - - - - NO - 2 - - - - - 289 - {{192, -1}, {40, 26}} - - YES - - -2076180416 - 134219776 - - .SFNSText - 13 - 1040 - - - -2043002880 - 34 - - LucidaGrande - 13 - 16 - - - - 400 - 75 - - - YES - - - 2147483647 - 1 - - NSImage - Icon_VolumeFull_16x16 - - - - _popUpItemAction: - - - YES - - OtherViews - - - - - Volume - - 2147483647 - - - _popUpItemAction: - - - - - - YES - 1 - YES - YES - 2 - - NO - - - - - 289 - {{151, -1}, {42, 26}} - - YES - - -2076180416 - 134219776 - - - -2043002880 - 162 - - - - 400 - 75 - - - YES - - - 2147483647 - 1 - - NSImage - Icon_MicrophoneBlack_256x256 - - - - _popUpItemAction: - - - YES - - OtherViews - - - - - Gain - - 2147483647 - - - _popUpItemAction: - - - - - - YES - 1 - YES - YES - 2 - - NO - - - {256, 408} - - {{0, 0}, {1920, 1177}} - {256, 477} - {1.7976931348623157e+308, 1.7976931348623157e+308} - YES - - - - - 268 - - - - - 268 - {{2, 0}, {49, 18}} - - YES - - 67108864 - 131072 - Mute - - - 1211912448 - 2 - - NSImage - NSSwitch - - - NSSwitch - - - - 200 - 25 - - NO - - - - - 268 - {{-3, 20}, {66, 11}} - - - YES - - 68157504 - 138679296 - - .SFNSText - 9 - 3600 - - - - - - - - - - - - - - -∞ - - - +∞ - - - #0.0% - #0.0% - - - - - - - - NaN - - - - 0 - 0 - YES - NO - 1 - AAAAAAAAAAAAAAAAAAAAAA - - - - 3 - YES - YES - YES - - . - , - NO - NO - YES - - %1.1f%% - - - - - NO - 2 - - - - - 268 - {{17, 31}, {21, 105}} - - - YES - - 604242176 - 0 - - - 100 - 0.0 - 0.0 - 0.0 - 0 - 0 - NO - YES - - NO - - - {55, 139} - - NSView - - - - - 268 - - - - - 268 - {{-1, 6}, {51, 11}} - - YES - - 68157504 - 138679296 - - - - - - - - - - - - - - - - - - #0.0% - #0.0% - - - - - - - - NaN - - - - - - 3 - YES - YES - YES - - . - , - NO - NO - YES - - %1.1f%% - - - - - NO - 2 - - - - - 268 - {{12, 17}, {21, 105}} - - - YES - - 67371264 - 0 - - - 100 - 0.0 - 100 - 0.0 - 0 - 0 - NO - YES - - NO - - - {45, 125} - - NSView - - - - - - - hidden: isShowingStatusBar - - - - - - hidden: isShowingStatusBar - hidden - isShowingStatusBar - - NSValueTransformerName - NSNegateBoolean - - 2 - - - 54 - - - - changeCoreSpeed: - - - - 56 - - - - changeRotationRelative: - - - - 57 - - - - changeRotationRelative: - - - - 58 - - - - openRom: - - - - 60 - - - - delegate - - - - 62 - - - - value: emuControl.statusText - - - - - - value: emuControl.statusText - value - emuControl.statusText - - - - - - 2 - - - 67 - - - - animate: emuControl.isWorking - - - - - - animate: emuControl.isWorking - animate - emuControl.isWorking - 2 - - - 68 - - - - reset: - - - - 107 - - - - toggleExecutePause: - - - - 108 - - - - window - - - - 109 - - - - hidden: isShowingStatusBar - - - - - - hidden: isShowingStatusBar - hidden - isShowingStatusBar - - NSValueTransformerName - NSNegateBoolean - - 2 - - - 131 - - - - hidden: isShowingStatusBar - - - - - - hidden: isShowingStatusBar - hidden - isShowingStatusBar - - NSValueTransformerName - NSNegateBoolean - - 2 - - - 133 - - - - image: emuControl.currentVolumeIcon - - - - - - image: emuControl.currentVolumeIcon - image - emuControl.currentVolumeIcon - 2 - - - 135 - - - - value: emuControl.currentVolumeValue - - - - - - value: emuControl.currentVolumeValue - value - emuControl.currentVolumeValue - 2 - - - 138 - - - - changeVolume: - - - - 141 - - - - outputVolumeMenuItem - - - - 142 - - - - microphoneGainMenuItem - - - - 144 - - - - value: emuControl.currentVolumeValue - - - - - - value: emuControl.currentVolumeValue - value - emuControl.currentVolumeValue - - - - - 2 - - - 157 - - - - hidden: isShowingStatusBar - - - - - - hidden: isShowingStatusBar - hidden - isShowingStatusBar - - NSValueTransformerName - NSNegateBoolean - - 2 - - - 159 - - - - outputVolumeControlView - - - - 160 - - - - hidden: isShowingStatusBar - - - - - - hidden: isShowingStatusBar - hidden - isShowingStatusBar - - NSValueTransformerName - NSNegateBoolean - - 2 - - - 167 - - - - microphoneGainControlView - - - - 183 - - - - image: emuControl.currentMicStatusIcon - - - - - - image: emuControl.currentMicStatusIcon - image - emuControl.currentMicStatusIcon - 2 - - - 184 - - - - microphoneGainSlider - - - - 203 - - - - microphoneMuteButton - - - - 204 - - - - changeHardwareMicGain: - - - - 207 - - - - enabled: emuControl.isHardwareMicAvailable - - - - - - enabled: emuControl.isHardwareMicAvailable - enabled - emuControl.isHardwareMicAvailable - 2 - - - 218 - - - - enabled: emuControl.isHardwareMicAvailable - - - - - - enabled: emuControl.isHardwareMicAvailable - enabled - emuControl.isHardwareMicAvailable - 2 - - - 220 - - - - value: emuControl.cdsCoreController.content.cdsController.hardwareMicMute - - - - - - value: emuControl.cdsCoreController.content.cdsController.hardwareMicMute - value - emuControl.cdsCoreController.content.cdsController.hardwareMicMute - 2 - - - 224 - - - - toolTip: emuControl.cdsCoreController.content.cdsController.hardwareMicInfoString - - - - - - toolTip: emuControl.cdsCoreController.content.cdsController.hardwareMicInfoString - toolTip - emuControl.cdsCoreController.content.cdsController.hardwareMicInfoString - 2 - - - 226 - - - - value: emuControl.currentMicGainValue - - - - - - value: emuControl.currentMicGainValue - value - emuControl.currentMicGainValue - 2 - - - 230 - - - - value: emuControl.currentMicGainValue - - - - - - value: emuControl.currentMicGainValue - value - emuControl.currentMicGainValue - - - - - 2 - - - 232 - - - - changeHardwareMicMute: - - - - 233 - - - - frameAdvance: - - - - 243 - - - - toggleNDSDisplays: - - - - 244 - - - - toggleHUDVisibility: - - - - 245 - - - - hidden: isShowingStatusBar - - - - - - hidden: isShowingStatusBar - hidden - isShowingStatusBar - - NSValueTransformerName - NSNegateBoolean - - 2 - - - 248 - - - - - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 3 - - - - - - - - - 4 - - - - - - - - - - - - - - - - - - 5 - - - - - - - - - - - 6 - - - - - - - - 10 - - - - - 13 - - - - - 14 - - - - - 15 - - - - - 16 - - - - - 17 - - - - - 18 - - - - - 19 - - - - - 20 - - - - - 21 - - - - - 116 - - - - - - - - 117 - - - - - - - - 118 - - - - - - - - - 120 - - - - - 119 - - - - - 122 - - - - - - - - 123 - - - - - - - - 124 - - - - - - - - - 125 - - - - - 126 - - - - - 151 - - - - - - - Sound Output Volume Menu Item - - - 136 - - - - - - - - 137 - - - - - 152 - - - - - - - - 153 - - - - - - - - 154 - - - - - 161 - - - - - - - - Microphone Input Gain Menu Item - - - 162 - - - - - - - - 165 - - - - - - - - 166 - - - - - 145 - - - - - - - - 146 - - - - - 185 - - - - - - - - 186 - - - - - 234 - - - - - 237 - - - - - 238 - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {183.5, 317.5} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - {84.5, 324.5} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{666, 269}, {256, 408}} - com.apple.InterfaceBuilder.CocoaPlugin - {{666, 269}, {256, 408}} - - - {256, 408} - {{334, 998}, {616, 0}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - 248 - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - ../../DeSmuME (XCode 3).xcodeproj - 3 - - {420, 420} - {420, 420} - {420, 420} - {256, 256} - {420, 420} - {420, 420} - {420, 420} - {420, 420} - {420, 420} - {420, 420} - {16, 16} - {12, 12} - {10, 2} - {15, 15} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + 1060 + 13F1911 + 851 + 1265.21 + 698.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 851 + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + DisplayWindowController + + + FirstResponder + + + NSApplication + + + 271 + 2 + {{830, 370}, {256, 408}} + 74973184 + DeSmuME + NSWindow + + + D5552DCE-722B-4ECB-8E0A-8B7CF76EAC70 + + + YES + YES + YES + YES + 1 + 2 + + + + 0135754F-463F-4625-9D27-DEF701AEF50E + + Open ROM + Open ROM + + + + NSImage + Icon_OpenROM_420x420 + + + + {0, 0} + {0, 0} + YES + YES + -1 + YES + 0 + + + + 039A3D54-15EA-4743-88B7-60517113C193 + + Toggle Displays + Toggle Displays + + + + NSImage + Icon_DisplayToggle_420x420 + + + + {0, 0} + {0, 0} + YES + YES + -1 + YES + 0 + + + + 2E728430-6055-404B-944F-25594ACBEC39 + + Execute + Execute/Pause + + + + NSImage + Icon_Execute_420x420 + + + + {0, 0} + {0, 0} + YES + YES + -1 + YES + 0 + + + + 321036F9-6034-47B1-9CC5-2461D98700F0 + + Reset + Reset + + + + NSImage + Icon_Reset_420x420 + + + + {0, 0} + {0, 0} + YES + YES + -1 + YES + 0 + + + + 41A299FB-4A95-4FA3-9982-8523FF04ACDE + + Rotate Right + Rotate Right + + + + NSImage + Icon_RotateCW_420x420 + + + + {0, 0} + {0, 0} + YES + YES + 90 + YES + 0 + + + + 8A505B61-7B2E-49ED-B6A0-DBE0A72DB48D + + Enable HUD + Enable/Disable HUD + + + + NSImage + Icon_ShowHUD_420x420 + + + + {0, 0} + {0, 0} + YES + YES + -1 + YES + 0 + + + + C626F2C1-4353-4288-AD59-40FB7F4C1A58 + + Rotate Left + Rotate Left + + + + NSImage + Icon_RotateCCW_420x420 + + + + {0, 0} + {0, 0} + YES + YES + -90 + YES + 0 + + + + D3628D4D-C39F-4CC3-B82F-7CC0F699B953 + + Frame Advance + Frame Advance + + + + NSImage + Icon_FrameAdvance_420x420 + + + + {0, 0} + {0, 0} + YES + YES + -1 + YES + 0 + + + + EDBFD998-E031-4AC5-A86A-7114D66FF847 + + Speed 2x + Speed 1x/2x + + + + NSImage + Icon_Speed2x_420x420 + + + + {0, 0} + {0, 0} + YES + YES + 200 + YES + 0 + + + NSToolbarFlexibleSpaceItem + + Flexible Space + + + + + + {1, 5} + {20000, 32} + YES + YES + -1 + YES + 0 + + YES + YES + + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + + + + NSToolbarSpaceItem + + Space + + + + + + {32, 5} + {32, 32} + YES + YES + -1 + YES + 0 + + YES + YES + + + 1048576 + 2147483647 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {1.7976931348623157e+308, 1.7976931348623157e+308} + {256, 408} + + + 256 + + + + 5156 + {{2, 3}, {16, 16}} + + 28938 + 100 + + + + 294 + {{17, 5}, {137, 14}} + + YES + + 68157504 + 272634880 + + + LucidaGrande + 11 + 3088 + + Status Text + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + NO + 1 + + + + 289 + {{192, -1}, {40, 26}} + + YES + + -2076180416 + 134219776 + + LucidaGrande + 13 + 1040 + + + -2043002880 + 34 + + LucidaGrande + 13 + 16 + + + + 400 + 75 + + + YES + + + 2147483647 + 1 + + NSImage + Icon_VolumeFull_16x16 + + + + _popUpItemAction: + + + YES + + OtherViews + + + + + Volume + + 2147483647 + + + _popUpItemAction: + + + + + + YES + 1 + YES + YES + 2 + + NO + + + + 289 + {{151, -1}, {42, 26}} + + YES + + -2076180416 + 134219776 + + + -2043002880 + 162 + + + + 400 + 75 + + + YES + + + 2147483647 + 1 + + NSImage + Icon_MicrophoneBlack_256x256 + + + + _popUpItemAction: + + + YES + + OtherViews + + + + + Gain + + 2147483647 + + + _popUpItemAction: + + + + + + YES + 1 + YES + YES + 2 + + NO + + + {256, 408} + + {{0, 0}, {1920, 1177}} + {256, 477} + {1.7976931348623157e+308, 1.7976931348623157e+308} + YES + + + + 268 + + + + 268 + {{2, 0}, {49, 18}} + + YES + + 67108864 + 131072 + Mute + + + 1211912448 + 2 + + NSImage + NSSwitch + + + NSSwitch + + + + 200 + 25 + + NO + + + + 268 + {{-3, 20}, {66, 11}} + + YES + + 68157504 + 138679296 + + LucidaGrande + 9 + 3600 + + + + + + + + + + + + + + -∞ + + + +∞ + + + #0.0% + #0.0% + + + + + + + + NaN + + + + 0 + 0 + YES + NO + 1 + AAAAAAAAAAAAAAAAAAAAAA + + + + 3 + YES + YES + YES + + . + , + NO + NO + YES + + %1.1f%% + + + + + NO + 1 + + + + 268 + {{17, 31}, {21, 105}} + + YES + + 604242176 + 0 + + + 100 + 0.0 + 0.0 + 0.0 + 0 + 0 + NO + YES + + NO + + + {55, 139} + NSView + + + + 268 + + + + 268 + {{-1, 6}, {51, 11}} + + YES + + 68157504 + 138679296 + + + + + + + + + + + + + + + + + + #0.0% + #0.0% + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + YES + + %1.1f%% + + + + + NO + 1 + + + + 268 + {{12, 17}, {21, 105}} + + + YES + + 67371264 + 0 + + + 100 + 0.0 + 100 + 0.0 + 0 + 0 + NO + YES + + NO + + + {45, 125} + + NSView + + + + + + + hidden: isShowingStatusBar + + + + + + hidden: isShowingStatusBar + hidden + isShowingStatusBar + + NSValueTransformerName + NSNegateBoolean + + 2 + + + 54 + + + + changeCoreSpeed: + + + + 56 + + + + changeRotationRelative: + + + + 57 + + + + changeRotationRelative: + + + + 58 + + + + openRom: + + + + 60 + + + + delegate + + + + 62 + + + + value: emuControl.statusText + + + + + + value: emuControl.statusText + value + emuControl.statusText + + + + + + 2 + + + 67 + + + + animate: emuControl.isWorking + + + + + + animate: emuControl.isWorking + animate + emuControl.isWorking + 2 + + + 68 + + + + reset: + + + + 107 + + + + toggleExecutePause: + + + + 108 + + + + window + + + + 109 + + + + hidden: isShowingStatusBar + + + + + + hidden: isShowingStatusBar + hidden + isShowingStatusBar + + NSValueTransformerName + NSNegateBoolean + + 2 + + + 131 + + + + hidden: isShowingStatusBar + + + + + + hidden: isShowingStatusBar + hidden + isShowingStatusBar + + NSValueTransformerName + NSNegateBoolean + + 2 + + + 133 + + + + image: emuControl.currentVolumeIcon + + + + + + image: emuControl.currentVolumeIcon + image + emuControl.currentVolumeIcon + 2 + + + 135 + + + + value: emuControl.currentVolumeValue + + + + + + value: emuControl.currentVolumeValue + value + emuControl.currentVolumeValue + 2 + + + 138 + + + + changeVolume: + + + + 141 + + + + outputVolumeMenuItem + + + + 142 + + + + microphoneGainMenuItem + + + + 144 + + + + value: emuControl.currentVolumeValue + + + + + + value: emuControl.currentVolumeValue + value + emuControl.currentVolumeValue + + + + + 2 + + + 157 + + + + hidden: isShowingStatusBar + + + + + + hidden: isShowingStatusBar + hidden + isShowingStatusBar + + NSValueTransformerName + NSNegateBoolean + + 2 + + + 159 + + + + outputVolumeControlView + + + + 160 + + + + hidden: isShowingStatusBar + + + + + + hidden: isShowingStatusBar + hidden + isShowingStatusBar + + NSValueTransformerName + NSNegateBoolean + + 2 + + + 167 + + + + microphoneGainControlView + + + + 183 + + + + image: emuControl.currentMicStatusIcon + + + + + + image: emuControl.currentMicStatusIcon + image + emuControl.currentMicStatusIcon + 2 + + + 184 + + + + microphoneGainSlider + + + + 203 + + + + microphoneMuteButton + + + + 204 + + + + changeHardwareMicGain: + + + + 207 + + + + enabled: emuControl.isHardwareMicAvailable + + + + + + enabled: emuControl.isHardwareMicAvailable + enabled + emuControl.isHardwareMicAvailable + 2 + + + 218 + + + + enabled: emuControl.isHardwareMicAvailable + + + + + + enabled: emuControl.isHardwareMicAvailable + enabled + emuControl.isHardwareMicAvailable + 2 + + + 220 + + + + value: emuControl.cdsCoreController.content.cdsController.hardwareMicMute + + + + + + value: emuControl.cdsCoreController.content.cdsController.hardwareMicMute + value + emuControl.cdsCoreController.content.cdsController.hardwareMicMute + 2 + + + 224 + + + + toolTip: emuControl.cdsCoreController.content.cdsController.hardwareMicInfoString + + + + + + toolTip: emuControl.cdsCoreController.content.cdsController.hardwareMicInfoString + toolTip + emuControl.cdsCoreController.content.cdsController.hardwareMicInfoString + 2 + + + 226 + + + + value: emuControl.currentMicGainValue + + + + + + value: emuControl.currentMicGainValue + value + emuControl.currentMicGainValue + 2 + + + 230 + + + + value: emuControl.currentMicGainValue + + + + + + value: emuControl.currentMicGainValue + value + emuControl.currentMicGainValue + + + + + 2 + + + 232 + + + + changeHardwareMicMute: + + + + 233 + + + + frameAdvance: + + + + 243 + + + + toggleNDSDisplays: + + + + 244 + + + + toggleHUDVisibility: + + + + 245 + + + + hidden: isShowingStatusBar + + + + + + hidden: isShowingStatusBar + hidden + isShowingStatusBar + + NSValueTransformerName + NSNegateBoolean + + 2 + + + 248 + + + + toolTip: emuControl.micStatusTooltip + + + + + + toolTip: emuControl.micStatusTooltip + toolTip + emuControl.micStatusTooltip + 2 + + + 249 + + + + toolTip: emuControl.micStatusTooltip + + + + + + toolTip: emuControl.micStatusTooltip + toolTip + emuControl.micStatusTooltip + 2 + + + 250 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 3 + + + + + + + + + 4 + + + + + + + + + + + + + + + + + + 5 + + + + + + + + + + + 6 + + + + + + + + 10 + + + + + 13 + + + + + 14 + + + + + 15 + + + + + 16 + + + + + 17 + + + + + 18 + + + + + 19 + + + + + 20 + + + + + 21 + + + + + 116 + + + + + + + + 117 + + + + + + + + 118 + + + + + + + + + 120 + + + + + 119 + + + + + 122 + + + + + + + + 123 + + + + + + + + 124 + + + + + + + + + 125 + + + + + 126 + + + + + 151 + + + + + + + Sound Output Volume Menu Item + + + 136 + + + + + + + + 137 + + + + + 152 + + + + + + + + 153 + + + + + + + + 154 + + + + + 161 + + + + + + + + Microphone Input Gain Menu Item + + + 162 + + + + + + + + 165 + + + + + + + + 166 + + + + + 145 + + + + + + + + 146 + + + + + 185 + + + + + + + + 186 + + + + + 234 + + + + + 237 + + + + + 238 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {183.5, 317.5} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{0, 695}, {55, 139}} + + {84.5, 324.5} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{666, 269}, {256, 408}} + com.apple.InterfaceBuilder.CocoaPlugin + {{666, 269}, {256, 408}} + + + {256, 408} + {{334, 998}, {616, 0}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 250 + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + ../../DeSmuME (XCode 3).xcodeproj + 3 + + {420, 420} + {420, 420} + {420, 420} + {256, 256} + {420, 420} + {420, 420} + {420, 420} + {420, 420} + {420, 420} + {420, 420} + {16, 16} + {11, 11} + {10, 3} + {15, 15} + + diff --git a/desmume/src/frontend/cocoa/translations/English.lproj/MainMenu.xib b/desmume/src/frontend/cocoa/translations/English.lproj/MainMenu.xib index 0ebe706ff..ac7fc594e 100644 --- a/desmume/src/frontend/cocoa/translations/English.lproj/MainMenu.xib +++ b/desmume/src/frontend/cocoa/translations/English.lproj/MainMenu.xib @@ -10311,7 +10311,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {1.7976931348623157e+308, 1.7976931348623157e+308} - + 256 @@ -10327,7 +10327,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{18, 14}, {190, 126}} - YES NO 4 @@ -10596,7 +10595,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{130, 18}, {224, 21}} - YES 612368448 @@ -10617,7 +10615,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{476, 11}, {96, 32}} - YES 67108864 @@ -10639,7 +10636,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{128, 47}, {348, 26}} - YES -2080112384 @@ -10662,7 +10658,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{479, 56}, {90, 17}} - YES 68157504 @@ -10722,7 +10717,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{356, 11}, {124, 32}} - YES 67108864 @@ -10742,12 +10736,10 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {{1, 1}, {584, 150}} - {{17, 56}, {586, 166}} - {0, 0} 67108864 @@ -10768,7 +10760,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{510, 12}, {96, 32}} - 1 YES @@ -10791,7 +10782,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{414, 12}, {96, 32}} - YES 67108864 @@ -10813,7 +10803,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 268 {{17, 230}, {586, 17}} - YES 70254657 @@ -10830,8 +10819,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 {620, 267} - - {{0, 0}, {1920, 1177}} {1.7976931348623157e+308, 1.7976931348623157e+308} @@ -42466,6 +42453,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 mainWindow.view.hudColorInputPendingOnly mainWindow.view.isHUDExecutionSpeedVisible mainWindow.view.hudColorExecutionSpeed + micStatusTooltip EmuControllerDelegate @@ -59112,6 +59100,70 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 12231 + + + toolTip: selection.micStatusTooltip + + + + + + toolTip: selection.micStatusTooltip + toolTip + selection.micStatusTooltip + 2 + + + 12232 + + + + toolTip: selection.micStatusTooltip + + + + + + toolTip: selection.micStatusTooltip + toolTip + selection.micStatusTooltip + 2 + + + 12233 + + + + toolTip: selection.micStatusTooltip + + + + + + toolTip: selection.micStatusTooltip + toolTip + selection.micStatusTooltip + 2 + + + 12234 + + + + toolTip: selection.micStatusTooltip + + + + + + toolTip: selection.micStatusTooltip + toolTip + selection.micStatusTooltip + 2 + + + 12235 + @@ -86775,7 +86827,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2 - 12231 + 12235 diff --git a/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.h b/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.h index 5de50b642..8f0183d0f 100644 --- a/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.h +++ b/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.h @@ -88,6 +88,7 @@ class AudioSampleBlockGenerator; BOOL isRomLoading; NSString *statusText; float currentVolumeValue; + NSString *micStatusTooltip; NSImage *currentMicStatusIcon; NSImage *currentVolumeIcon; BOOL isShowingSaveStateDialog; @@ -105,7 +106,9 @@ class AudioSampleBlockGenerator; float lastSetVolumeValue; NSImage *iconMicDisabled; + NSImage *iconMicDisabledDM; NSImage *iconMicIdle; + NSImage *iconMicIdleNoHardware; NSImage *iconMicActive; NSImage *iconMicInClip; NSImage *iconMicManualOverride; @@ -113,6 +116,10 @@ class AudioSampleBlockGenerator; NSImage *iconVolumeTwoThird; NSImage *iconVolumeOneThird; NSImage *iconVolumeMute; + NSImage *iconVolumeFullDM; + NSImage *iconVolumeTwoThirdDM; + NSImage *iconVolumeOneThirdDM; + NSImage *iconVolumeMuteDM; NSImage *iconExecute; NSImage *iconPause; NSImage *iconSpeedNormal; @@ -177,6 +184,7 @@ class AudioSampleBlockGenerator; @property (assign) BOOL isHardwareMicAvailable; @property (assign) float currentMicGainValue; @property (assign) float currentVolumeValue; +@property (assign) NSString *micStatusTooltip; @property (retain) NSImage *currentMicStatusIcon; @property (retain) NSImage *currentVolumeIcon; @property (assign) BOOL isShowingSaveStateDialog; @@ -220,6 +228,7 @@ class AudioSampleBlockGenerator; - (IBAction) frameJump:(id)sender; - (IBAction) reset:(id)sender; - (IBAction) changeRomSaveType:(id)sender; +- (IBAction) changeHostMicrophonePermission:(id)sender; // View Menu - (IBAction) toggleAllDisplays:(id)sender; @@ -313,6 +322,7 @@ class AudioSampleBlockGenerator; - (void) updateDisplayPanelTitles; - (void) appInit; - (void) fillOpenGLMSAAMenu; +- (NSInteger) updateHostMicrophonePermissionStatus; - (void) readUserDefaults; - (void) writeUserDefaults; - (void) restoreDisplayWindowStates; diff --git a/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.mm b/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.mm index 6b6361ad5..9837ef0d9 100644 --- a/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.mm +++ b/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.mm @@ -35,6 +35,10 @@ #import "cocoa_rom.h" #import "cocoa_slot2.h" +#if HAVE_OSAVAILABLE && defined(MAC_OS_X_VERSION_10_14) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14) + #import +#endif + @implementation EmuControllerDelegate @synthesize inputManager; @@ -88,6 +92,7 @@ @synthesize isHardwareMicAvailable; @synthesize currentMicGainValue; @dynamic currentVolumeValue; +@synthesize micStatusTooltip; @synthesize currentMicStatusIcon; @synthesize ndsMicLevelIndicator; @synthesize currentVolumeIcon; @@ -144,27 +149,36 @@ isSoundMuted = NO; lastSetVolumeValue = MAX_VOLUME; - iconExecute = [[NSImage imageNamed:@"Icon_Execute_420x420"] retain]; - iconPause = [[NSImage imageNamed:@"Icon_Pause_420x420"] retain]; - iconSpeedNormal = [[NSImage imageNamed:@"Icon_Speed1x_420x420"] retain]; - iconSpeedDouble = [[NSImage imageNamed:@"Icon_Speed2x_420x420"] retain]; + iconExecute = [[NSImage imageNamed:@"Icon_Execute_420x420"] retain]; + iconPause = [[NSImage imageNamed:@"Icon_Pause_420x420"] retain]; + iconSpeedNormal = [[NSImage imageNamed:@"Icon_Speed1x_420x420"] retain]; + iconSpeedDouble = [[NSImage imageNamed:@"Icon_Speed2x_420x420"] retain]; - iconMicDisabled = [[NSImage imageNamed:@"Icon_MicrophoneBlack_256x256"] retain]; - iconMicIdle = [[NSImage imageNamed:@"Icon_MicrophoneDarkGreen_256x256"] retain]; - iconMicActive = [[NSImage imageNamed:@"Icon_MicrophoneGreen_256x256"] retain]; - iconMicInClip = [[NSImage imageNamed:@"Icon_MicrophoneRed_256x256"] retain]; - iconMicManualOverride = [[NSImage imageNamed:@"Icon_MicrophoneGray_256x256"] retain]; + iconMicDisabled = [[NSImage imageNamed:@"Icon_MicrophoneBlack_256x256"] retain]; + iconMicDisabledDM = [[NSImage imageNamed:@"Icon_MicrophoneOff_DarkMode_256x256"] retain]; + iconMicIdle = [[NSImage imageNamed:@"Icon_MicrophoneDarkGreen_256x256"] retain]; + iconMicIdleNoHardware = [[NSImage imageNamed:@"Icon_MicrophoneIdleNoHardware_256x256"] retain]; + iconMicActive = [[NSImage imageNamed:@"Icon_MicrophoneGreen_256x256"] retain]; + iconMicInClip = [[NSImage imageNamed:@"Icon_MicrophoneRed_256x256"] retain]; + iconMicManualOverride = [[NSImage imageNamed:@"Icon_MicrophoneGray_256x256"] retain]; - iconVolumeFull = [[NSImage imageNamed:@"Icon_VolumeFull_16x16"] retain]; - iconVolumeTwoThird = [[NSImage imageNamed:@"Icon_VolumeTwoThird_16x16"] retain]; - iconVolumeOneThird = [[NSImage imageNamed:@"Icon_VolumeOneThird_16x16"] retain]; - iconVolumeMute = [[NSImage imageNamed:@"Icon_VolumeMute_16x16"] retain]; + iconVolumeFull = [[NSImage imageNamed:@"Icon_VolumeFull_16x16"] retain]; + iconVolumeTwoThird = [[NSImage imageNamed:@"Icon_VolumeTwoThird_16x16"] retain]; + iconVolumeOneThird = [[NSImage imageNamed:@"Icon_VolumeOneThird_16x16"] retain]; + iconVolumeMute = [[NSImage imageNamed:@"Icon_VolumeMute_16x16"] retain]; + + iconVolumeFullDM = [[NSImage imageNamed:@"Icon_VolumeFull_DarkMode_16x16"] retain]; + iconVolumeTwoThirdDM = [[NSImage imageNamed:@"Icon_VolumeTwoThird_DarkMode_16x16"] retain]; + iconVolumeOneThirdDM = [[NSImage imageNamed:@"Icon_VolumeOneThird_DarkMode_16x16"] retain]; + iconVolumeMuteDM = [[NSImage imageNamed:@"Icon_VolumeMute_DarkMode_16x16"] retain]; isWorking = NO; isRomLoading = NO; statusText = NSSTRING_STATUS_READY; currentVolumeValue = MAX_VOLUME; - currentMicStatusIcon = [iconMicDisabled retain]; + micStatusTooltip = @""; + BOOL isRunningDarkMode = NO; + currentMicStatusIcon = (isRunningDarkMode) ? [iconMicDisabledDM retain] : [iconMicDisabled retain]; currentVolumeIcon = [iconVolumeFull retain]; [[NSNotificationCenter defaultCenter] addObserver:self @@ -195,7 +209,9 @@ [iconSpeedDouble release]; [iconMicDisabled release]; + [iconMicDisabledDM release]; [iconMicIdle release]; + [iconMicIdleNoHardware release]; [iconMicActive release]; [iconMicInClip release]; [iconMicManualOverride release]; @@ -205,6 +221,11 @@ [iconVolumeOneThird release]; [iconVolumeMute release]; + [iconVolumeFullDM release]; + [iconVolumeTwoThirdDM release]; + [iconVolumeOneThirdDM release]; + [iconVolumeMuteDM release]; + [[self currentRom] release]; [self setCurrentRom:nil]; @@ -300,6 +321,8 @@ - (void) setCurrentVolumeValue:(float)vol { + BOOL isRunningDarkMode = NO; + currentVolumeValue = vol; // Update the icon. @@ -307,23 +330,23 @@ NSImage *newImage = nil; if (vol <= 0.0f) { - newImage = iconVolumeMute; + newImage = (isRunningDarkMode) ? iconVolumeMuteDM : iconVolumeMute; } else if (vol > 0.0f && vol <= VOLUME_THRESHOLD_LOW) { - newImage = iconVolumeOneThird; + newImage = (isRunningDarkMode) ? iconVolumeOneThirdDM : iconVolumeOneThird; isSoundMuted = NO; lastSetVolumeValue = vol; } else if (vol > VOLUME_THRESHOLD_LOW && vol <= VOLUME_THRESHOLD_HIGH) { - newImage = iconVolumeTwoThird; + newImage = (isRunningDarkMode) ? iconVolumeTwoThirdDM : iconVolumeTwoThird; isSoundMuted = NO; lastSetVolumeValue = vol; } else { - newImage = iconVolumeFull; + newImage = (isRunningDarkMode) ? iconVolumeFullDM : iconVolumeFull; isSoundMuted = NO; lastSetVolumeValue = vol; } @@ -854,6 +877,31 @@ [cdsCore changeRomSaveType:saveTypeID]; } +- (IBAction) changeHostMicrophonePermission:(id)sender +{ +#if HAVE_OSAVAILABLE && defined(MAC_OS_X_VERSION_10_14) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14) + if (IsOSXVersionSupported(10, 14, 0)) + { + if (@available(macOS 10.14, *)) + { + [AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL isAuthorized) { + if (isAuthorized) + { + puts("DeSmuME: User has just granted access to the microphone."); + } + + [self updateHostMicrophonePermissionStatus]; + }]; + } + } + else +#endif + { + puts("DeSmuME: User is not running macOS v10.14 Mojave or later -- microphone usage is automatically authorized."); + [self updateHostMicrophonePermissionStatus]; + } +} + - (IBAction) toggleCheats:(id)sender { [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; @@ -2190,9 +2238,11 @@ - (void) updateMicStatusIcon { + BOOL isRunningDarkMode = NO; + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; CocoaDSController *cdsController = [cdsCore cdsController]; - NSImage *micIcon = iconMicDisabled; + NSImage *micIcon = (isRunningDarkMode) ? iconMicDisabledDM : iconMicDisabled; if ([cdsController softwareMicState]) { @@ -2200,23 +2250,30 @@ } else { - if ([cdsController isHardwareMicAvailable]) + if ([cdsController hardwareMicPause]) { - if ([cdsController hardwareMicPause]) + micIcon = (isRunningDarkMode) ? iconMicDisabledDM : iconMicDisabled; + } + else + { + if ([cdsController isHardwareMicAvailable]) { - micIcon = iconMicDisabled; - } - else if ([cdsController isHardwareMicInClip]) - { - micIcon = iconMicInClip; - } - else if ([cdsController isHardwareMicIdle]) - { - micIcon = iconMicIdle; + if ([cdsController isHardwareMicInClip]) + { + micIcon = iconMicInClip; + } + else if ([cdsController isHardwareMicIdle]) + { + micIcon = iconMicIdle; + } + else + { + micIcon = iconMicActive; + } } else { - micIcon = iconMicActive; + micIcon = iconMicIdleNoHardware; } } } @@ -2487,6 +2544,60 @@ [openglMSAAPopUpButton selectItemAtIndex:0]; } +- (NSInteger) updateHostMicrophonePermissionStatus +{ + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; + CocoaDSController *cdsController = [cdsCore cdsController]; + + NSInteger authStatus = 0; + BOOL authFlag = NO; + +#if HAVE_OSAVAILABLE && defined(MAC_OS_X_VERSION_10_14) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14) + if (IsOSXVersionSupported(10, 14, 0)) + { + if (@available(macOS 10.14, *)) + { + authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio]; + + switch (authStatus) + { + case AVAuthorizationStatusNotDetermined: + [self setMicStatusTooltip:@"Hardware microphone usage has yet to be authorized. If you need access, click \"OK\" when DeSmuME requests permission from the system."]; + break; + + case AVAuthorizationStatusRestricted: + [self setMicStatusTooltip:@"Hardware microphone usage has been restricted. Please see your system administrator."]; + break; + + case AVAuthorizationStatusDenied: + [self setMicStatusTooltip:@"Hardware microphone usage has been denied. If you need access, change your microphone privacy settings for DeSmuME in System Preferences."]; + break; + + case AVAuthorizationStatusAuthorized: + [self setMicStatusTooltip:@""]; + authFlag = YES; + break; + + default: + [self setMicStatusTooltip:@"Hardware microphone usage is currently unknown. If you need access, change your microphone privacy settings for DeSmuME in System Preferences."]; + break; + } + + [cdsController setHardwareMicAuthorization:authFlag]; + } + } + else +#endif + { + authStatus = 3; // AVAuthorizationStatusAuthorized + [self setMicStatusTooltip:@""]; + [cdsController setHardwareMicAuthorization:YES]; + } + + [self updateMicStatusIcon]; + return authStatus; +} + - (void) readUserDefaults { CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; @@ -3080,8 +3191,9 @@ - (void) doMicHardwareStateChangedFromController:(CocoaDSController *)cdsController isEnabled:(BOOL)isHardwareEnabled isLocked:(BOOL)isHardwareLocked + isAuthorized:(BOOL)isAuthorized { - const BOOL hwMicAvailable = (isHardwareEnabled && !isHardwareLocked); + const BOOL hwMicAvailable = (isHardwareEnabled && !isHardwareLocked && isAuthorized); [self setIsHardwareMicAvailable:hwMicAvailable]; [self updateMicStatusIcon]; } diff --git a/desmume/src/frontend/cocoa/userinterface/appDelegate.mm b/desmume/src/frontend/cocoa/userinterface/appDelegate.mm index 7a413f6d8..6a3fc6309 100644 --- a/desmume/src/frontend/cocoa/userinterface/appDelegate.mm +++ b/desmume/src/frontend/cocoa/userinterface/appDelegate.mm @@ -67,7 +67,7 @@ return nil; } - // Determine if we're running on Intel or PPC. + // Determine if we're running on Intel or non-Intel (PowerPC or ARM64). #if defined(__i386__) || defined(__x86_64__) isAppRunningOnIntel = YES; #else @@ -372,6 +372,14 @@ [self application:NSApp openFile:[self delayedROMFileName]]; [self setDelayedROMFileName:nil]; } + + // Request hardware microphone permissions now. Hopefully, the user will address the + // permissions dialog before the ROM program actually needs the microphone input. + const NSInteger micPermStatus = [emuControl updateHostMicrophonePermissionStatus]; + if (micPermStatus == 0) // (micPermStatus == AVAuthorizationStatusNotDetermined) + { + [emuControl changeHostMicrophonePermission:self]; + } } - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender