Cocoa Port:

- Add full support for using hardware microphones on the host machine for emulating the NDS microphone. Finally, mic driven games, such as Nintendogs, are fully playable on the Mac!
- Display windows no longer include an output volume slider directly in the status bar. Instead, the slider has been moved inside a popup button, which now behaves just like OS X's volume menu. This was done for better space efficiency.
- Display windows now include a microphone icon alongside the output volume icon. Like the output volume, there is a slider control to adjust microphone gain and also a mute control.
- The microphone icon changes color depending the microphone's state (as seen by the NDS, not the host).
- Replace the existing microphone icon with one that looks better and is more modern.
- Adjust the size of the output volume icon from 20x20 pixels to 16x16 pixels.
- Fix yet another font rendering bug in the Input Profile viewer on OS X Yosemite.
This commit is contained in:
rogerman 2015-03-08 09:41:19 +00:00
parent 64ea7591ab
commit 381324ca09
38 changed files with 65028 additions and 62359 deletions

View File

@ -55,7 +55,6 @@
AB0F29AE14BE7213009ABC6F /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; };
AB0F29AF14BE7213009ABC6F /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; };
AB0F29B014BE7213009ABC6F /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; };
AB0F29B114BE7213009ABC6F /* Icon_Microphone_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */; };
AB0F29B214BE7213009ABC6F /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; };
AB0F29B314BE7213009ABC6F /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; };
AB0F29B414BE7213009ABC6F /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; };
@ -293,7 +292,6 @@
AB796CDE15CDCBA200C59155 /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; };
AB796CDF15CDCBA200C59155 /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; };
AB796CE015CDCBA200C59155 /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; };
AB796CE115CDCBA200C59155 /* Icon_Microphone_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */; };
AB796CE215CDCBA200C59155 /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; };
AB796CE315CDCBA200C59155 /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; };
AB796CE415CDCBA200C59155 /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; };
@ -511,7 +509,6 @@
AB8F3C5E1A53AC2600A80BF6 /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; };
AB8F3C5F1A53AC2600A80BF6 /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; };
AB8F3C601A53AC2600A80BF6 /* Icon_AutoholdSet_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB7EC7F3189B2B92009D198A /* Icon_AutoholdSet_420x420.png */; };
AB8F3C611A53AC2600A80BF6 /* Icon_Microphone_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */; };
AB8F3C621A53AC2600A80BF6 /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; };
AB8F3C631A53AC2600A80BF6 /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; };
AB8F3C641A53AC2600A80BF6 /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; };
@ -744,6 +741,24 @@
ABAF0A411A96E67200B95B75 /* RomInfoPanel.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAF0A401A96E67200B95B75 /* RomInfoPanel.mm */; };
ABAF0A421A96E67200B95B75 /* RomInfoPanel.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAF0A401A96E67200B95B75 /* RomInfoPanel.mm */; };
ABAF0A431A96E67200B95B75 /* RomInfoPanel.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAF0A401A96E67200B95B75 /* RomInfoPanel.mm */; };
ABB0FBC51A9E5CEA0060C55A /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB0FBC41A9E5CEA0060C55A /* CoreAudio.framework */; };
ABB0FBC61A9E5D070060C55A /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB0FBC41A9E5CEA0060C55A /* CoreAudio.framework */; };
ABB0FBC71A9E5D080060C55A /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB0FBC41A9E5CEA0060C55A /* CoreAudio.framework */; };
ABB0FBCC1A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBC81A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png */; };
ABB0FBCD1A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBC81A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png */; };
ABB0FBCE1A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBC81A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png */; };
ABB0FBCF1A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBC91A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png */; };
ABB0FBD01A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBC91A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png */; };
ABB0FBD11A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBC91A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png */; };
ABB0FBD21A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBCA1A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png */; };
ABB0FBD31A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBCA1A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png */; };
ABB0FBD41A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBCA1A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png */; };
ABB0FBD51A9EED350060C55A /* Icon_MicrophoneRed_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBCB1A9EED350060C55A /* Icon_MicrophoneRed_256x256.png */; };
ABB0FBD61A9EED350060C55A /* Icon_MicrophoneRed_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBCB1A9EED350060C55A /* Icon_MicrophoneRed_256x256.png */; };
ABB0FBD71A9EED350060C55A /* Icon_MicrophoneRed_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBCB1A9EED350060C55A /* Icon_MicrophoneRed_256x256.png */; };
ABB0FBD91A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBD81A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png */; };
ABB0FBDA1A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBD81A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png */; };
ABB0FBDB1A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABB0FBD81A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png */; };
ABB24F6D1A81EE92006C1108 /* OGLDisplayOutput_3_2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABB24F6B1A81EE92006C1108 /* OGLDisplayOutput_3_2.cpp */; };
ABB24F6E1A81EE92006C1108 /* OGLDisplayOutput_3_2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABB24F6B1A81EE92006C1108 /* OGLDisplayOutput_3_2.cpp */; };
ABB24F6F1A81EE92006C1108 /* OGLDisplayOutput_3_2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABB24F6B1A81EE92006C1108 /* OGLDisplayOutput_3_2.cpp */; };
@ -860,6 +875,11 @@
ABC3AF3014B7F06900D5B13D /* Icon_VolumeMute_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */; };
ABC3AF3114B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */; };
ABC3AF3214B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */; };
ABC503AD1AAC2B71002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC503AC1AAC2B71002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png */; };
ABC503AE1AAC2B90002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC503AC1AAC2B71002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png */; };
ABC503AF1AAC2B91002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABC503AC1AAC2B71002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png */; };
ABC503B01AAC42C2002FCD43 /* coreaudiosound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB1B9E5F1501A78000464647 /* coreaudiosound.cpp */; };
ABC503B11AAC4355002FCD43 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABB0FBC41A9E5CEA0060C55A /* CoreAudio.framework */; };
ABC570D1134431CE00E7B0B1 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */; };
ABC570D5134431DA00E7B0B1 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; };
ABC5720D1344346600E7B0B1 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97324FDCFA39411CA2CEA /* AppKit.framework */; };
@ -1034,7 +1054,6 @@
AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonY_420x420.png; path = images/Icon_DSButtonY_420x420.png; sourceTree = "<group>"; };
AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Emulation_420x420.png; path = images/Icon_Emulation_420x420.png; sourceTree = "<group>"; };
AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Input_420x420.png; path = images/Icon_Input_420x420.png; sourceTree = "<group>"; };
AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Microphone_420x420.png; path = images/Icon_Microphone_420x420.png; sourceTree = "<group>"; };
AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_OpenROM_420x420.png; path = images/Icon_OpenROM_420x420.png; sourceTree = "<group>"; };
AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Reset_420x420.png; path = images/Icon_Reset_420x420.png; sourceTree = "<group>"; };
AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_RotateCCW_420x420.png; path = images/Icon_RotateCCW_420x420.png; sourceTree = "<group>"; };
@ -1225,6 +1244,12 @@
ABAD3E6F13AF1D6D00502E1E /* WavFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WavFile.cpp; sourceTree = "<group>"; };
ABAF0A3F1A96E67200B95B75 /* RomInfoPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RomInfoPanel.h; sourceTree = "<group>"; };
ABAF0A401A96E67200B95B75 /* RomInfoPanel.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RomInfoPanel.mm; sourceTree = "<group>"; };
ABB0FBC41A9E5CEA0060C55A /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
ABB0FBC81A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneBlack_256x256.png; path = images/Icon_MicrophoneBlack_256x256.png; sourceTree = "<group>"; };
ABB0FBC91A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneBlueGlow_256x256.png; path = images/Icon_MicrophoneBlueGlow_256x256.png; sourceTree = "<group>"; };
ABB0FBCA1A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneGreen_256x256.png; path = images/Icon_MicrophoneGreen_256x256.png; sourceTree = "<group>"; };
ABB0FBCB1A9EED350060C55A /* Icon_MicrophoneRed_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneRed_256x256.png; path = images/Icon_MicrophoneRed_256x256.png; sourceTree = "<group>"; };
ABB0FBD81A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneGray_256x256.png; path = images/Icon_MicrophoneGray_256x256.png; sourceTree = "<group>"; };
ABB24F6B1A81EE92006C1108 /* OGLDisplayOutput_3_2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OGLDisplayOutput_3_2.cpp; sourceTree = "<group>"; };
ABB24F6C1A81EE92006C1108 /* OGLDisplayOutput_3_2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OGLDisplayOutput_3_2.h; sourceTree = "<group>"; };
ABB3C63B1501BB8300E0C22E /* DeSmuME_Prefix_OpenEmu.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DeSmuME_Prefix_OpenEmu.pch; sourceTree = "<group>"; };
@ -1245,6 +1270,7 @@
ABC3AF2C14B7F06900D5B13D /* Icon_VolumeMute_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeMute_16x16.png; path = images/Icon_VolumeMute_16x16.png; sourceTree = "<group>"; };
ABC3AF2D14B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeOneThird_16x16.png; path = images/Icon_VolumeOneThird_16x16.png; sourceTree = "<group>"; };
ABC3AF2E14B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_VolumeTwoThird_16x16.png; path = images/Icon_VolumeTwoThird_16x16.png; sourceTree = "<group>"; };
ABC503AC1AAC2B71002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneDarkGreen_256x256.png; path = images/Icon_MicrophoneDarkGreen_256x256.png; sourceTree = "<group>"; };
ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; };
ABC570D4134431DA00E7B0B1 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; };
ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = DefaultKeyMappings.plist; sourceTree = "<group>"; };
@ -1476,6 +1502,7 @@
ABC570D1134431CE00E7B0B1 /* AudioUnit.framework in Frameworks */,
AB3701E5173A3FBF006E573E /* Carbon.framework in Frameworks */,
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
ABB0FBC61A9E5D070060C55A /* CoreAudio.framework in Frameworks */,
AB564908186E6F1F002740F4 /* ForceFeedback.framework in Frameworks */,
ABC572101344347000E7B0B1 /* Foundation.framework in Frameworks */,
AB350BA51478AC96007165AC /* IOKit.framework in Frameworks */,
@ -1494,6 +1521,7 @@
AB796D6715CDCBA200C59155 /* AudioUnit.framework in Frameworks */,
AB74EC8A1738499C0026C41E /* Carbon.framework in Frameworks */,
AB796D6815CDCBA200C59155 /* Cocoa.framework in Frameworks */,
ABB0FBC71A9E5D080060C55A /* CoreAudio.framework in Frameworks */,
AB564907186E6F0C002740F4 /* ForceFeedback.framework in Frameworks */,
AB796D6915CDCBA200C59155 /* Foundation.framework in Frameworks */,
AB796D6A15CDCBA200C59155 /* IOKit.framework in Frameworks */,
@ -1512,6 +1540,7 @@
AB8F3D221A53AC2600A80BF6 /* AudioUnit.framework in Frameworks */,
AB8F3D231A53AC2600A80BF6 /* Carbon.framework in Frameworks */,
AB8F3D241A53AC2600A80BF6 /* Cocoa.framework in Frameworks */,
ABB0FBC51A9E5CEA0060C55A /* CoreAudio.framework in Frameworks */,
AB8F3D251A53AC2600A80BF6 /* ForceFeedback.framework in Frameworks */,
AB8F3D261A53AC2600A80BF6 /* Foundation.framework in Frameworks */,
AB8F3D271A53AC2600A80BF6 /* IOKit.framework in Frameworks */,
@ -1532,6 +1561,7 @@
ABB3C6671501BF8A00E0C22E /* Foundation.framework in Frameworks */,
ABB3C6691501BF8A00E0C22E /* OpenGL.framework in Frameworks */,
ABB3C66A1501BF8A00E0C22E /* libz.dylib in Frameworks */,
ABC503B11AAC4355002FCD43 /* CoreAudio.framework in Frameworks */,
AB5785FD17176AFC002C5FC7 /* OpenEmuBase.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -1597,6 +1627,7 @@
ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */,
AB74EC891738499C0026C41E /* Carbon.framework */,
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
ABB0FBC41A9E5CEA0060C55A /* CoreAudio.framework */,
AB564906186E6F0C002740F4 /* ForceFeedback.framework */,
29B97325FDCFA39411CA2CEA /* Foundation.framework */,
AB350BA41478AC96007165AC /* IOKit.framework */,
@ -1888,7 +1919,12 @@
AB681015187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Red_512x512.png */,
AB681016187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Yellow_512x512.png */,
AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */,
AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */,
ABB0FBC81A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png */,
ABB0FBC91A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png */,
ABC503AC1AAC2B71002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png */,
ABB0FBD81A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png */,
ABB0FBCA1A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png */,
ABB0FBCB1A9EED350060C55A /* Icon_MicrophoneRed_256x256.png */,
AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */,
AB681018187D4AEF0049F2C2 /* Icon_PaddleKnob_256x256.png */,
AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */,
@ -2356,11 +2392,13 @@
buildActionMask = 2147483647;
files = (
AB02475C13886BF300E9F9AB /* KeyNames.plist in Resources */,
ABB0FBDA1A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png in Resources */,
ABC719E2138CB25E002827A9 /* DefaultKeyMappings.plist in Resources */,
ABBC0F8D1394B1AA0028B6BD /* DefaultUserPrefs.plist in Resources */,
AB64987C13ECC73800EE7DD2 /* FileTypeInfo.plist in Resources */,
ABEFCF61141AB82A000CC0CD /* AppIcon_ROMSave.icns in Resources */,
ABEFCF62141AB82A000CC0CD /* AppIcon_DeSmuME.icns in Resources */,
ABB0FBD01A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png in Resources */,
ABEFCF63141AB82A000CC0CD /* AppIcon_NintendoDS_ROM.icns in Resources */,
ABEFCF64141AB82A000CC0CD /* AppIcon_SaveState.icns in Resources */,
AB00E87B14205EAE00DE561F /* InfoPlist.strings in Resources */,
@ -2376,6 +2414,7 @@
ABC3AF3014B7F06900D5B13D /* Icon_VolumeMute_16x16.png in Resources */,
ABC3AF3114B7F06900D5B13D /* Icon_VolumeOneThird_16x16.png in Resources */,
ABC3AF3214B7F06900D5B13D /* Icon_VolumeTwoThird_16x16.png in Resources */,
ABB0FBD31A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png in Resources */,
ABDDF7CC1898F032007583C1 /* Icon_FrameJump_420x420.png in Resources */,
AB0F290214BE6E68009ABC6F /* Icon_Execute_420x420.png in Resources */,
AB0F290314BE6E68009ABC6F /* Icon_Pause_420x420.png in Resources */,
@ -2387,6 +2426,7 @@
AB0F293B14BE6FA7009ABC6F /* ColorSwatch_DarkGreen_16x16.png in Resources */,
AB0F293C14BE6FA7009ABC6F /* ColorSwatch_DarkPurple_16x16.png in Resources */,
AB0F293D14BE6FA7009ABC6F /* ColorSwatch_Gray_16x16.png in Resources */,
ABC503AF1AAC2B91002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */,
AB0F293E14BE6FA7009ABC6F /* ColorSwatch_Green_16x16.png in Resources */,
AB0F293F14BE6FA7009ABC6F /* ColorSwatch_LimeGreen_16x16.png in Resources */,
AB0F294014BE6FA7009ABC6F /* ColorSwatch_Magenta_16x16.png in Resources */,
@ -2426,7 +2466,7 @@
AB0F29AF14BE7213009ABC6F /* Icon_Emulation_420x420.png in Resources */,
AB0F29B014BE7213009ABC6F /* Icon_Input_420x420.png in Resources */,
AB7EC7F7189B2B92009D198A /* Icon_AutoholdSet_420x420.png in Resources */,
AB0F29B114BE7213009ABC6F /* Icon_Microphone_420x420.png in Resources */,
ABB0FBCD1A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png in Resources */,
AB0F29B214BE7213009ABC6F /* Icon_OpenROM_420x420.png in Resources */,
AB0F29B314BE7213009ABC6F /* Icon_Reset_420x420.png in Resources */,
AB0F29B414BE7213009ABC6F /* Icon_RotateCCW_420x420.png in Resources */,
@ -2437,6 +2477,7 @@
AB3ACC3F14C24D5400D7D192 /* ChangeLog in Resources */,
AB3ACC4014C24D5400D7D192 /* COPYING in Resources */,
AB3ACC4114C24D5400D7D192 /* README in Resources */,
ABB0FBD61A9EED350060C55A /* Icon_MicrophoneRed_256x256.png in Resources */,
AB681020187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */,
ABAB4550187CDB70007BE20C /* Image_GuitarGrip.png in Resources */,
AB681022187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */,
@ -2451,11 +2492,13 @@
buildActionMask = 2147483647;
files = (
AB796CA715CDCBA200C59155 /* KeyNames.plist in Resources */,
ABB0FBD91A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png in Resources */,
AB796CA815CDCBA200C59155 /* DefaultKeyMappings.plist in Resources */,
AB796CA915CDCBA200C59155 /* DefaultUserPrefs.plist in Resources */,
AB796CAA15CDCBA200C59155 /* FileTypeInfo.plist in Resources */,
AB796CAB15CDCBA200C59155 /* AppIcon_ROMSave.icns in Resources */,
AB796CAC15CDCBA200C59155 /* AppIcon_DeSmuME.icns in Resources */,
ABB0FBCF1A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png in Resources */,
AB796CAD15CDCBA200C59155 /* AppIcon_NintendoDS_ROM.icns in Resources */,
AB796CAE15CDCBA200C59155 /* AppIcon_SaveState.icns in Resources */,
AB796CAF15CDCBA200C59155 /* InfoPlist.strings in Resources */,
@ -2471,6 +2514,7 @@
AB796CB815CDCBA200C59155 /* Icon_VolumeMute_16x16.png in Resources */,
AB796CB915CDCBA200C59155 /* Icon_VolumeOneThird_16x16.png in Resources */,
AB796CBA15CDCBA200C59155 /* Icon_VolumeTwoThird_16x16.png in Resources */,
ABB0FBD21A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png in Resources */,
ABDDF7CB1898F032007583C1 /* Icon_FrameJump_420x420.png in Resources */,
AB796CBB15CDCBA200C59155 /* Icon_Execute_420x420.png in Resources */,
AB796CBC15CDCBA200C59155 /* Icon_Pause_420x420.png in Resources */,
@ -2482,6 +2526,7 @@
AB796CC215CDCBA200C59155 /* ColorSwatch_DarkGreen_16x16.png in Resources */,
AB796CC315CDCBA200C59155 /* ColorSwatch_DarkPurple_16x16.png in Resources */,
AB796CC415CDCBA200C59155 /* ColorSwatch_Gray_16x16.png in Resources */,
ABC503AD1AAC2B71002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */,
AB796CC515CDCBA200C59155 /* ColorSwatch_Green_16x16.png in Resources */,
AB796CC615CDCBA200C59155 /* ColorSwatch_LimeGreen_16x16.png in Resources */,
AB796CC715CDCBA200C59155 /* ColorSwatch_Magenta_16x16.png in Resources */,
@ -2521,7 +2566,7 @@
AB796CDF15CDCBA200C59155 /* Icon_Emulation_420x420.png in Resources */,
AB796CE015CDCBA200C59155 /* Icon_Input_420x420.png in Resources */,
AB7EC7F6189B2B92009D198A /* Icon_AutoholdSet_420x420.png in Resources */,
AB796CE115CDCBA200C59155 /* Icon_Microphone_420x420.png in Resources */,
ABB0FBCC1A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png in Resources */,
AB796CE215CDCBA200C59155 /* Icon_OpenROM_420x420.png in Resources */,
AB796CE315CDCBA200C59155 /* Icon_Reset_420x420.png in Resources */,
AB796CE415CDCBA200C59155 /* Icon_RotateCCW_420x420.png in Resources */,
@ -2532,6 +2577,7 @@
AB796CE915CDCBA200C59155 /* ChangeLog in Resources */,
AB796CEA15CDCBA200C59155 /* COPYING in Resources */,
AB796CEB15CDCBA200C59155 /* README in Resources */,
ABB0FBD51A9EED350060C55A /* Icon_MicrophoneRed_256x256.png in Resources */,
AB68101F187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */,
ABAB454F187CDB70007BE20C /* Image_GuitarGrip.png in Resources */,
AB681021187D4AEF0049F2C2 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */,
@ -2546,11 +2592,13 @@
buildActionMask = 2147483647;
files = (
AB8F3C1A1A53AC2600A80BF6 /* KeyNames.plist in Resources */,
ABB0FBDB1A9FD0260060C55A /* Icon_MicrophoneGray_256x256.png in Resources */,
AB8F3C1B1A53AC2600A80BF6 /* DefaultKeyMappings.plist in Resources */,
AB8F3C1C1A53AC2600A80BF6 /* DefaultUserPrefs.plist in Resources */,
AB8F3C1D1A53AC2600A80BF6 /* FileTypeInfo.plist in Resources */,
AB8F3C1E1A53AC2600A80BF6 /* AppIcon_ROMSave.icns in Resources */,
AB8F3C1F1A53AC2600A80BF6 /* AppIcon_DeSmuME.icns in Resources */,
ABB0FBD11A9EED350060C55A /* Icon_MicrophoneBlueGlow_256x256.png in Resources */,
AB8F3C201A53AC2600A80BF6 /* AppIcon_NintendoDS_ROM.icns in Resources */,
AB8F3C211A53AC2600A80BF6 /* AppIcon_SaveState.icns in Resources */,
AB8F3C221A53AC2600A80BF6 /* InfoPlist.strings in Resources */,
@ -2566,6 +2614,7 @@
AB8F3C2C1A53AC2600A80BF6 /* Icon_VolumeMute_16x16.png in Resources */,
AB8F3C2D1A53AC2600A80BF6 /* Icon_VolumeOneThird_16x16.png in Resources */,
AB8F3C2E1A53AC2600A80BF6 /* Icon_VolumeTwoThird_16x16.png in Resources */,
ABB0FBD41A9EED350060C55A /* Icon_MicrophoneGreen_256x256.png in Resources */,
AB8F3C2F1A53AC2600A80BF6 /* Icon_FrameJump_420x420.png in Resources */,
AB8F3C301A53AC2600A80BF6 /* Icon_Execute_420x420.png in Resources */,
AB8F3C311A53AC2600A80BF6 /* Icon_Pause_420x420.png in Resources */,
@ -2577,6 +2626,7 @@
AB8F3C371A53AC2600A80BF6 /* ColorSwatch_DarkGreen_16x16.png in Resources */,
AB8F3C381A53AC2600A80BF6 /* ColorSwatch_DarkPurple_16x16.png in Resources */,
AB8F3C391A53AC2600A80BF6 /* ColorSwatch_Gray_16x16.png in Resources */,
ABC503AE1AAC2B90002FCD43 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */,
AB8F3C3A1A53AC2600A80BF6 /* ColorSwatch_Green_16x16.png in Resources */,
AB8F3C3B1A53AC2600A80BF6 /* ColorSwatch_LimeGreen_16x16.png in Resources */,
AB8F3C3C1A53AC2600A80BF6 /* ColorSwatch_Magenta_16x16.png in Resources */,
@ -2616,7 +2666,7 @@
AB8F3C5E1A53AC2600A80BF6 /* Icon_Emulation_420x420.png in Resources */,
AB8F3C5F1A53AC2600A80BF6 /* Icon_Input_420x420.png in Resources */,
AB8F3C601A53AC2600A80BF6 /* Icon_AutoholdSet_420x420.png in Resources */,
AB8F3C611A53AC2600A80BF6 /* Icon_Microphone_420x420.png in Resources */,
ABB0FBCE1A9EED350060C55A /* Icon_MicrophoneBlack_256x256.png in Resources */,
AB8F3C621A53AC2600A80BF6 /* Icon_OpenROM_420x420.png in Resources */,
AB8F3C631A53AC2600A80BF6 /* Icon_Reset_420x420.png in Resources */,
AB8F3C641A53AC2600A80BF6 /* Icon_RotateCCW_420x420.png in Resources */,
@ -2627,6 +2677,7 @@
AB8F3C691A53AC2600A80BF6 /* ChangeLog in Resources */,
AB8F3C6A1A53AC2600A80BF6 /* COPYING in Resources */,
AB8F3C6B1A53AC2600A80BF6 /* README in Resources */,
ABB0FBD71A9EED350060C55A /* Icon_MicrophoneRed_256x256.png in Resources */,
AB8F3C6C1A53AC2600A80BF6 /* Icon_GuitarGrip_Button_Red_512x512.png in Resources */,
AB8F3C6D1A53AC2600A80BF6 /* Image_GuitarGrip.png in Resources */,
AB8F3C6E1A53AC2600A80BF6 /* Icon_GuitarGrip_Button_Yellow_512x512.png in Resources */,
@ -3326,6 +3377,7 @@
ABB3C6821501C04F00E0C22E /* slot2_piano.cpp in Sources */,
ABB3C6831501C04F00E0C22E /* slot2_rumblepak.cpp in Sources */,
ABB3C6841501C04F00E0C22E /* 2xsai.cpp in Sources */,
ABC503B01AAC42C2002FCD43 /* coreaudiosound.cpp in Sources */,
ABB3C6851501C04F00E0C22E /* bilinear.cpp in Sources */,
ABB3C6861501C04F00E0C22E /* epx.cpp in Sources */,
ABB3C6871501C04F00E0C22E /* hq2x.cpp in Sources */,

View File

@ -45,7 +45,6 @@
AB0F29C014BE7213009ABC6F /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; };
AB0F29C114BE7213009ABC6F /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; };
AB0F29C214BE7213009ABC6F /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; };
AB0F29C314BE7213009ABC6F /* Icon_Microphone_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */; };
AB0F29C414BE7213009ABC6F /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; };
AB0F29C514BE7213009ABC6F /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; };
AB0F29C614BE7213009ABC6F /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; };
@ -62,6 +61,36 @@
AB142028186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = AB142025186E2CD80015D52F /* Image_MemoryExpansionPak.png */; };
AB142029186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = AB142025186E2CD80015D52F /* Image_MemoryExpansionPak.png */; };
AB14202A186E2CD80015D52F /* Image_MemoryExpansionPak.png in Resources */ = {isa = PBXBuildFile; fileRef = AB142025186E2CD80015D52F /* Image_MemoryExpansionPak.png */; };
AB1CC8001AA509C2008B0A16 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB1CC7FF1AA509C2008B0A16 /* CoreAudio.framework */; };
AB1CC80A1AA509DF008B0A16 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB1CC7FF1AA509C2008B0A16 /* CoreAudio.framework */; };
AB1CC80B1AA509E0008B0A16 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB1CC7FF1AA509C2008B0A16 /* CoreAudio.framework */; };
AB1CC80C1AA509E0008B0A16 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB1CC7FF1AA509C2008B0A16 /* CoreAudio.framework */; };
AB1CC80D1AA509E1008B0A16 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB1CC7FF1AA509C2008B0A16 /* CoreAudio.framework */; };
AB1CC81B1AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8161AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png */; };
AB1CC81C1AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8171AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png */; };
AB1CC81D1AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8181AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png */; };
AB1CC81E1AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8191AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png */; };
AB1CC81F1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC81A1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png */; };
AB1CC8201AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8161AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png */; };
AB1CC8211AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8171AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png */; };
AB1CC8221AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8181AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png */; };
AB1CC8231AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8191AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png */; };
AB1CC8241AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC81A1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png */; };
AB1CC8251AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8161AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png */; };
AB1CC8261AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8171AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png */; };
AB1CC8271AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8181AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png */; };
AB1CC8281AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8191AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png */; };
AB1CC8291AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC81A1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png */; };
AB1CC82A1AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8161AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png */; };
AB1CC82B1AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8171AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png */; };
AB1CC82C1AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8181AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png */; };
AB1CC82D1AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8191AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png */; };
AB1CC82E1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC81A1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png */; };
AB1CC82F1AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8161AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png */; };
AB1CC8301AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8171AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png */; };
AB1CC8311AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8181AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png */; };
AB1CC8321AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC8191AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png */; };
AB1CC8331AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = AB1CC81A1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png */; };
AB213D45170CB141006DDB0F /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB213D44170CB141006DDB0F /* InputProfileController.mm */; };
AB213D46170CB141006DDB0F /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB213D44170CB141006DDB0F /* InputProfileController.mm */; };
AB213D47170CB141006DDB0F /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB213D44170CB141006DDB0F /* InputProfileController.mm */; };
@ -132,7 +161,6 @@
AB2A99DE1725F00F0062C1A1 /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; };
AB2A99DF1725F00F0062C1A1 /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; };
AB2A99E01725F00F0062C1A1 /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; };
AB2A99E11725F00F0062C1A1 /* Icon_Microphone_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */; };
AB2A99E21725F00F0062C1A1 /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; };
AB2A99E31725F00F0062C1A1 /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; };
AB2A99E41725F00F0062C1A1 /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; };
@ -334,7 +362,6 @@
AB2F3BB415CF9C6000858373 /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; };
AB2F3BB515CF9C6000858373 /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; };
AB2F3BB615CF9C6000858373 /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; };
AB2F3BB715CF9C6000858373 /* Icon_Microphone_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */; };
AB2F3BB815CF9C6000858373 /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; };
AB2F3BB915CF9C6000858373 /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; };
AB2F3BBA15CF9C6000858373 /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; };
@ -741,7 +768,6 @@
AB73A9A11507C9F500A310C8 /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; };
AB73A9A21507C9F500A310C8 /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; };
AB73A9A31507C9F500A310C8 /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; };
AB73A9A41507C9F500A310C8 /* Icon_Microphone_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */; };
AB73A9A51507C9F500A310C8 /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; };
AB73A9A61507C9F500A310C8 /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; };
AB73A9A71507C9F500A310C8 /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; };
@ -907,6 +933,11 @@
ABAAFBEB172122B6005DDDBE /* FileMigrationDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */; };
ABAAFBEC172122B6005DDDBE /* FileMigrationDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */; };
ABAAFBED172122B6005DDDBE /* FileMigrationDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */; };
ABACB73A1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABACB7391AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png */; };
ABACB73B1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABACB7391AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png */; };
ABACB73C1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABACB7391AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png */; };
ABACB73D1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABACB7391AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png */; };
ABACB73E1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */ = {isa = PBXBuildFile; fileRef = ABACB7391AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png */; };
ABAD0F7315ACE7A00000EC47 /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; };
ABAD0F7415ACE7A00000EC47 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; };
ABAD0F7515ACE7A00000EC47 /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; };
@ -965,7 +996,6 @@
ABAD0FAA15ACE7A00000EC47 /* Icon_DSButtonY_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */; };
ABAD0FAB15ACE7A00000EC47 /* Icon_Emulation_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */; };
ABAD0FAC15ACE7A00000EC47 /* Icon_Input_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */; };
ABAD0FAD15ACE7A00000EC47 /* Icon_Microphone_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */; };
ABAD0FAE15ACE7A00000EC47 /* Icon_OpenROM_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */; };
ABAD0FAF15ACE7A00000EC47 /* Icon_Reset_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */; };
ABAD0FB015ACE7A00000EC47 /* Icon_RotateCCW_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */; };
@ -1303,7 +1333,6 @@
AB0F299C14BE7213009ABC6F /* Icon_DSButtonY_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_DSButtonY_420x420.png; path = images/Icon_DSButtonY_420x420.png; sourceTree = "<group>"; };
AB0F299D14BE7213009ABC6F /* Icon_Emulation_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Emulation_420x420.png; path = images/Icon_Emulation_420x420.png; sourceTree = "<group>"; };
AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Input_420x420.png; path = images/Icon_Input_420x420.png; sourceTree = "<group>"; };
AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Microphone_420x420.png; path = images/Icon_Microphone_420x420.png; sourceTree = "<group>"; };
AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_OpenROM_420x420.png; path = images/Icon_OpenROM_420x420.png; sourceTree = "<group>"; };
AB0F29A114BE7213009ABC6F /* Icon_Reset_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Reset_420x420.png; path = images/Icon_Reset_420x420.png; sourceTree = "<group>"; };
AB0F29A214BE7213009ABC6F /* Icon_RotateCCW_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_RotateCCW_420x420.png; path = images/Icon_RotateCCW_420x420.png; sourceTree = "<group>"; };
@ -1312,6 +1341,12 @@
AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speaker_420x420.png; path = images/Icon_Speaker_420x420.png; sourceTree = "<group>"; };
AB126D06182ECB9500EBCF22 /* slot2_passme.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot2_passme.cpp; sourceTree = "<group>"; };
AB142025186E2CD80015D52F /* Image_MemoryExpansionPak.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Image_MemoryExpansionPak.png; path = images/Image_MemoryExpansionPak.png; sourceTree = "<group>"; };
AB1CC7FF1AA509C2008B0A16 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
AB1CC8161AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneBlack_256x256.png; path = images/Icon_MicrophoneBlack_256x256.png; sourceTree = "<group>"; };
AB1CC8171AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneBlueGlow_256x256.png; path = images/Icon_MicrophoneBlueGlow_256x256.png; sourceTree = "<group>"; };
AB1CC8181AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneGray_256x256.png; path = images/Icon_MicrophoneGray_256x256.png; sourceTree = "<group>"; };
AB1CC8191AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneGreen_256x256.png; path = images/Icon_MicrophoneGreen_256x256.png; sourceTree = "<group>"; };
AB1CC81A1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneRed_256x256.png; path = images/Icon_MicrophoneRed_256x256.png; sourceTree = "<group>"; };
AB213D43170CB141006DDB0F /* InputProfileController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InputProfileController.h; sourceTree = "<group>"; };
AB213D44170CB141006DDB0F /* InputProfileController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = InputProfileController.mm; sourceTree = "<group>"; };
AB213E981710D074006DDB0F /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
@ -1408,6 +1443,7 @@
ABA93EAF178C7D4200CBF50B /* encrypt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = encrypt.cpp; path = ../encrypt.cpp; sourceTree = SOURCE_ROOT; };
ABAAFBE8172122B6005DDDBE /* FileMigrationDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileMigrationDelegate.h; sourceTree = "<group>"; };
ABAAFBE9172122B6005DDDBE /* FileMigrationDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FileMigrationDelegate.mm; sourceTree = "<group>"; };
ABACB7391AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_MicrophoneDarkGreen_256x256.png; path = images/Icon_MicrophoneDarkGreen_256x256.png; sourceTree = "<group>"; };
ABAD104915ACE7A00000EC47 /* DeSmuME (PPC).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (PPC).app"; sourceTree = BUILT_PRODUCTS_DIR; };
ABAE2F7918682B6C00C92F4F /* Slot2WindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Slot2WindowDelegate.h; sourceTree = "<group>"; };
ABAE2F7A18682B6C00C92F4F /* Slot2WindowDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Slot2WindowDelegate.mm; sourceTree = "<group>"; };
@ -1741,6 +1777,7 @@
AB2A9A721725F00F0062C1A1 /* IOKit.framework in Frameworks */,
AB2A9A741725F00F0062C1A1 /* libz.dylib in Frameworks */,
AB2A9A731725F00F0062C1A1 /* OpenGL.framework in Frameworks */,
AB1CC8001AA509C2008B0A16 /* CoreAudio.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1759,6 +1796,7 @@
AB2F3C3F15CF9C6000858373 /* IOKit.framework in Frameworks */,
AB2F3C4115CF9C6000858373 /* libz.dylib in Frameworks */,
AB2F3C4015CF9C6000858373 /* OpenGL.framework in Frameworks */,
AB1CC80A1AA509DF008B0A16 /* CoreAudio.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1777,6 +1815,7 @@
AB711F7B1481C35F009011C8 /* IOKit.framework in Frameworks */,
ABC3AFCF14B8D16700D5B13D /* libz.dylib in Frameworks */,
AB711F761481C35F009011C8 /* OpenGL.framework in Frameworks */,
AB1CC80D1AA509E1008B0A16 /* CoreAudio.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1795,6 +1834,7 @@
AB73AA2D1507C9F500A310C8 /* IOKit.framework in Frameworks */,
AB73AA2F1507C9F500A310C8 /* libz.dylib in Frameworks */,
AB73AA2E1507C9F500A310C8 /* OpenGL.framework in Frameworks */,
AB1CC80C1AA509E0008B0A16 /* CoreAudio.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1813,6 +1853,7 @@
ABAD104315ACE7A00000EC47 /* IOKit.framework in Frameworks */,
ABAD104515ACE7A00000EC47 /* libz.dylib in Frameworks */,
ABAD104415ACE7A00000EC47 /* OpenGL.framework in Frameworks */,
AB1CC80B1AA509E0008B0A16 /* CoreAudio.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1873,6 +1914,7 @@
ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */,
ABB6AD5C173A3F2B00EC2E8D /* Carbon.framework */,
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
AB1CC7FF1AA509C2008B0A16 /* CoreAudio.framework */,
AB8C6E56186CD07E00E3EC64 /* ForceFeedback.framework */,
29B97325FDCFA39411CA2CEA /* Foundation.framework */,
AB350BA41478AC96007165AC /* IOKit.framework */,
@ -2063,7 +2105,12 @@
ABD59815187D417900069403 /* Icon_GuitarGrip_Button_Red_512x512.png */,
ABD59816187D417900069403 /* Icon_GuitarGrip_Button_Yellow_512x512.png */,
AB0F299E14BE7213009ABC6F /* Icon_Input_420x420.png */,
AB0F299F14BE7213009ABC6F /* Icon_Microphone_420x420.png */,
AB1CC8161AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png */,
AB1CC8171AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png */,
ABACB7391AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png */,
AB1CC8181AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png */,
AB1CC8191AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png */,
AB1CC81A1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png */,
AB0F29A014BE7213009ABC6F /* Icon_OpenROM_420x420.png */,
ABD59846187D4A6C00069403 /* Icon_PaddleKnob_256x256.png */,
AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */,
@ -2684,7 +2731,6 @@
AB2A99DE1725F00F0062C1A1 /* Icon_DSButtonY_420x420.png in Resources */,
AB2A99DF1725F00F0062C1A1 /* Icon_Emulation_420x420.png in Resources */,
AB2A99E01725F00F0062C1A1 /* Icon_Input_420x420.png in Resources */,
AB2A99E11725F00F0062C1A1 /* Icon_Microphone_420x420.png in Resources */,
AB2A99E21725F00F0062C1A1 /* Icon_OpenROM_420x420.png in Resources */,
AB2A99E31725F00F0062C1A1 /* Icon_Reset_420x420.png in Resources */,
AB2A99E41725F00F0062C1A1 /* Icon_RotateCCW_420x420.png in Resources */,
@ -2714,6 +2760,12 @@
ABBFDFB71898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png in Resources */,
AB851D32189B2C9A007363CC /* Icon_AutoholdClear_420x420.png in Resources */,
AB851D33189B2C9A007363CC /* Icon_AutoholdSet_420x420.png in Resources */,
AB1CC82F1AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */,
AB1CC8301AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */,
AB1CC8311AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */,
AB1CC8321AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */,
AB1CC8331AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */,
ABACB73E1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -2779,7 +2831,6 @@
AB2F3BB415CF9C6000858373 /* Icon_DSButtonY_420x420.png in Resources */,
AB2F3BB515CF9C6000858373 /* Icon_Emulation_420x420.png in Resources */,
AB2F3BB615CF9C6000858373 /* Icon_Input_420x420.png in Resources */,
AB2F3BB715CF9C6000858373 /* Icon_Microphone_420x420.png in Resources */,
AB2F3BB815CF9C6000858373 /* Icon_OpenROM_420x420.png in Resources */,
AB2F3BB915CF9C6000858373 /* Icon_Reset_420x420.png in Resources */,
AB2F3BBA15CF9C6000858373 /* Icon_RotateCCW_420x420.png in Resources */,
@ -2809,6 +2860,12 @@
ABBFDFB11898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png in Resources */,
AB851D2C189B2C9A007363CC /* Icon_AutoholdClear_420x420.png in Resources */,
AB851D2D189B2C9A007363CC /* Icon_AutoholdSet_420x420.png in Resources */,
AB1CC81B1AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */,
AB1CC81C1AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */,
AB1CC81D1AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */,
AB1CC81E1AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */,
AB1CC81F1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */,
ABACB73A1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -2874,7 +2931,6 @@
AB0F29C014BE7213009ABC6F /* Icon_DSButtonY_420x420.png in Resources */,
AB0F29C114BE7213009ABC6F /* Icon_Emulation_420x420.png in Resources */,
AB0F29C214BE7213009ABC6F /* Icon_Input_420x420.png in Resources */,
AB0F29C314BE7213009ABC6F /* Icon_Microphone_420x420.png in Resources */,
AB0F29C414BE7213009ABC6F /* Icon_OpenROM_420x420.png in Resources */,
AB0F29C514BE7213009ABC6F /* Icon_Reset_420x420.png in Resources */,
AB0F29C614BE7213009ABC6F /* Icon_RotateCCW_420x420.png in Resources */,
@ -2904,6 +2960,12 @@
ABBFDFAF1898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png in Resources */,
AB851D2A189B2C9A007363CC /* Icon_AutoholdClear_420x420.png in Resources */,
AB851D2B189B2C9A007363CC /* Icon_AutoholdSet_420x420.png in Resources */,
AB1CC8201AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */,
AB1CC8211AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */,
AB1CC8221AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */,
AB1CC8231AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */,
AB1CC8241AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */,
ABACB73B1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -2969,7 +3031,6 @@
AB73A9A11507C9F500A310C8 /* Icon_DSButtonY_420x420.png in Resources */,
AB73A9A21507C9F500A310C8 /* Icon_Emulation_420x420.png in Resources */,
AB73A9A31507C9F500A310C8 /* Icon_Input_420x420.png in Resources */,
AB73A9A41507C9F500A310C8 /* Icon_Microphone_420x420.png in Resources */,
AB73A9A51507C9F500A310C8 /* Icon_OpenROM_420x420.png in Resources */,
AB73A9A61507C9F500A310C8 /* Icon_Reset_420x420.png in Resources */,
AB73A9A71507C9F500A310C8 /* Icon_RotateCCW_420x420.png in Resources */,
@ -2999,6 +3060,12 @@
ABBFDFB51898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png in Resources */,
AB851D30189B2C9A007363CC /* Icon_AutoholdClear_420x420.png in Resources */,
AB851D31189B2C9A007363CC /* Icon_AutoholdSet_420x420.png in Resources */,
AB1CC82A1AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */,
AB1CC82B1AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */,
AB1CC82C1AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */,
AB1CC82D1AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */,
AB1CC82E1AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */,
ABACB73D1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -3064,7 +3131,6 @@
ABAD0FAA15ACE7A00000EC47 /* Icon_DSButtonY_420x420.png in Resources */,
ABAD0FAB15ACE7A00000EC47 /* Icon_Emulation_420x420.png in Resources */,
ABAD0FAC15ACE7A00000EC47 /* Icon_Input_420x420.png in Resources */,
ABAD0FAD15ACE7A00000EC47 /* Icon_Microphone_420x420.png in Resources */,
ABAD0FAE15ACE7A00000EC47 /* Icon_OpenROM_420x420.png in Resources */,
ABAD0FAF15ACE7A00000EC47 /* Icon_Reset_420x420.png in Resources */,
ABAD0FB015ACE7A00000EC47 /* Icon_RotateCCW_420x420.png in Resources */,
@ -3094,6 +3160,12 @@
ABBFDFB31898EE4B00A3FFA5 /* Icon_FrameJump_420x420.png in Resources */,
AB851D2E189B2C9A007363CC /* Icon_AutoholdClear_420x420.png in Resources */,
AB851D2F189B2C9A007363CC /* Icon_AutoholdSet_420x420.png in Resources */,
AB1CC8251AA50C8D008B0A16 /* Icon_MicrophoneBlack_256x256.png in Resources */,
AB1CC8261AA50C8D008B0A16 /* Icon_MicrophoneBlueGlow_256x256.png in Resources */,
AB1CC8271AA50C8D008B0A16 /* Icon_MicrophoneGray_256x256.png in Resources */,
AB1CC8281AA50C8D008B0A16 /* Icon_MicrophoneGreen_256x256.png in Resources */,
AB1CC8291AA50C8D008B0A16 /* Icon_MicrophoneRed_256x256.png in Resources */,
ABACB73C1AAC46B20066F429 /* Icon_MicrophoneDarkGreen_256x256.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2013 DeSmuME team
Copyright (C) 2013-2015 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
@ -22,21 +22,42 @@
#include "audiosamplegenerator.h"
#include <math.h>
#include "cocoa_globals.h"
#define NUM_INTERNAL_NOISE_SAMPLES 32
static const u8 noiseSample[NUM_INTERNAL_NOISE_SAMPLES] =
static const uint8_t noiseSample[NUM_INTERNAL_NOISE_SAMPLES] =
{
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0x8E, 0xFF,
0xF4, 0xE1, 0xBF, 0x9A, 0x71, 0x58, 0x5B, 0x5F, 0x62, 0xC2, 0x25, 0x05, 0x01, 0x01, 0x01, 0x01
};
AudioSampleBlockGenerator::AudioSampleBlockGenerator(const u8 *audioBuffer, const size_t sampleCount)
size_t AudioGenerator::generateSampleBlock(size_t sampleCount, uint8_t *outBuffer)
{
_buffer = (u8 *)malloc(sampleCount * sizeof(u8));
if (outBuffer == NULL)
{
return 0;
}
for (uint8_t *i = outBuffer; i < outBuffer + sampleCount; i++)
{
*i = this->generateSample();
}
return sampleCount;
}
uint8_t AudioGenerator::generateSample()
{
return MIC_NULL_SAMPLE_VALUE;
}
AudioSampleBlockGenerator::AudioSampleBlockGenerator(const uint8_t *audioBuffer, const size_t sampleCount)
{
_buffer = (uint8_t *)malloc(sampleCount * sizeof(uint8_t));
_sampleCount = sampleCount;
_samplePosition = 0;
memcpy(_buffer, audioBuffer, _sampleCount * sizeof(u8));
memcpy(_buffer, audioBuffer, _sampleCount * sizeof(uint8_t));
}
AudioSampleBlockGenerator::~AudioSampleBlockGenerator()
@ -45,22 +66,22 @@ AudioSampleBlockGenerator::~AudioSampleBlockGenerator()
this->_buffer = NULL;
}
u8* AudioSampleBlockGenerator::allocate(const size_t sampleCount)
uint8_t* AudioSampleBlockGenerator::allocate(const size_t sampleCount)
{
if (this->_buffer != NULL)
{
free(this->_buffer);
}
this->_buffer = (u8 *)malloc(sampleCount * sizeof(u8));
this->_buffer = (uint8_t *)malloc(sampleCount * sizeof(uint8_t));
this->_sampleCount = sampleCount;
this->_samplePosition = 0;
memset(this->_buffer, MIC_NULL_SAMPLE_VALUE, this->_sampleCount * sizeof(u8));
memset(this->_buffer, MIC_NULL_SAMPLE_VALUE, this->_sampleCount * sizeof(uint8_t));
return this->_buffer;
}
u8 AudioSampleBlockGenerator::generateSample()
uint8_t AudioSampleBlockGenerator::generateSample()
{
if (this->_samplePosition >= this->_sampleCount)
{
@ -70,7 +91,7 @@ u8 AudioSampleBlockGenerator::generateSample()
return this->_buffer[_samplePosition++];
}
u8* AudioSampleBlockGenerator::getBuffer() const
uint8_t* AudioSampleBlockGenerator::getBuffer() const
{
return this->_buffer;
}
@ -92,29 +113,41 @@ void AudioSampleBlockGenerator::setSamplePosition(size_t thePosition)
InternalNoiseGenerator::InternalNoiseGenerator()
{
_buffer = (u8 *)malloc(NUM_INTERNAL_NOISE_SAMPLES * sizeof(u8));
_buffer = (uint8_t *)malloc(NUM_INTERNAL_NOISE_SAMPLES * sizeof(uint8_t));
_sampleCount = NUM_INTERNAL_NOISE_SAMPLES;
_samplePosition = 0;
memcpy(_buffer, noiseSample, _sampleCount * sizeof(u8));
memcpy(_buffer, noiseSample, _sampleCount * sizeof(uint8_t));
for (size_t i = 0; i < NUM_INTERNAL_NOISE_SAMPLES; i++)
{
_buffer[i] >>= 1;
}
}
u8 WhiteNoiseGenerator::generateSample()
uint8_t WhiteNoiseGenerator::generateSample()
{
#ifdef __APPLE__
#ifdef MAC_OS_X_VERSION_10_7
if (IsOSXVersionSupported(10, 7, 0))
{
return (u8)(arc4random_uniform(0x00000080) & 0x7F);
return (uint8_t)(arc4random_uniform(0x00000080) & 0x7F);
}
return (u8)((arc4random() % 0x00000080) & 0x7F);
return (uint8_t)((arc4random() % 0x00000080) & 0x7F);
#else
return (u8)((arc4random() % 0x00000080) & 0x7F);
return (uint8_t)((arc4random() % 0x00000080) & 0x7F);
#endif
#else
return (u8)(rand() & 0x7F);
return (uint8_t)(rand() & 0x7F);
#endif
}
SineWaveGenerator::SineWaveGenerator()
{
_frequency = 250.0;
_sampleRate = MIC_SAMPLE_RATE;
_cyclePosition = 0.0;
};
SineWaveGenerator::SineWaveGenerator(const double freq, const double sampleRate)
{
_frequency = freq;
@ -122,9 +155,9 @@ SineWaveGenerator::SineWaveGenerator(const double freq, const double sampleRate)
_cyclePosition = 0.0;
}
u8 SineWaveGenerator::generateSample()
uint8_t SineWaveGenerator::generateSample()
{
const u8 sampleValue = (u8)(63.0 * sin(2.0 * M_PI * this->_cyclePosition)) + MIC_NULL_SAMPLE_VALUE;
const uint8_t sampleValue = (uint8_t)(63.0 * sin(2.0 * M_PI * this->_cyclePosition)) + MIC_NULL_SAMPLE_VALUE;
this->_cyclePosition += (this->_frequency / this->_sampleRate);
return sampleValue;

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2013 DeSmuME team
Copyright (C) 2013-2015 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
@ -18,10 +18,7 @@
#ifndef _AUDIO_SAMPLE_GENERATOR_
#define _AUDIO_SAMPLE_GENERATOR_
#include <stdio.h>
#include "types.h"
#define MIC_NULL_SAMPLE_VALUE 64
#include <stdint.h>
class AudioGenerator
@ -30,25 +27,8 @@ public:
AudioGenerator() {};
virtual ~AudioGenerator() {};
virtual size_t generateSampleBlock(size_t sampleCount, u8 *outBuffer)
{
if (outBuffer == NULL)
{
return 0;
}
for (u8 *i = outBuffer; i < outBuffer + sampleCount; i++)
{
*i = this->generateSample();
}
return sampleCount;
}
virtual u8 generateSample()
{
return MIC_NULL_SAMPLE_VALUE;
}
virtual size_t generateSampleBlock(size_t sampleCount, uint8_t *outBuffer);
virtual uint8_t generateSample();
};
class NullGenerator : public AudioGenerator {};
@ -56,7 +36,7 @@ class NullGenerator : public AudioGenerator {};
class AudioSampleBlockGenerator : public AudioGenerator
{
protected:
u8 *_buffer;
uint8_t *_buffer;
size_t _sampleCount;
size_t _samplePosition;
@ -66,16 +46,16 @@ public:
, _sampleCount(0)
, _samplePosition(0)
{};
AudioSampleBlockGenerator(const u8 *audioBuffer, const size_t sampleCount);
AudioSampleBlockGenerator(const uint8_t *audioBuffer, const size_t sampleCount);
~AudioSampleBlockGenerator();
u8* allocate(const size_t sampleCount);
u8* getBuffer() const;
uint8_t* allocate(const size_t sampleCount);
uint8_t* getBuffer() const;
size_t getSampleCount() const;
size_t getSamplePosition() const;
void setSamplePosition(size_t thePosition);
virtual u8 generateSample();
virtual uint8_t generateSample();
};
class InternalNoiseGenerator : public AudioSampleBlockGenerator
@ -87,7 +67,7 @@ public:
class WhiteNoiseGenerator : public AudioGenerator
{
public:
virtual u8 generateSample();
virtual uint8_t generateSample();
};
class SineWaveGenerator : public AudioGenerator
@ -98,11 +78,7 @@ protected:
double _cyclePosition;
public:
SineWaveGenerator()
: _frequency(250.0)
, _sampleRate(44100.0)
, _cyclePosition(0.0)
{};
SineWaveGenerator();
SineWaveGenerator(const double freq, const double sampleRate);
double getFrequency() const;
@ -112,7 +88,7 @@ public:
double getCyclePosition() const;
void setCyclePosition(double thePosition);
virtual u8 generateSample();
virtual uint8_t generateSample();
};
#endif // _AUDIO_SAMPLE_GENERATOR_

View File

@ -694,6 +694,8 @@ volatile bool execute = true;
pthread_cond_signal(&threadParam.condThreadExecute);
pthread_mutex_unlock(&threadParam.mutexThreadExecute);
[[self cdsController] setHardwareMicPause:!(coreState == CORESTATE_EXECUTE)];
}
- (NSInteger) coreState

View File

@ -224,7 +224,8 @@
#define FRAME_SKIP_BIAS 0.1 // May be any real number. This value acts as a vector addition to the frame skip.
#define MAX_FRAME_SKIP (DS_FRAMES_PER_SECOND / 3.0)
#define SPU_SAMPLE_RATE (44100.0 * DS_FRAMES_PER_SECOND / 60.0) // Samples per second
//#define SPU_SAMPLE_RATE (44100.0 * DS_FRAMES_PER_SECOND / 60.0) // Samples per second
#define SPU_SAMPLE_RATE 44100.0 // Samples per second
#define SPU_SAMPLE_RESOLUTION 16 // Bits per sample; must be a multiple of 8
#define SPU_NUMBER_CHANNELS 2 // Number of channels
#define SPU_SAMPLE_SIZE ((SPU_SAMPLE_RESOLUTION / 8) * SPU_NUMBER_CHANNELS) // Bytes per sample, multiplied by the number of channels
@ -242,8 +243,17 @@
#define ROMINFO_GAME_CODE_LENGTH 4
#define ROMINFO_GAME_BANNER_LENGTH 128
#define MIC_SAMPLE_RATE 16000
#define MIC_MAX_BUFFER_SAMPLES (MIC_SAMPLE_RATE / DS_FRAMES_PER_SECOND)
#define MIC_SAMPLE_RATE 16000.0
#define MIC_SAMPLE_RESOLUTION 8 // Bits per sample; must be a multiple of 8
#define MIC_NUMBER_CHANNELS 1 // Number of channels
#define MIC_SAMPLE_SIZE ((MIC_SAMPLE_RESOLUTION / 8) * MIC_NUMBER_CHANNELS) // Bytes per sample, multiplied by the number of channels
#define MIC_MAX_BUFFER_SAMPLES ((MIC_SAMPLE_RATE / DS_FRAMES_PER_SECOND) * MIC_SAMPLE_SIZE)
#define MIC_CAPTURE_FRAMES 192 // The number of audio frames that the NDS microphone should pull. The lower this value, the lower the latency. Ensure that this value is not too low, or else audio frames may be lost.
#define MIC_CLIP_FRAME_THRESHOLD 15 // When the number of clipped mic samples exceeds this amount, the UI will reflect that the mic is clipping.
#define MIC_CLIP_FRAME_MAX_COUNT 60 // When counting clipped mic samples, don't count past this number. This is to prevent the mic clip state from persisting too long after the mic has stopped clipping.
#define MIC_NULL_FRAME_THRESHOLD 12 // When the number of null mic samples exceeds this amount, the UI will reflect that the mic is null.
#define MIC_NULL_FRAME_MAX_COUNT 24 // When counting null mic samples, don't count past this number. This is to prevent the mic null state from persisting too long after the mic has read some samples.
#define MIC_NULL_SAMPLE_VALUE 64
#define COCOA_DIALOG_CANCEL 0
#define COCOA_DIALOG_DEFAULT 1

View File

@ -1,6 +1,6 @@
/*
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012-2014 DeSmuME Team
Copyright (C) 2012-2015 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
@ -18,8 +18,11 @@
#import <Cocoa/Cocoa.h>
#include <libkern/OSAtomic.h>
#include "mic_ext.h"
#undef BOOL
@class CocoaDSController;
class CoreAudioInput;
class AudioGenerator;
class AudioSampleBlockGenerator;
enum
{
@ -71,32 +74,72 @@ typedef struct
uint16_t turboPattern;
} NDSInput;
@protocol CocoaDSControllerDelegate <NSObject>
@required
- (uint8_t) doMicSamplesReadFromController:(CocoaDSController *)cdsController inSample:(uint8_t)sampleValue;
@optional
- (void) doMicHardwareGainChangedFromController:(CocoaDSController *)cdsController gain:(float)gainValue;
@end
@interface CocoaDSController : NSObject
{
id <CocoaDSControllerDelegate> delegate;
BOOL autohold;
BOOL isAutoholdCleared;
BOOL _useHardwareMic;
size_t _availableMicSamples;
NSInteger micMode;
NSPoint touchLocation;
NDSInput ndsInput[DSControllerState_StatesCount];
AudioSampleBlockGenerator *selectedAudioFileGenerator;
CoreAudioInput *CAInputDevice;
AudioGenerator *softwareMicSampleGenerator;
NSInteger paddleAdjust;
OSSpinLock spinlockControllerState;
}
@property (retain) id <CocoaDSControllerDelegate> delegate;
@property (assign) BOOL autohold;
@property (readonly) BOOL isHardwareMicAvailable;
@property (assign) BOOL hardwareMicEnabled;
@property (readonly) BOOL hardwareMicLocked;
@property (assign) float hardwareMicGain;
@property (assign) BOOL hardwareMicMute;
@property (assign) BOOL hardwareMicPause;
@property (assign) BOOL softwareMicState;
@property (assign) NSInteger softwareMicMode;
@property (assign) NSInteger micMode;
@property (readonly) CoreAudioInput *CAInputDevice;
@property (readonly) AudioGenerator *softwareMicSampleGenerator;
@property (assign) AudioSampleBlockGenerator *selectedAudioFileGenerator;
@property (assign) NSInteger paddleAdjust;
- (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID;
- (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID turbo:(const BOOL)isTurboEnabled;
- (void) setTouchState:(BOOL)theState location:(const NSPoint)theLocation;
- (void) setMicrophoneState:(BOOL)theState inputMode:(const NSInteger)inputMode;
- (void) setSineWaveGeneratorFrequency:(const double)freq;
- (void) clearAutohold;
- (void) flush;
- (void) flushEmpty;
- (uint8_t) handleMicSampleRead:(CoreAudioInput *)caInput softwareMic:(AudioGenerator *)sampleGenerator;
- (void) handleMicHardwareGainChanged:(float)gainValue;
@end
#ifdef __cplusplus
extern "C"
{
#endif
void CAResetCallback(void *inParam1, void *inParam2);
uint8_t CASampleReadCallback(void *inParam1, void *inParam2);
void CAHardwareGainChangedCallback(float normalizedGain, void *inParam1, void *inParam2);
#ifdef __cplusplus
}
#endif

View File

@ -1,6 +1,6 @@
/*
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012-2014 DeSmuME team
Copyright (C) 2012-2015 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
@ -19,15 +19,34 @@
#import "cocoa_input.h"
#import "cocoa_globals.h"
#include "mic_ext.h"
#include "coreaudiosound.h"
#include "audiosamplegenerator.h"
#include "../NDSSystem.h"
#include "../slot2.h"
#undef BOOL
NullGenerator nullSampleGenerator;
InternalNoiseGenerator internalNoiseGenerator;
WhiteNoiseGenerator whiteNoiseGenerator;
SineWaveGenerator sineWaveGenerator(250.0, MIC_SAMPLE_RATE);
@implementation CocoaDSController
@synthesize delegate;
@dynamic isHardwareMicAvailable;
@dynamic hardwareMicEnabled;
@dynamic hardwareMicLocked;
@dynamic hardwareMicGain;
@dynamic hardwareMicMute;
@dynamic hardwareMicPause;
@dynamic softwareMicState;
@dynamic softwareMicMode;
@dynamic autohold;
@synthesize micMode;
@synthesize CAInputDevice;
@synthesize softwareMicSampleGenerator;
@synthesize selectedAudioFileGenerator;
@synthesize paddleAdjust;
@ -47,23 +66,126 @@
ndsInput[i].autohold = false;
}
delegate = nil;
spinlockControllerState = OS_SPINLOCK_INIT;
autohold = NO;
isAutoholdCleared = YES;
_useHardwareMic = NO;
_availableMicSamples = 0;
micMode = MICMODE_NONE;
selectedAudioFileGenerator = NULL;
CAInputDevice = new CoreAudioInput;
CAInputDevice->SetCallbackHardwareGainChanged(&CAHardwareGainChangedCallback, self, NULL);
softwareMicSampleGenerator = &nullSampleGenerator;
touchLocation = NSMakePoint(0.0f, 0.0f);
paddleAdjust = 0;
Mic_SetResetCallback(&CAResetCallback, self, NULL);
Mic_SetSampleReadCallback(&CASampleReadCallback, self, NULL);
return self;
}
- (void)dealloc
{
delete CAInputDevice;
[super dealloc];
}
- (BOOL) isHardwareMicAvailable
{
return ( CAInputDevice->IsHardwareEnabled() &&
!CAInputDevice->IsHardwareLocked() &&
!CAInputDevice->GetPauseState() ) ? YES : NO;
}
- (void) setHardwareMicEnabled:(BOOL)micEnabled
{
if (micEnabled)
{
CAInputDevice->Start();
}
else
{
CAInputDevice->Stop();
}
}
- (BOOL) hardwareMicEnabled
{
return (CAInputDevice->IsHardwareEnabled()) ? YES : NO;
}
- (BOOL) hardwareMicLocked
{
return (CAInputDevice->IsHardwareLocked()) ? YES : NO;
}
- (void) setHardwareMicGain:(float)micGain
{
CAInputDevice->SetGain(micGain);
}
- (float) hardwareMicGain
{
return CAInputDevice->GetGain();
}
- (void) setHardwareMicMute:(BOOL)isMicMuted
{
bool muteState = (isMicMuted) ? true : false;
CAInputDevice->SetMuteState(muteState);
}
- (BOOL) hardwareMicMute
{
BOOL isMicMuted = (CAInputDevice->GetMuteState()) ? YES : NO;
return isMicMuted;
}
- (void) setHardwareMicPause:(BOOL)isMicPaused
{
bool pauseState = (isMicPaused) ? true : false;
CAInputDevice->SetMuteState(pauseState);
}
- (BOOL) hardwareMicPause
{
BOOL isMicPaused = (CAInputDevice->GetPauseState()) ? YES : NO;
return isMicPaused;
}
- (void) setSoftwareMicState:(BOOL)theState
{
OSSpinLockLock(&spinlockControllerState);
ndsInput[DSControllerState_Microphone].state = (theState) ? true : false;
OSSpinLockUnlock(&spinlockControllerState);
}
- (BOOL) softwareMicState
{
OSSpinLockLock(&spinlockControllerState);
BOOL theState = (ndsInput[DSControllerState_Microphone].state) ? YES : NO;
OSSpinLockUnlock(&spinlockControllerState);
return theState;
}
- (void) setSoftwareMicMode:(NSInteger)theMode
{
OSSpinLockLock(&spinlockControllerState);
micMode = theMode;
OSSpinLockUnlock(&spinlockControllerState);
}
- (NSInteger) softwareMicMode
{
OSSpinLockLock(&spinlockControllerState);
NSInteger theMode = micMode;
OSSpinLockUnlock(&spinlockControllerState);
return theMode;
}
- (void) setAutohold:(BOOL)theState
{
OSSpinLockLock(&spinlockControllerState);
@ -136,14 +258,6 @@
OSSpinLockUnlock(&spinlockControllerState);
}
- (void) setMicrophoneState:(BOOL)theState inputMode:(const NSInteger)inputMode
{
OSSpinLockLock(&spinlockControllerState);
ndsInput[DSControllerState_Microphone].state = (theState) ? true : false;
micMode = inputMode;
OSSpinLockUnlock(&spinlockControllerState);
}
- (void) setSineWaveGeneratorFrequency:(const double)freq
{
sineWaveGenerator.setFrequency(freq);
@ -262,36 +376,37 @@
// Setup the DS mic.
AudioGenerator *selectedGenerator = &nullSampleGenerator;
switch (theMicMode)
{
case MICMODE_INTERNAL_NOISE:
selectedGenerator = &internalNoiseGenerator;
break;
case MICMODE_WHITE_NOISE:
selectedGenerator = &whiteNoiseGenerator;
break;
case MICMODE_SINE_WAVE:
selectedGenerator = &sineWaveGenerator;
break;
case MICMODE_AUDIO_FILE:
if (selectedAudioFileGenerator != NULL)
{
selectedGenerator = selectedAudioFileGenerator;
}
break;
default:
break;
}
NDS_setMic(isMicPressed);
if (!isMicPressed)
if (isMicPressed)
{
switch (theMicMode)
{
case MICMODE_INTERNAL_NOISE:
selectedGenerator = &internalNoiseGenerator;
break;
case MICMODE_WHITE_NOISE:
selectedGenerator = &whiteNoiseGenerator;
break;
case MICMODE_SINE_WAVE:
selectedGenerator = &sineWaveGenerator;
break;
case MICMODE_AUDIO_FILE:
if (selectedAudioFileGenerator != NULL)
{
selectedGenerator = selectedAudioFileGenerator;
}
break;
default:
break;
}
}
else
{
selectedGenerator = &nullSampleGenerator;
internalNoiseGenerator.setSamplePosition(0);
sineWaveGenerator.setCyclePosition(0.0);
@ -301,26 +416,9 @@
}
}
static const bool useBufferedSource = false;
Mic_SetUseBufferedSource(useBufferedSource);
if (useBufferedSource)
{
static u8 generatedSampleBuffer[(size_t)(MIC_MAX_BUFFER_SAMPLES + 0.5)] = {0};
static const size_t requestedSamples = MIC_MAX_BUFFER_SAMPLES;
const size_t availableSamples = micInputBuffer.getAvailableElements();
if (availableSamples < requestedSamples)
{
micInputBuffer.drop(requestedSamples - availableSamples);
}
selectedGenerator->generateSampleBlock(requestedSamples, generatedSampleBuffer);
micInputBuffer.write(generatedSampleBuffer, requestedSamples);
}
else
{
Mic_SetSelectedDirectSampleGenerator(selectedGenerator);
}
_useHardwareMic = (isMicPressed) ? NO : YES;
softwareMicSampleGenerator = selectedGenerator;
NDS_setMic(isMicPressed);
}
- (void) flushEmpty
@ -380,30 +478,67 @@
}
// Setup the DS mic.
AudioGenerator *selectedGenerator = &nullSampleGenerator;
_useHardwareMic = NO;
softwareMicSampleGenerator = &nullSampleGenerator;
NDS_setMic(false);
}
- (uint8_t) handleMicSampleRead:(CoreAudioInput *)caInput softwareMic:(AudioGenerator *)sampleGenerator
{
uint8_t theSample = MIC_NULL_SAMPLE_VALUE;
static const bool useBufferedSource = false;
Mic_SetUseBufferedSource(useBufferedSource);
if (useBufferedSource)
if (_useHardwareMic && (caInput != NULL))
{
static u8 generatedSampleBuffer[(size_t)(MIC_MAX_BUFFER_SAMPLES + 0.5)] = {0};
static const size_t requestedSamples = MIC_MAX_BUFFER_SAMPLES;
const size_t availableSamples = micInputBuffer.getAvailableElements();
if (availableSamples < requestedSamples)
if (caInput->GetPauseState())
{
micInputBuffer.drop(requestedSamples - availableSamples);
return theSample;
}
else
{
if (_availableMicSamples == 0)
{
_availableMicSamples = CAInputDevice->Pull();
}
caInput->_samplesConverted->read(&theSample, 1);
theSample >>= 1; // Samples from CoreAudio are 8-bit, so we need to convert the sample to 7-bit
_availableMicSamples--;
}
selectedGenerator->generateSampleBlock(requestedSamples, generatedSampleBuffer);
micInputBuffer.write(generatedSampleBuffer, requestedSamples);
}
else
{
Mic_SetSelectedDirectSampleGenerator(selectedGenerator);
theSample = sampleGenerator->generateSample();
}
return [[self delegate] doMicSamplesReadFromController:self inSample:theSample];
}
- (void) handleMicHardwareGainChanged:(float)gainValue
{
if (delegate == nil || ![delegate respondsToSelector:@selector(doMicHardwareGainChangedFromController:gain:)])
{
return;
}
[[self delegate] doMicHardwareGainChangedFromController:self gain:gainValue];
}
@end
void CAResetCallback(void *inParam1, void *inParam2)
{
CocoaDSController *cdsController = (CocoaDSController *)inParam1;
[cdsController CAInputDevice]->Start();
}
uint8_t CASampleReadCallback(void *inParam1, void *inParam2)
{
CocoaDSController *cdsController = (CocoaDSController *)inParam1;
return [cdsController handleMicSampleRead:[cdsController CAInputDevice] softwareMic:[cdsController softwareMicSampleGenerator]];
}
void CAHardwareGainChangedCallback(float normalizedGain, void *inParam1, void *inParam2)
{
CocoaDSController *cdsController = (CocoaDSController *)inParam1;
[cdsController handleMicHardwareGainChanged:normalizedGain];
}

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2012-2013 DeSmuME team
Copyright (C) 2012-2015 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
@ -25,6 +25,63 @@
#include "ringbuffer.h"
typedef void (*CoreAudioInputHardwareGainChangedCallback)(float normalizedGain, void *inParam1, void *inParam2);
class CoreAudioInput
{
private:
OSSpinLock *_spinlockAUHAL;
CoreAudioInputHardwareGainChangedCallback _hwGainChangedCallbackFunc;
void *_hwGainChangedCallbackParam1;
void *_hwGainChangedCallbackParam2;
AUGraph _auGraph;
AUNode _auFormatConverterNode;
AUNode _auOutputNode;
AudioUnit _auFormatConverterUnit;
float _inputGainNormalized;
AudioUnitElement _inputElement;
bool _isMuted;
bool _isPaused;
bool _isHardwareEnabled;
bool _isHardwareLocked;
OSStatus InitInputAUHAL(UInt32 deviceID);
public:
AudioUnit _auHALInputDevice;
AudioUnit _auOutputUnit;
AudioTimeStamp _timeStamp;
AudioBufferList *_captureBufferList;
AudioBufferList *_convertBufferList;
UInt32 _captureFrames;
RingBuffer *_samplesCaptured;
RingBuffer *_samplesConverted;
CoreAudioInput();
~CoreAudioInput();
void Start();
void Stop();
size_t Pull();
bool IsHardwareEnabled() const;
bool IsHardwareLocked() const;
bool GetMuteState() const;
void SetMuteState(bool muteState);
bool GetPauseState() const;
void SetPauseState(bool pauseState);
float GetGain() const;
void SetGain(float normalizedGain);
void SetGain_ValueOnly(float normalizedGain);
void UpdateHardwareLock();
void SetCallbackHardwareGainChanged(CoreAudioInputHardwareGainChangedCallback callbackFunc, void *inParam1, void *inParam2);
void RunHardwareGainChangedCallback(float normalizedGain);
};
class CoreAudioOutput
{
private:
@ -50,6 +107,38 @@ public:
void setVolume(float vol);
};
OSStatus CoreAudioInputCaptureCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData);
OSStatus CoreAudioInputReceiveCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData);
OSStatus CoreAudioInputConvertCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData);
OSStatus CoreAudioInputDeviceChanged(AudioObjectID inObjectID,
UInt32 inNumberAddresses,
const AudioObjectPropertyAddress inAddresses[],
void *inClientData);
void CoreAudioInputAUHALChanged(void *inRefCon,
AudioUnit inUnit,
AudioUnitPropertyID inID,
AudioUnitScope inScope,
AudioUnitElement inElement);
OSStatus CoreAudioOutputRenderCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
@ -57,4 +146,12 @@ OSStatus CoreAudioOutputRenderCallback(void *inRefCon,
UInt32 inNumberFrames,
AudioBufferList *ioData);
void CoreAudioInputDefaultHardwareGainChangedCallback(float normalizedGain, void *inParam1, void *inParam2);
bool CreateAudioUnitInstance(AudioUnit *au, ComponentDescription *auDescription);
#if defined(MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
bool CreateAudioUnitInstance(AudioUnit *au, AudioComponentDescription *auDescription);
#endif
void DestroyAudioUnitInstance(AudioUnit *au);
#endif

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -21,74 +21,52 @@
#include "../emufile.h"
#include "../readwrite.h"
RingBuffer micInputBuffer(MIC_MAX_BUFFER_SAMPLES * 2, sizeof(u8));
NullGenerator nullSampleGenerator;
InternalNoiseGenerator internalNoiseGenerator;
WhiteNoiseGenerator whiteNoiseGenerator;
SineWaveGenerator sineWaveGenerator(250.0, MIC_SAMPLE_RATE);
static bool _micUseBufferedSource = true;
static AudioGenerator *_selectedDirectSampleGenerator = NULL;
MicResetCallback _micResetCallback = &Mic_DefaultResetCallback;
void *_resetCallbackParam1 = NULL;
void *_resetCallbackParam2 = NULL;
MicSampleReadCallback _micSampleReadCallback = &Mic_DefaultSampleReadCallback;
void *_sampleReadCallbackParam1 = NULL;
void *_sampleReadCallbackParam2 = NULL;
BOOL Mic_Init()
{
// Do nothing.
return TRUE;
}
void Mic_Reset()
{
micInputBuffer.clear();
}
void Mic_DeInit()
{
// Do nothing.
}
void Mic_Reset()
{
_micResetCallback(_resetCallbackParam1, _resetCallbackParam2);
}
// The NDS reads audio samples in the following format:
// Format: Unsigned Linear PCM
// Channels: 1 (mono)
// Sample Rate: 16000 Hz
// Sample Resolution: 7-bit
u8 Mic_ReadSample()
{
u8 theSample = MIC_NULL_SAMPLE_VALUE;
if (_micUseBufferedSource)
{
if (micInputBuffer.isEmpty())
{
return theSample;
}
micInputBuffer.read(&theSample, 1);
}
else
{
if (_selectedDirectSampleGenerator != NULL)
{
theSample = _selectedDirectSampleGenerator->generateSample();
}
}
return theSample;
return _micSampleReadCallback(_sampleReadCallbackParam1, _sampleReadCallbackParam2);
}
bool Mic_GetUseBufferedSource()
void Mic_SetResetCallback(MicResetCallback callbackFunc, void *inParam1, void *inParam2)
{
return _micUseBufferedSource;
_micResetCallback = callbackFunc;
_resetCallbackParam1 = inParam1;
_resetCallbackParam2 = inParam2;
}
void Mic_SetUseBufferedSource(bool theState)
void Mic_SetSampleReadCallback(MicSampleReadCallback callbackFunc, void *inParam1, void *inParam2)
{
_micUseBufferedSource = theState;
}
AudioGenerator* Mic_GetSelectedDirectSampleGenerator()
{
return _selectedDirectSampleGenerator;
}
void Mic_SetSelectedDirectSampleGenerator(AudioGenerator *theGenerator)
{
_selectedDirectSampleGenerator = theGenerator;
_micSampleReadCallback = callbackFunc;
_sampleReadCallbackParam1 = inParam1;
_sampleReadCallbackParam2 = inParam2;
}
void mic_savestate(EMUFILE* os)
@ -101,3 +79,13 @@ bool mic_loadstate(EMUFILE* is, int size)
is->fseek(size, SEEK_CUR);
return true;
}
void Mic_DefaultResetCallback(void *inParam1, void *inParam2)
{
// Do nothing.
}
uint8_t Mic_DefaultSampleReadCallback(void *inParam1, void *inParam2)
{
return MIC_NULL_SAMPLE_VALUE;
}

View File

@ -1,6 +1,6 @@
/*
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012-2013 DeSmuME team
Copyright (C) 2012-2015 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
@ -19,29 +19,15 @@
#ifndef _MIC_EXTENSION_
#define _MIC_EXTENSION_
#include "audiosamplegenerator.h"
#include "ringbuffer.h"
#include <stdint.h>
#ifdef __cplusplus
extern "C"
{
#endif
bool Mic_GetUseBufferedSource();
void Mic_SetUseBufferedSource(bool theState);
AudioGenerator* Mic_GetSelectedDirectSampleGenerator();
void Mic_SetSelectedDirectSampleGenerator(AudioGenerator *theGenerator);
typedef void (*MicResetCallback)(void *inParam1, void *inParam2);
typedef uint8_t (*MicSampleReadCallback)(void *inParam1, void *inParam2);
extern RingBuffer micInputBuffer;
extern NullGenerator nullSampleGenerator;
extern InternalNoiseGenerator internalNoiseGenerator;
extern WhiteNoiseGenerator whiteNoiseGenerator;
extern SineWaveGenerator sineWaveGenerator;
extern AudioGenerator *selectedGeneratorDirect;
#ifdef __cplusplus
}
#endif
void Mic_SetResetCallback(MicResetCallback callbackFunc, void *inParam1, void *inParam2);
void Mic_SetSampleReadCallback(MicSampleReadCallback callbackFunc, void *inParam1, void *inParam2);
void Mic_DefaultResetCallback(void *inParam1, void *inParam2);
uint8_t Mic_DefaultSampleReadCallback(void *inParam1, void *inParam2);
#endif // _MIC_EXTENSION_

View File

@ -18,6 +18,7 @@
#import <Cocoa/Cocoa.h>
#import <OpenEmuBase/OEGameCore.h>
#import "OENDSSystemResponderClient.h"
#import "../cocoa_input.h"
#include <libkern/OSAtomic.h>
#include <pthread.h>
@ -27,7 +28,7 @@
@class CocoaDSFirmware;
@interface NDSGameCore : OEGameCore
@interface NDSGameCore : OEGameCore <CocoaDSControllerDelegate>
{
NSPoint touchLocation;
NSMutableDictionary *addedCheatsDict;

View File

@ -488,4 +488,13 @@ volatile bool execute = true;
}
}
#pragma mark CocoaDSControllerDelegate Protocol
- (uint8_t) doMicSamplesReadFromController:(CocoaDSController *)cdsController inSample:(uint8_t)sampleValue
{
// Do nothing.
// OpenEmu has no UI to reflect changes with the NDS microphone input.
return sampleValue;
}
@end

View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2013 DeSmuME team
Copyright (C) 2013-2015 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
@ -21,17 +21,10 @@
#include <libkern/OSAtomic.h>
RingBuffer::RingBuffer(const size_t numberElements, const size_t newBufferElementSize)
RingBuffer::RingBuffer(const size_t numberElements, const size_t elementSize)
{
_elementCapacity = numberElements;
_elementSize = newBufferElementSize;
_buffer = (uint8_t *)calloc(numberElements + 2, newBufferElementSize);
_bufferSize = (numberElements + 2) * newBufferElementSize;
_readPosition = 0;
_writePosition = 1;
_elementFillCount = 0;
_buffer = NULL;
allocate(numberElements, elementSize);
}
RingBuffer::~RingBuffer()
@ -40,6 +33,26 @@ RingBuffer::~RingBuffer()
_buffer = NULL;
}
void RingBuffer::allocate(const size_t numberElements, const size_t elementSize)
{
this->_elementCapacity = numberElements;
this->_elementSize = elementSize;
this->_bufferSize = (this->_elementCapacity + 2) * this->_elementSize;
this->_buffer = (uint8_t *)realloc(this->_buffer, this->_bufferSize);
memset(this->_buffer, 0, this->_bufferSize);
this->_readPosition = 0;
this->_writePosition = 1;
this->_elementFillCount = 0;
}
void RingBuffer::resize(const size_t numberElements, const size_t elementSize)
{
this->drop(this->getUsedElements());
this->allocate(numberElements, elementSize);
}
void RingBuffer::clear()
{
this->_readPosition = 0;
@ -237,6 +250,11 @@ size_t RingBuffer::getAvailableElements() const
return (this->_elementCapacity - this->_elementFillCount);
}
size_t RingBuffer::getUsedElements() const
{
return (size_t)this->_elementFillCount;
}
size_t RingBuffer::getElementCapacity() const
{
return this->_elementCapacity;

View File

@ -34,15 +34,19 @@ private:
size_t _readPosition;
size_t _writePosition;
void allocate(const size_t numberElements, const size_t elementSize);
public:
RingBuffer(const size_t numberElements, const size_t newBufferElementSize);
RingBuffer(const size_t numberElements, const size_t elementSize);
~RingBuffer();
void clear();
void resize(const size_t numberElements, const size_t elementSize);
size_t read(void *__restrict__ destBuffer, size_t requestedNumberElements);
size_t write(const void *__restrict__ srcBuffer, size_t requestedNumberElements);
size_t drop(size_t requestedNumberElements);
size_t getAvailableElements() const;
size_t getUsedElements() const;
size_t getElementCapacity() const;
size_t getElementSize() const;
bool isEmpty() const;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -79,6 +79,12 @@ class OGLVideoOutput;
DisplayView *view;
NSView *saveScreenshotPanelAccessoryView;
NSView *outputVolumeControlView;
NSView *microphoneGainControlView;
NSMenuItem *outputVolumeMenuItem;
NSMenuItem *microphoneGainMenuItem;
NSSlider *microphoneGainSlider;
NSButton *microphoneMuteButton;
EmuControllerDelegate *emuControl;
CocoaDSDisplayVideo *cdsVideoOutput;
@ -112,6 +118,12 @@ class OGLVideoOutput;
@property (readonly) IBOutlet DisplayView *view;
@property (readonly) IBOutlet NSView *saveScreenshotPanelAccessoryView;
@property (readonly) IBOutlet NSView *outputVolumeControlView;
@property (readonly) IBOutlet NSView *microphoneGainControlView;
@property (readonly) IBOutlet NSMenuItem *outputVolumeMenuItem;
@property (readonly) IBOutlet NSMenuItem *microphoneGainMenuItem;
@property (readonly) IBOutlet NSSlider *microphoneGainSlider;
@property (readonly) IBOutlet NSButton *microphoneMuteButton;
@property (retain) EmuControllerDelegate *emuControl;
@property (assign) CocoaDSDisplayVideo *cdsVideoOutput;
@ -142,6 +154,7 @@ class OGLVideoOutput;
- (void) exitFullScreen;
- (IBAction) copy:(id)sender;
- (IBAction) changeHardwareMicGain:(id)sender;
- (IBAction) changeVolume:(id)sender;
- (IBAction) toggleKeepMinDisplaySizeAtNormal:(id)sender;
- (IBAction) toggleStatusBar:(id)sender;

View File

@ -51,6 +51,12 @@
@synthesize masterWindow;
@synthesize view;
@synthesize saveScreenshotPanelAccessoryView;
@synthesize outputVolumeControlView;
@synthesize microphoneGainControlView;
@synthesize outputVolumeMenuItem;
@synthesize microphoneGainMenuItem;
@synthesize microphoneGainSlider;
@synthesize microphoneMuteButton;
@dynamic normalSize;
@dynamic displayScale;
@ -708,6 +714,11 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
[CocoaDSUtil messageSendOneWay:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_COPY_TO_PASTEBOARD];
}
- (IBAction) changeHardwareMicGain:(id)sender
{
[emuControl changeHardwareMicGain:sender];
}
- (IBAction) changeVolume:(id)sender
{
[emuControl changeVolume:sender];
@ -1085,6 +1096,10 @@ static std::unordered_map<NSScreen *, DisplayWindowController *> _screenMap; //
[[emuControl windowList] addObject:self];
[emuControl updateAllWindowTitles];
// Set up some custom UI elements.
[microphoneGainMenuItem setView:microphoneGainControlView];
[outputVolumeMenuItem setView:outputVolumeControlView];
// Set up the video output thread.
cdsVideoOutput = [[CocoaDSDisplayVideo alloc] init];
[cdsVideoOutput setDelegate:view];

View File

@ -17,10 +17,12 @@
#import <Cocoa/Cocoa.h>
#include <libkern/OSAtomic.h>
#import "../cocoa_input.h"
@class InputManager;
@class CocoaDSRom;
@class CocoaDSFirmware;
@class CocoaDSController;
@class CocoaDSOutput;
@class CocoaDSSpeaker;
@class CocoaDSCheatManager;
@ -28,7 +30,7 @@
@class DisplayWindowController;
class AudioSampleBlockGenerator;
@interface EmuControllerDelegate : NSObject <NSUserInterfaceValidations>
@interface EmuControllerDelegate : NSObject <NSUserInterfaceValidations, CocoaDSControllerDelegate>
{
InputManager *inputManager;
@ -60,6 +62,7 @@ class AudioSampleBlockGenerator;
BOOL isRomLoading;
NSString *statusText;
float currentVolumeValue;
NSImage *currentMicStatusIcon;
NSImage *currentVolumeIcon;
BOOL isShowingSaveStateDialog;
BOOL isShowingFileMigrationDialog;
@ -72,9 +75,20 @@ class AudioSampleBlockGenerator;
NSInteger frameJumpToFrame;
CGFloat lastSetSpeedScalar;
uint32_t hwMicNumberIdleFrames;
uint32_t hwMicNumberClippedFrames;
BOOL isSoftwareMicActive;
BOOL isHardwareMicIdle;
BOOL isHardwareMicInClip;
float currentMicGainValue;
BOOL isSoundMuted;
float lastSetVolumeValue;
NSImage *iconMicDisabled;
NSImage *iconMicIdle;
NSImage *iconMicActive;
NSImage *iconMicInClip;
NSImage *iconMicManualOverride;
NSImage *iconVolumeFull;
NSImage *iconVolumeTwoThird;
NSImage *iconVolumeOneThird;
@ -127,7 +141,13 @@ class AudioSampleBlockGenerator;
@property (assign) BOOL isWorking;
@property (assign) BOOL isRomLoading;
@property (assign) NSString *statusText;
@property (assign) BOOL isSoftwareMicActive;
@property (assign) BOOL isHardwareMicMuted;
@property (assign) BOOL isHardwareMicIdle;
@property (assign) BOOL isHardwareMicInClip;
@property (assign) float currentMicGainValue;
@property (assign) float currentVolumeValue;
@property (retain) NSImage *currentMicStatusIcon;
@property (retain) NSImage *currentVolumeIcon;
@property (assign) BOOL isShowingSaveStateDialog;
@property (assign) BOOL isShowingFileMigrationDialog;
@ -184,6 +204,7 @@ class AudioSampleBlockGenerator;
- (IBAction) changeCoreSpeed:(id)sender;
- (IBAction) changeCoreEmuFlags:(id)sender;
- (IBAction) changeFirmwareSettings:(id)sender;
- (IBAction) changeHardwareMicGain:(id)sender;
- (IBAction) changeVolume:(id)sender;
- (IBAction) changeAudioEngine:(id)sender;
- (IBAction) changeSpuAdvancedLogic:(id)sender;
@ -239,6 +260,9 @@ class AudioSampleBlockGenerator;
- (void) executeCore;
- (void) pauseCore;
- (void) restoreCoreState;
- (void) updateMicStatusIcon;
- (BOOL) isMicSampleIdle:(uint8_t)sampleValue;
- (BOOL) isMicSampleCausingClip:(uint8_t)sampleValue;
- (AudioSampleBlockGenerator *) selectedAudioFileGenerator;
- (void) setSelectedAudioFileGenerator:(AudioSampleBlockGenerator *)theGenerator;

View File

@ -71,7 +71,13 @@
@synthesize isWorking;
@synthesize isRomLoading;
@synthesize statusText;
@synthesize isSoftwareMicActive;
@dynamic isHardwareMicMuted;
@synthesize isHardwareMicIdle;
@synthesize isHardwareMicInClip;
@synthesize currentMicGainValue;
@dynamic currentVolumeValue;
@synthesize currentMicStatusIcon;
@synthesize currentVolumeIcon;
@synthesize isShowingSaveStateDialog;
@ -121,6 +127,12 @@
frameJumpToFrame = 0;
lastSetSpeedScalar = 1.0f;
hwMicNumberIdleFrames = 0;
hwMicNumberClippedFrames = 0;
isSoftwareMicActive = NO;
isHardwareMicIdle = YES;
isHardwareMicInClip = NO;
currentMicGainValue = 0.5f;
isSoundMuted = NO;
lastSetVolumeValue = MAX_VOLUME;
@ -128,6 +140,12 @@
iconPause = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Pause_420x420" ofType:@"png"]];
iconSpeedNormal = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Speed1x_420x420" ofType:@"png"]];
iconSpeedDouble = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Speed2x_420x420" ofType:@"png"]];
iconMicDisabled = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_MicrophoneBlack_256x256" ofType:@"png"]];
iconMicIdle = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_MicrophoneDarkGreen_256x256" ofType:@"png"]];
iconMicActive = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_MicrophoneGreen_256x256" ofType:@"png"]];
iconMicInClip = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_MicrophoneRed_256x256" ofType:@"png"]];
iconMicManualOverride = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_MicrophoneGray_256x256" ofType:@"png"]];
iconVolumeFull = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeFull_16x16" ofType:@"png"]];
iconVolumeTwoThird = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeTwoThird_16x16" ofType:@"png"]];
iconVolumeOneThird = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeOneThird_16x16" ofType:@"png"]];
@ -137,6 +155,7 @@
isRomLoading = NO;
statusText = NSSTRING_STATUS_READY;
currentVolumeValue = MAX_VOLUME;
currentMicStatusIcon = [iconMicDisabled retain];
currentVolumeIcon = [iconVolumeFull retain];
[[NSNotificationCenter defaultCenter] addObserver:self
@ -155,6 +174,12 @@
[iconPause release];
[iconSpeedNormal release];
[iconSpeedDouble release];
[iconMicDisabled release];
[iconMicIdle release];
[iconMicActive release];
[iconMicInClip release];
[iconMicManualOverride release];
[iconVolumeFull release];
[iconVolumeTwoThird release];
[iconVolumeOneThird release];
@ -267,6 +292,19 @@
return [cdsCore speedScalar];
}
- (void) setIsHardwareMicMuted:(BOOL)theState
{
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
[[cdsCore cdsController] setHardwareMicMute:theState];
[self updateMicStatusIcon];
}
- (BOOL) isHardwareMicMuted
{
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
return [[cdsCore cdsController] hardwareMicMute];
}
- (void) setCurrentVolumeValue:(float)vol
{
currentVolumeValue = vol;
@ -807,11 +845,16 @@
[[cdsCore cdsFirmware] update];
}
- (IBAction) changeHardwareMicGain:(id)sender
{
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
[[cdsCore cdsController] setHardwareMicGain:[self currentMicGainValue]];
}
- (IBAction) changeVolume:(id)sender
{
const float vol = [self currentVolumeValue];
[self setCurrentVolumeValue:vol];
[self setStatusText:[NSString stringWithFormat:NSSTRING_STATUS_VOLUME, vol]];
[CocoaDSUtil messageSendOneWayWithFloat:[cdsSpeaker receivePort] msgID:MESSAGE_SET_VOLUME floatValue:vol];
}
@ -1008,15 +1051,18 @@
const BOOL theState = (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_ON) ? YES : NO;
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
CocoaDSController *cdsController = [cdsCore cdsController];
const NSInteger micMode = cmdAttr.intValue[1];
[[cdsCore cdsController] setMicrophoneState:theState inputMode:micMode];
[cdsController setSoftwareMicState:theState];
[cdsController setSoftwareMicMode:micMode];
//[self updateMicStatusIcon];
const float sineWaveFrequency = cmdAttr.floatValue[0];
[[cdsCore cdsController] setSineWaveGeneratorFrequency:sineWaveFrequency];
[cdsController setSineWaveGeneratorFrequency:sineWaveFrequency];
NSString *audioFilePath = cmdAttr.object[0];
[[cdsCore cdsController] setSelectedAudioFileGenerator:[inputManager audioFileGeneratorFromFilePath:audioFilePath]];
[cdsController setSelectedAudioFileGenerator:[inputManager audioFileGeneratorFromFilePath:audioFilePath]];
}
- (void) cmdUpdateDSPaddle:(NSValue *)cmdAttrValue
@ -1865,18 +1911,93 @@
{
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
[cdsCore setCoreState:CORESTATE_EXECUTE];
[self updateMicStatusIcon];
}
- (void) pauseCore
{
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
[cdsCore setCoreState:CORESTATE_PAUSE];
[self updateMicStatusIcon];
}
- (void) restoreCoreState
{
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
[cdsCore restoreCoreState];
[self updateMicStatusIcon];
}
- (void) updateMicStatusIcon
{
NSImage *micIcon = iconMicDisabled;
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
CocoaDSController *cdsController = [cdsCore cdsController];
if ([self isSoftwareMicActive])
{
micIcon = iconMicManualOverride;
}
else
{
if ([cdsController isHardwareMicAvailable])
{
if ([self isHardwareMicInClip])
{
micIcon = iconMicInClip;
}
else if ([self isHardwareMicIdle])
{
micIcon = iconMicIdle;
}
else
{
micIcon = iconMicActive;
}
}
}
[self performSelectorOnMainThread:@selector(setCurrentMicStatusIcon:) withObject:micIcon waitUntilDone:NO];
}
- (BOOL) isMicSampleIdle:(uint8_t)sampleValue
{
if (sampleValue == MIC_NULL_SAMPLE_VALUE)
{
if (hwMicNumberIdleFrames < MIC_NULL_FRAME_MAX_COUNT)
{
hwMicNumberIdleFrames++;
}
}
else
{
if (hwMicNumberIdleFrames > 0)
{
hwMicNumberIdleFrames--;
}
}
return (hwMicNumberIdleFrames >= MIC_NULL_FRAME_THRESHOLD);
}
- (BOOL) isMicSampleCausingClip:(uint8_t)sampleValue
{
if (sampleValue == 0 || sampleValue == 127)
{
if (hwMicNumberClippedFrames < MIC_CLIP_FRAME_MAX_COUNT)
{
hwMicNumberClippedFrames++;
}
}
else
{
if (hwMicNumberClippedFrames > 0)
{
hwMicNumberClippedFrames--;
}
}
return (hwMicNumberClippedFrames >= MIC_CLIP_FRAME_THRESHOLD);
}
- (AudioSampleBlockGenerator *) selectedAudioFileGenerator
@ -2353,4 +2474,56 @@
[[cdsCore cdsGPU] setRender3DDepthComparisonThreshold:[(NSNumber *)[aNotification object] integerValue]];
}
#pragma mark CocoaDSControllerDelegate Protocol
- (uint8_t) doMicSamplesReadFromController:(CocoaDSController *)cdsController inSample:(uint8_t)sampleValue
{
BOOL needsUpdate = NO;
const BOOL controllerSoftwareMicState = [cdsController softwareMicState];
const BOOL isEmuSoftwareMicActive = [self isSoftwareMicActive];
// Check if the software mic state transitioned.
if (( controllerSoftwareMicState && !isEmuSoftwareMicActive) ||
(!controllerSoftwareMicState && isEmuSoftwareMicActive))
{
[self setIsSoftwareMicActive:controllerSoftwareMicState];
needsUpdate = YES;
}
// If we're reading the hardware mic, then check the sample value and make
// sure to check the mic's level state.
if (!controllerSoftwareMicState)
{
const BOOL isSampleIdle = [self isMicSampleIdle:sampleValue];
const BOOL isIdle = [self isHardwareMicIdle];
if (( isSampleIdle && !isIdle) ||
(!isSampleIdle && isIdle))
{
[self setIsHardwareMicIdle:isSampleIdle];
needsUpdate = YES;
}
const BOOL isCausingClip = [self isMicSampleCausingClip:sampleValue];
const BOOL isInClip = [self isHardwareMicInClip];
if (( isCausingClip && !isInClip) ||
(!isCausingClip && isInClip))
{
[self setIsHardwareMicInClip:isCausingClip];
needsUpdate = YES;
}
}
if (needsUpdate)
{
[self updateMicStatusIcon];
}
return sampleValue;
}
- (void) doMicHardwareGainChangedFromController:(CocoaDSController *)cdsController gain:(float)gainValue
{
[self setCurrentMicGainValue:gainValue];
}
@end

View File

@ -30,8 +30,7 @@
#include <string>
#include <vector>
#include "mic_ext.h"
#undef BOOL
#include "../audiosamplegenerator.h"
#define INPUT_HANDLER_STRING_LENGTH 256

View File

@ -1027,7 +1027,7 @@ static std::unordered_map<unsigned short, std::string> keyboardNameTable; // Key
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonR_420x420" ofType:@"png"]] autorelease], @"R",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonStart_420x420" ofType:@"png"]] autorelease], @"Start",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonSelect_420x420" ofType:@"png"]] autorelease], @"Select",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Microphone_420x420" ofType:@"png"]] autorelease], @"Microphone",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_MicrophoneBlueGlow_256x256" ofType:@"png"]] autorelease], @"Microphone",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_GuitarGrip_Button_Green_512x512" ofType:@"png"]] autorelease], @"Guitar Grip: Green",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_GuitarGrip_Button_Red_512x512" ofType:@"png"]] autorelease], @"Guitar Grip: Red",
[[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_GuitarGrip_Button_Yellow_512x512" ofType:@"png"]] autorelease], @"Guitar Grip: Yellow",
@ -1851,11 +1851,11 @@ static std::unordered_map<unsigned short, std::string> keyboardNameTable; // Key
outputFormat.mSampleRate = MIC_SAMPLE_RATE;
outputFormat.mFormatID = kAudioFormatLinearPCM;
outputFormat.mFormatFlags = kAudioFormatFlagIsPacked;
outputFormat.mBytesPerPacket = 1;
outputFormat.mBytesPerPacket = MIC_SAMPLE_SIZE;
outputFormat.mFramesPerPacket = 1;
outputFormat.mBytesPerFrame = 1;
outputFormat.mChannelsPerFrame = 1;
outputFormat.mBitsPerChannel = 8;
outputFormat.mBytesPerFrame = MIC_SAMPLE_SIZE;
outputFormat.mChannelsPerFrame = MIC_NUMBER_CHANNELS;
outputFormat.mBitsPerChannel = MIC_SAMPLE_RESOLUTION;
error = ExtAudioFileSetProperty(audioFile, kExtAudioFileProperty_ClientDataFormat, sizeof(outputFormat), &outputFormat);
if (error != noErr)
@ -1886,7 +1886,7 @@ static std::unordered_map<unsigned short, std::string> keyboardNameTable; // Key
AudioSampleBlockGenerator &theGenerator = audioFileGenerators[filePathStr];
const size_t readSize = 32 * 1024;
const size_t bufferSize = (size_t)((double)(outputFormat.mSampleRate / inputFormat.mSampleRate) * (double)fileLengthFrames) + readSize;
u8 *buffer = theGenerator.allocate(bufferSize);
uint8_t *buffer = theGenerator.allocate(bufferSize);
// Read the audio file and fill the generator's buffer.
AudioBufferList convertedData;

View File

@ -113,7 +113,7 @@
{
NSFont *newFont = [[NSFontManager sharedFontManager] fontWithFamily:[[outCell font] familyName]
traits:([item isKindOfClass:[NSArray class]]) ? NSBoldFontMask : 0
weight:0
weight:5
size:[[outCell font] pointSize]];
[outCell setFont:newFont];
}
@ -121,7 +121,7 @@
{
NSFont *newFont = [[NSFontManager sharedFontManager] fontWithFamily:[[outCell font] familyName]
traits:([item isKindOfClass:[NSArray class]]) ? NSBoldFontMask : 0
weight:0
weight:5
size:[[outCell font] pointSize]];
[outCell setFont:newFont];
}

View File

@ -181,6 +181,7 @@
// Init the DS controller.
CocoaDSController *newController = [[[CocoaDSController alloc] init] autorelease];
[newController setDelegate:emuControl];
[newCore setCdsController:newController];
// Init the DS speakers.