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.
This commit is contained in:
rogerman 2022-04-15 12:34:05 -07:00
parent 02d8f0aa4d
commit a73705bc50
17 changed files with 2031 additions and 1912 deletions

View File

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

View File

@ -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();

View File

@ -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 = "<group>"; };
AB3E34C8134AF4500056477A /* cocoa_output.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_output.mm; sourceTree = "<group>"; };
AB3E8AEB2808FDF3007FF5C7 /* Icon_MicrophoneIdleNoHardware_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneIdleNoHardware_256x256.png; path = images/Icon_MicrophoneIdleNoHardware_256x256.png; sourceTree = "<group>"; };
AB3FBD7E2176DE95005722D0 /* WifiSettingsPanel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WifiSettingsPanel.h; sourceTree = "<group>"; };
AB3FBD7F2176DE95005722D0 /* WifiSettingsPanel.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = WifiSettingsPanel.mm; sourceTree = "<group>"; };
AB4055ED169F59380016AC3E /* AsmJit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsmJit.h; sourceTree = "<group>"; };
@ -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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
ABA67CB52808B97D00B5208D /* Icon_MicrophoneDenied_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneDenied_256x256.png; path = images/Icon_MicrophoneDenied_256x256.png; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
@ -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 */,

View File

@ -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 = "<group>"; };
AB6A198116CAD66900384EED /* cocoa_GPU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_GPU.h; sourceTree = "<group>"; };
AB6A198216CAD66900384EED /* cocoa_GPU.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_GPU.mm; sourceTree = "<group>"; };
AB6D78932809FA43007C6B0A /* Icon_MicrophoneIdleNoHardware_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneIdleNoHardware_256x256.png; path = images/Icon_MicrophoneIdleNoHardware_256x256.png; sourceTree = "<group>"; };
AB6FBEF5139B6258007BB045 /* slot1_retail_nand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail_nand.cpp; sourceTree = "<group>"; };
AB6FE66A26E6F7C2002B2106 /* GPU_Operations_AVX2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GPU_Operations_AVX2.cpp; sourceTree = "<group>"; };
AB6FE66B26E6F7C2002B2106 /* GPU_Operations_AVX2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPU_Operations_AVX2.h; sourceTree = "<group>"; };
@ -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 = "<group>"; };
ABA165822808BD6A00C8CFF5 /* Icon_CodeBreaker_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_CodeBreaker_32x32.png; path = images/Icon_CodeBreaker_32x32.png; sourceTree = "<group>"; };
ABA165832808BD6A00C8CFF5 /* Icon_DeSmuME_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DeSmuME_32x32.png; path = images/Icon_DeSmuME_32x32.png; sourceTree = "<group>"; };
ABA165842808BD6A00C8CFF5 /* Icon_MicrophoneDenied_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneDenied_256x256.png; path = images/Icon_MicrophoneDenied_256x256.png; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
@ -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;
};

View File

@ -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);

View File

@ -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)

View File

@ -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)
{

View File

@ -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);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -10311,7 +10311,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<nil key="NSUserInterfaceItemIdentifier"/>
<string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
<object class="NSView" key="NSWindowView" id="705283056">
<reference key="NSNextResponder"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="NSBox" id="531436272">
@ -10327,7 +10327,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{18, 14}, {190, 126}}</string>
<reference key="NSSuperview" ref="620417532"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
<int key="NSNumRows">4</int>
@ -10596,7 +10595,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{130, 18}, {224, 21}}</string>
<reference key="NSSuperview" ref="620417532"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="565031755">
<int key="NSCellFlags">612368448</int>
@ -10617,7 +10615,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{476, 11}, {96, 32}}</string>
<reference key="NSSuperview" ref="620417532"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="189809655">
<int key="NSCellFlags">67108864</int>
@ -10639,7 +10636,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{128, 47}, {348, 26}}</string>
<reference key="NSSuperview" ref="620417532"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSSliderCell" key="NSCell" id="792766777">
<int key="NSCellFlags">-2080112384</int>
@ -10662,7 +10658,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{479, 56}, {90, 17}}</string>
<reference key="NSSuperview" ref="620417532"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="18475068">
<int key="NSCellFlags">68157504</int>
@ -10722,7 +10717,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{356, 11}, {124, 32}}</string>
<reference key="NSSuperview" ref="620417532"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="1009914712">
<int key="NSCellFlags">67108864</int>
@ -10742,12 +10736,10 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</array>
<string key="NSFrame">{{1, 1}, {584, 150}}</string>
<reference key="NSSuperview" ref="531436272"/>
<reference key="NSWindow"/>
</object>
</array>
<string key="NSFrame">{{17, 56}, {586, 166}}</string>
<reference key="NSSuperview" ref="705283056"/>
<reference key="NSWindow"/>
<string key="NSOffsets">{0, 0}</string>
<object class="NSTextFieldCell" key="NSTitleCell">
<int key="NSCellFlags">67108864</int>
@ -10768,7 +10760,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{510, 12}, {96, 32}}</string>
<reference key="NSSuperview" ref="705283056"/>
<reference key="NSWindow"/>
<int key="NSTag">1</int>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="23472213">
@ -10791,7 +10782,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{414, 12}, {96, 32}}</string>
<reference key="NSSuperview" ref="705283056"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="565213794">
<int key="NSCellFlags">67108864</int>
@ -10813,7 +10803,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<int key="NSvFlags">268</int>
<string key="NSFrame">{{17, 230}, {586, 17}}</string>
<reference key="NSSuperview" ref="705283056"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="702563390">
<int key="NSCellFlags">70254657</int>
@ -10830,8 +10819,6 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
</array>
<string key="NSFrameSize">{620, 267}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
</object>
<string key="NSScreenRect">{{0, 0}, {1920, 1177}}</string>
<string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
@ -42466,6 +42453,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<string>mainWindow.view.hudColorInputPendingOnly</string>
<string>mainWindow.view.isHUDExecutionSpeedVisible</string>
<string>mainWindow.view.hudColorExecutionSpeed</string>
<string>micStatusTooltip</string>
</array>
<string key="NSObjectClassName">EmuControllerDelegate</string>
<object class="_NSManagedProxy" key="_NSManagedProxy"/>
@ -59112,6 +59100,70 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
</object>
<int key="connectionID">12231</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">toolTip: selection.micStatusTooltip</string>
<reference key="source" ref="178999512"/>
<reference key="destination" ref="258098641"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="178999512"/>
<reference key="NSDestination" ref="258098641"/>
<string key="NSLabel">toolTip: selection.micStatusTooltip</string>
<string key="NSBinding">toolTip</string>
<string key="NSKeyPath">selection.micStatusTooltip</string>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">12232</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">toolTip: selection.micStatusTooltip</string>
<reference key="source" ref="215825056"/>
<reference key="destination" ref="258098641"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="215825056"/>
<reference key="NSDestination" ref="258098641"/>
<string key="NSLabel">toolTip: selection.micStatusTooltip</string>
<string key="NSBinding">toolTip</string>
<string key="NSKeyPath">selection.micStatusTooltip</string>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">12233</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">toolTip: selection.micStatusTooltip</string>
<reference key="source" ref="712229647"/>
<reference key="destination" ref="258098641"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="712229647"/>
<reference key="NSDestination" ref="258098641"/>
<string key="NSLabel">toolTip: selection.micStatusTooltip</string>
<string key="NSBinding">toolTip</string>
<string key="NSKeyPath">selection.micStatusTooltip</string>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">12234</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">toolTip: selection.micStatusTooltip</string>
<reference key="source" ref="807627411"/>
<reference key="destination" ref="258098641"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="807627411"/>
<reference key="NSDestination" ref="258098641"/>
<string key="NSLabel">toolTip: selection.micStatusTooltip</string>
<string key="NSBinding">toolTip</string>
<string key="NSKeyPath">selection.micStatusTooltip</string>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">12235</int>
</object>
</array>
<object class="IBMutableOrderedSet" key="objectRecords">
<array key="orderedObjects">
@ -86775,7 +86827,7 @@ y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp2
<nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">12231</int>
<int key="maxID">12235</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptionsV3.1+">

View File

@ -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;

View File

@ -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 <AVFoundation/AVFoundation.h>
#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];
}

View File

@ -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