Cocoa Port:
- New feature: Audio files may now be used as audio generators for microphone input. Any Core Audio supported audio format may be used. - New feature: A sine wave tone audio generator is now available as a microphone input. - Fix bug where retrieving input device info from a CommandAttributes struct would retrieve garbage values if an object value was nil. - Fix bug where editing input settings would immediately change the input device info state, instead of waiting for user confirmation as intended. - Decouple the audio sample generation code from the microphone handling code. - Do some code cleanup.
This commit is contained in:
parent
cc767726aa
commit
bd571202e1
|
@ -56,6 +56,14 @@
|
||||||
AB213D46170CB141006DDB0F /* 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 */; };
|
AB213D47170CB141006DDB0F /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB213D44170CB141006DDB0F /* InputProfileController.mm */; };
|
||||||
AB213D48170CB141006DDB0F /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB213D44170CB141006DDB0F /* InputProfileController.mm */; };
|
AB213D48170CB141006DDB0F /* InputProfileController.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB213D44170CB141006DDB0F /* InputProfileController.mm */; };
|
||||||
|
AB213E991710D074006DDB0F /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB213E981710D074006DDB0F /* AudioToolbox.framework */; };
|
||||||
|
AB213EC41710D0A0006DDB0F /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB213E981710D074006DDB0F /* AudioToolbox.framework */; };
|
||||||
|
AB213EC51710D0A1006DDB0F /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB213E981710D074006DDB0F /* AudioToolbox.framework */; };
|
||||||
|
AB213EC61710D0A1006DDB0F /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB213E981710D074006DDB0F /* AudioToolbox.framework */; };
|
||||||
|
AB2145231714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */; };
|
||||||
|
AB2145241714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */; };
|
||||||
|
AB2145251714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */; };
|
||||||
|
AB2145261714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */; };
|
||||||
AB2F3B7D15CF9C6000858373 /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; };
|
AB2F3B7D15CF9C6000858373 /* KeyNames.plist in Resources */ = {isa = PBXBuildFile; fileRef = AB02475B13886BF300E9F9AB /* KeyNames.plist */; };
|
||||||
AB2F3B7E15CF9C6000858373 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; };
|
AB2F3B7E15CF9C6000858373 /* DefaultKeyMappings.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABC719E1138CB25E002827A9 /* DefaultKeyMappings.plist */; };
|
||||||
AB2F3B7F15CF9C6000858373 /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; };
|
AB2F3B7F15CF9C6000858373 /* DefaultUserPrefs.plist in Resources */ = {isa = PBXBuildFile; fileRef = ABBC0F8C1394B1AA0028B6BD /* DefaultUserPrefs.plist */; };
|
||||||
|
@ -212,7 +220,7 @@
|
||||||
AB2F3C2115CF9C6000858373 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; };
|
AB2F3C2115CF9C6000858373 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; };
|
||||||
AB2F3C2215CF9C6000858373 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; };
|
AB2F3C2215CF9C6000858373 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; };
|
||||||
AB2F3C2415CF9C6000858373 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; };
|
AB2F3C2415CF9C6000858373 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; };
|
||||||
AB2F3C2515CF9C6000858373 /* cocoa_mic.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* cocoa_mic.mm */; };
|
AB2F3C2515CF9C6000858373 /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* mic_ext.cpp */; };
|
||||||
AB2F3C2615CF9C6000858373 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; };
|
AB2F3C2615CF9C6000858373 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; };
|
||||||
AB2F3C2715CF9C6000858373 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; };
|
AB2F3C2715CF9C6000858373 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; };
|
||||||
AB2F3C2815CF9C6000858373 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; };
|
AB2F3C2815CF9C6000858373 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; };
|
||||||
|
@ -406,7 +414,7 @@
|
||||||
AB711F521481C35F009011C8 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; };
|
AB711F521481C35F009011C8 /* Timestretcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */; };
|
||||||
AB711F5C1481C35F009011C8 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; };
|
AB711F5C1481C35F009011C8 /* datetime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF1F1345ACBF00AF11D1 /* datetime.cpp */; };
|
||||||
AB711F5D1481C35F009011C8 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; };
|
AB711F5D1481C35F009011C8 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; };
|
||||||
AB711F5E1481C35F009011C8 /* cocoa_mic.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* cocoa_mic.mm */; };
|
AB711F5E1481C35F009011C8 /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* mic_ext.cpp */; };
|
||||||
AB711F5F1481C35F009011C8 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; };
|
AB711F5F1481C35F009011C8 /* OGLRender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEC11345AC8400AF11D1 /* OGLRender.cpp */; };
|
||||||
AB711F601481C35F009011C8 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; };
|
AB711F601481C35F009011C8 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; };
|
||||||
AB711F611481C35F009011C8 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; };
|
AB711F611481C35F009011C8 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; };
|
||||||
|
@ -579,7 +587,7 @@
|
||||||
AB73AA0F1507C9F500A310C8 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; };
|
AB73AA0F1507C9F500A310C8 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; };
|
||||||
AB73AA101507C9F500A310C8 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; };
|
AB73AA101507C9F500A310C8 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; };
|
||||||
AB73AA121507C9F500A310C8 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; };
|
AB73AA121507C9F500A310C8 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; };
|
||||||
AB73AA131507C9F500A310C8 /* cocoa_mic.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* cocoa_mic.mm */; };
|
AB73AA131507C9F500A310C8 /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* mic_ext.cpp */; };
|
||||||
AB73AA141507C9F500A310C8 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; };
|
AB73AA141507C9F500A310C8 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; };
|
||||||
AB73AA151507C9F500A310C8 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; };
|
AB73AA151507C9F500A310C8 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; };
|
||||||
AB73AA161507C9F500A310C8 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; };
|
AB73AA161507C9F500A310C8 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; };
|
||||||
|
@ -770,7 +778,7 @@
|
||||||
ABAD101715ACE7A00000EC47 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; };
|
ABAD101715ACE7A00000EC47 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; };
|
||||||
ABAD101815ACE7A00000EC47 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; };
|
ABAD101815ACE7A00000EC47 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; };
|
||||||
ABAD101A15ACE7A00000EC47 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; };
|
ABAD101A15ACE7A00000EC47 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; };
|
||||||
ABAD101B15ACE7A00000EC47 /* cocoa_mic.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* cocoa_mic.mm */; };
|
ABAD101B15ACE7A00000EC47 /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* mic_ext.cpp */; };
|
||||||
ABAD101C15ACE7A00000EC47 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; };
|
ABAD101C15ACE7A00000EC47 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; };
|
||||||
ABAD101D15ACE7A00000EC47 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; };
|
ABAD101D15ACE7A00000EC47 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; };
|
||||||
ABAD101E15ACE7A00000EC47 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; };
|
ABAD101E15ACE7A00000EC47 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; };
|
||||||
|
@ -931,6 +939,9 @@
|
||||||
AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speaker_420x420.png; path = images/Icon_Speaker_420x420.png; sourceTree = "<group>"; };
|
AB0F29A514BE7213009ABC6F /* Icon_Speaker_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speaker_420x420.png; path = images/Icon_Speaker_420x420.png; sourceTree = "<group>"; };
|
||||||
AB213D43170CB141006DDB0F /* InputProfileController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InputProfileController.h; 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>"; };
|
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; };
|
||||||
|
AB2145211714DFF4006DDB0F /* audiosamplegenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audiosamplegenerator.h; sourceTree = "<group>"; };
|
||||||
|
AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audiosamplegenerator.cpp; sourceTree = "<group>"; };
|
||||||
AB2F3C4515CF9C6000858373 /* DeSmuME (PPC).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (PPC).app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
AB2F3C4515CF9C6000858373 /* DeSmuME (PPC).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DeSmuME (PPC).app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
AB2F56EE1704C86900E28885 /* utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utilities.h; sourceTree = "<group>"; };
|
AB2F56EE1704C86900E28885 /* utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utilities.h; sourceTree = "<group>"; };
|
||||||
AB2F56EF1704C86900E28885 /* utilities.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = utilities.c; sourceTree = "<group>"; };
|
AB2F56EF1704C86900E28885 /* utilities.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = utilities.c; sourceTree = "<group>"; };
|
||||||
|
@ -1202,8 +1213,8 @@
|
||||||
ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SndOut.cpp; sourceTree = "<group>"; };
|
ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SndOut.cpp; sourceTree = "<group>"; };
|
||||||
ABD1FF7B1345ACFA00AF11D1 /* SndOut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SndOut.h; sourceTree = "<group>"; };
|
ABD1FF7B1345ACFA00AF11D1 /* SndOut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SndOut.h; sourceTree = "<group>"; };
|
||||||
ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Timestretcher.cpp; sourceTree = "<group>"; };
|
ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Timestretcher.cpp; sourceTree = "<group>"; };
|
||||||
ABD9A46313DB99B300777194 /* cocoa_mic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_mic.h; sourceTree = "<group>"; };
|
ABD9A46313DB99B300777194 /* mic_ext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mic_ext.h; sourceTree = "<group>"; };
|
||||||
ABD9A46413DB99B300777194 /* cocoa_mic.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_mic.mm; sourceTree = "<group>"; };
|
ABD9A46413DB99B300777194 /* mic_ext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mic_ext.cpp; sourceTree = "<group>"; };
|
||||||
ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_videofilter.h; sourceTree = "<group>"; };
|
ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_videofilter.h; sourceTree = "<group>"; };
|
||||||
ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_videofilter.mm; sourceTree = "<group>"; };
|
ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_videofilter.mm; sourceTree = "<group>"; };
|
||||||
ABE670251415DE6C00E8E4C9 /* tinystr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinystr.cpp; sourceTree = "<group>"; };
|
ABE670251415DE6C00E8E4C9 /* tinystr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinystr.cpp; sourceTree = "<group>"; };
|
||||||
|
@ -1313,6 +1324,7 @@
|
||||||
AB2F3C3F15CF9C6000858373 /* IOKit.framework in Frameworks */,
|
AB2F3C3F15CF9C6000858373 /* IOKit.framework in Frameworks */,
|
||||||
AB2F3C4015CF9C6000858373 /* OpenGL.framework in Frameworks */,
|
AB2F3C4015CF9C6000858373 /* OpenGL.framework in Frameworks */,
|
||||||
AB2F3C4115CF9C6000858373 /* libz.dylib in Frameworks */,
|
AB2F3C4115CF9C6000858373 /* libz.dylib in Frameworks */,
|
||||||
|
AB213EC41710D0A0006DDB0F /* AudioToolbox.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -1328,6 +1340,7 @@
|
||||||
AB711F7B1481C35F009011C8 /* IOKit.framework in Frameworks */,
|
AB711F7B1481C35F009011C8 /* IOKit.framework in Frameworks */,
|
||||||
AB711F761481C35F009011C8 /* OpenGL.framework in Frameworks */,
|
AB711F761481C35F009011C8 /* OpenGL.framework in Frameworks */,
|
||||||
ABC3AFCF14B8D16700D5B13D /* libz.dylib in Frameworks */,
|
ABC3AFCF14B8D16700D5B13D /* libz.dylib in Frameworks */,
|
||||||
|
AB213E991710D074006DDB0F /* AudioToolbox.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -1343,6 +1356,7 @@
|
||||||
AB73AA2D1507C9F500A310C8 /* IOKit.framework in Frameworks */,
|
AB73AA2D1507C9F500A310C8 /* IOKit.framework in Frameworks */,
|
||||||
AB73AA2E1507C9F500A310C8 /* OpenGL.framework in Frameworks */,
|
AB73AA2E1507C9F500A310C8 /* OpenGL.framework in Frameworks */,
|
||||||
AB73AA2F1507C9F500A310C8 /* libz.dylib in Frameworks */,
|
AB73AA2F1507C9F500A310C8 /* libz.dylib in Frameworks */,
|
||||||
|
AB213EC61710D0A1006DDB0F /* AudioToolbox.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -1358,6 +1372,7 @@
|
||||||
ABAD104315ACE7A00000EC47 /* IOKit.framework in Frameworks */,
|
ABAD104315ACE7A00000EC47 /* IOKit.framework in Frameworks */,
|
||||||
ABAD104415ACE7A00000EC47 /* OpenGL.framework in Frameworks */,
|
ABAD104415ACE7A00000EC47 /* OpenGL.framework in Frameworks */,
|
||||||
ABAD104515ACE7A00000EC47 /* libz.dylib in Frameworks */,
|
ABAD104515ACE7A00000EC47 /* libz.dylib in Frameworks */,
|
||||||
|
AB213EC51710D0A1006DDB0F /* AudioToolbox.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -1369,9 +1384,12 @@
|
||||||
children = (
|
children = (
|
||||||
AB3ACB6514C2361100D7D192 /* userinterface */,
|
AB3ACB6514C2361100D7D192 /* userinterface */,
|
||||||
AB2F56EF1704C86900E28885 /* utilities.c */,
|
AB2F56EF1704C86900E28885 /* utilities.c */,
|
||||||
|
AB2145221714DFF4006DDB0F /* audiosamplegenerator.cpp */,
|
||||||
ABD0A5341501AA5A0074A094 /* coreaudiosound.cpp */,
|
ABD0A5341501AA5A0074A094 /* coreaudiosound.cpp */,
|
||||||
|
ABD9A46413DB99B300777194 /* mic_ext.cpp */,
|
||||||
ABD0A5351501AA5A0074A094 /* ringbuffer.cpp */,
|
ABD0A5351501AA5A0074A094 /* ringbuffer.cpp */,
|
||||||
ABD104141346652500AF11D1 /* sndOSX.cpp */,
|
ABD104141346652500AF11D1 /* sndOSX.cpp */,
|
||||||
|
AB2145211714DFF4006DDB0F /* audiosamplegenerator.h */,
|
||||||
ABA6574914511EC90077E5E9 /* cocoa_cheat.h */,
|
ABA6574914511EC90077E5E9 /* cocoa_cheat.h */,
|
||||||
ABD103FE1346652500AF11D1 /* cocoa_core.h */,
|
ABD103FE1346652500AF11D1 /* cocoa_core.h */,
|
||||||
AB58F32B1364F44B0074C376 /* cocoa_file.h */,
|
AB58F32B1364F44B0074C376 /* cocoa_file.h */,
|
||||||
|
@ -1379,12 +1397,12 @@
|
||||||
AB9971CE134EDA0800531BA7 /* cocoa_globals.h */,
|
AB9971CE134EDA0800531BA7 /* cocoa_globals.h */,
|
||||||
AB6A198116CAD66900384EED /* cocoa_GPU.h */,
|
AB6A198116CAD66900384EED /* cocoa_GPU.h */,
|
||||||
ABD103FF1346652500AF11D1 /* cocoa_input.h */,
|
ABD103FF1346652500AF11D1 /* cocoa_input.h */,
|
||||||
ABD9A46313DB99B300777194 /* cocoa_mic.h */,
|
|
||||||
AB3E34C7134AF4500056477A /* cocoa_output.h */,
|
AB3E34C7134AF4500056477A /* cocoa_output.h */,
|
||||||
ABD104001346652500AF11D1 /* cocoa_rom.h */,
|
ABD104001346652500AF11D1 /* cocoa_rom.h */,
|
||||||
AB80E050142BC4FA00A52038 /* cocoa_util.h */,
|
AB80E050142BC4FA00A52038 /* cocoa_util.h */,
|
||||||
ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */,
|
ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */,
|
||||||
ABD0A5361501AA5A0074A094 /* coreaudiosound.h */,
|
ABD0A5361501AA5A0074A094 /* coreaudiosound.h */,
|
||||||
|
ABD9A46313DB99B300777194 /* mic_ext.h */,
|
||||||
ABD0A5371501AA5A0074A094 /* ringbuffer.h */,
|
ABD0A5371501AA5A0074A094 /* ringbuffer.h */,
|
||||||
ABD104011346652500AF11D1 /* sndOSX.h */,
|
ABD104011346652500AF11D1 /* sndOSX.h */,
|
||||||
AB2F56EE1704C86900E28885 /* utilities.h */,
|
AB2F56EE1704C86900E28885 /* utilities.h */,
|
||||||
|
@ -1394,7 +1412,6 @@
|
||||||
ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */,
|
ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */,
|
||||||
AB6A198216CAD66900384EED /* cocoa_GPU.mm */,
|
AB6A198216CAD66900384EED /* cocoa_GPU.mm */,
|
||||||
ABD104111346652500AF11D1 /* cocoa_input.mm */,
|
ABD104111346652500AF11D1 /* cocoa_input.mm */,
|
||||||
ABD9A46413DB99B300777194 /* cocoa_mic.mm */,
|
|
||||||
AB3E34C8134AF4500056477A /* cocoa_output.mm */,
|
AB3E34C8134AF4500056477A /* cocoa_output.mm */,
|
||||||
ABD104131346652500AF11D1 /* cocoa_rom.mm */,
|
ABD104131346652500AF11D1 /* cocoa_rom.mm */,
|
||||||
AB80E04C142BC4A800A52038 /* cocoa_util.mm */,
|
AB80E04C142BC4A800A52038 /* cocoa_util.mm */,
|
||||||
|
@ -1408,6 +1425,7 @@
|
||||||
children = (
|
children = (
|
||||||
AB97C553169646D1002AC11B /* Accelerate.framework */,
|
AB97C553169646D1002AC11B /* Accelerate.framework */,
|
||||||
29B97324FDCFA39411CA2CEA /* AppKit.framework */,
|
29B97324FDCFA39411CA2CEA /* AppKit.framework */,
|
||||||
|
AB213E981710D074006DDB0F /* AudioToolbox.framework */,
|
||||||
ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */,
|
ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */,
|
||||||
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
|
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
|
||||||
29B97325FDCFA39411CA2CEA /* Foundation.framework */,
|
29B97325FDCFA39411CA2CEA /* Foundation.framework */,
|
||||||
|
@ -2623,7 +2641,7 @@
|
||||||
AB2F3C2115CF9C6000858373 /* cocoa_file.mm in Sources */,
|
AB2F3C2115CF9C6000858373 /* cocoa_file.mm in Sources */,
|
||||||
AB2F3C2215CF9C6000858373 /* cocoa_firmware.mm in Sources */,
|
AB2F3C2215CF9C6000858373 /* cocoa_firmware.mm in Sources */,
|
||||||
AB2F3C2415CF9C6000858373 /* cocoa_input.mm in Sources */,
|
AB2F3C2415CF9C6000858373 /* cocoa_input.mm in Sources */,
|
||||||
AB2F3C2515CF9C6000858373 /* cocoa_mic.mm in Sources */,
|
AB2F3C2515CF9C6000858373 /* mic_ext.cpp in Sources */,
|
||||||
AB2F3C2615CF9C6000858373 /* cocoa_output.mm in Sources */,
|
AB2F3C2615CF9C6000858373 /* cocoa_output.mm in Sources */,
|
||||||
AB2F3C2715CF9C6000858373 /* cocoa_rom.mm in Sources */,
|
AB2F3C2715CF9C6000858373 /* cocoa_rom.mm in Sources */,
|
||||||
AB2F3C2815CF9C6000858373 /* cocoa_util.mm in Sources */,
|
AB2F3C2815CF9C6000858373 /* cocoa_util.mm in Sources */,
|
||||||
|
@ -2659,6 +2677,7 @@
|
||||||
AB4C4C5216F55C64002E07CD /* WavFile.cpp in Sources */,
|
AB4C4C5216F55C64002E07CD /* WavFile.cpp in Sources */,
|
||||||
AB2F56F11704C86900E28885 /* utilities.c in Sources */,
|
AB2F56F11704C86900E28885 /* utilities.c in Sources */,
|
||||||
AB213D46170CB141006DDB0F /* InputProfileController.mm in Sources */,
|
AB213D46170CB141006DDB0F /* InputProfileController.mm in Sources */,
|
||||||
|
AB2145241714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -2752,7 +2771,7 @@
|
||||||
AB711F4E1481C35F009011C8 /* cocoa_file.mm in Sources */,
|
AB711F4E1481C35F009011C8 /* cocoa_file.mm in Sources */,
|
||||||
AB711F601481C35F009011C8 /* cocoa_firmware.mm in Sources */,
|
AB711F601481C35F009011C8 /* cocoa_firmware.mm in Sources */,
|
||||||
AB711F461481C35F009011C8 /* cocoa_input.mm in Sources */,
|
AB711F461481C35F009011C8 /* cocoa_input.mm in Sources */,
|
||||||
AB711F5E1481C35F009011C8 /* cocoa_mic.mm in Sources */,
|
AB711F5E1481C35F009011C8 /* mic_ext.cpp in Sources */,
|
||||||
AB711F4C1481C35F009011C8 /* cocoa_output.mm in Sources */,
|
AB711F4C1481C35F009011C8 /* cocoa_output.mm in Sources */,
|
||||||
AB711F481481C35F009011C8 /* cocoa_rom.mm in Sources */,
|
AB711F481481C35F009011C8 /* cocoa_rom.mm in Sources */,
|
||||||
AB711F6C1481C35F009011C8 /* cocoa_util.mm in Sources */,
|
AB711F6C1481C35F009011C8 /* cocoa_util.mm in Sources */,
|
||||||
|
@ -2817,6 +2836,7 @@
|
||||||
AB4C4C4816F55C64002E07CD /* WavFile.cpp in Sources */,
|
AB4C4C4816F55C64002E07CD /* WavFile.cpp in Sources */,
|
||||||
AB2F56F01704C86900E28885 /* utilities.c in Sources */,
|
AB2F56F01704C86900E28885 /* utilities.c in Sources */,
|
||||||
AB213D48170CB141006DDB0F /* InputProfileController.mm in Sources */,
|
AB213D48170CB141006DDB0F /* InputProfileController.mm in Sources */,
|
||||||
|
AB2145261714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -2909,7 +2929,7 @@
|
||||||
AB73AA0F1507C9F500A310C8 /* cocoa_file.mm in Sources */,
|
AB73AA0F1507C9F500A310C8 /* cocoa_file.mm in Sources */,
|
||||||
AB73AA101507C9F500A310C8 /* cocoa_firmware.mm in Sources */,
|
AB73AA101507C9F500A310C8 /* cocoa_firmware.mm in Sources */,
|
||||||
AB73AA121507C9F500A310C8 /* cocoa_input.mm in Sources */,
|
AB73AA121507C9F500A310C8 /* cocoa_input.mm in Sources */,
|
||||||
AB73AA131507C9F500A310C8 /* cocoa_mic.mm in Sources */,
|
AB73AA131507C9F500A310C8 /* mic_ext.cpp in Sources */,
|
||||||
AB73AA141507C9F500A310C8 /* cocoa_output.mm in Sources */,
|
AB73AA141507C9F500A310C8 /* cocoa_output.mm in Sources */,
|
||||||
AB73AA151507C9F500A310C8 /* cocoa_rom.mm in Sources */,
|
AB73AA151507C9F500A310C8 /* cocoa_rom.mm in Sources */,
|
||||||
AB73AA161507C9F500A310C8 /* cocoa_util.mm in Sources */,
|
AB73AA161507C9F500A310C8 /* cocoa_util.mm in Sources */,
|
||||||
|
@ -2975,6 +2995,7 @@
|
||||||
AB4C4C6616F55C64002E07CD /* WavFile.cpp in Sources */,
|
AB4C4C6616F55C64002E07CD /* WavFile.cpp in Sources */,
|
||||||
AB2F56F31704C86900E28885 /* utilities.c in Sources */,
|
AB2F56F31704C86900E28885 /* utilities.c in Sources */,
|
||||||
AB213D45170CB141006DDB0F /* InputProfileController.mm in Sources */,
|
AB213D45170CB141006DDB0F /* InputProfileController.mm in Sources */,
|
||||||
|
AB2145251714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -3067,7 +3088,7 @@
|
||||||
ABAD101715ACE7A00000EC47 /* cocoa_file.mm in Sources */,
|
ABAD101715ACE7A00000EC47 /* cocoa_file.mm in Sources */,
|
||||||
ABAD101815ACE7A00000EC47 /* cocoa_firmware.mm in Sources */,
|
ABAD101815ACE7A00000EC47 /* cocoa_firmware.mm in Sources */,
|
||||||
ABAD101A15ACE7A00000EC47 /* cocoa_input.mm in Sources */,
|
ABAD101A15ACE7A00000EC47 /* cocoa_input.mm in Sources */,
|
||||||
ABAD101B15ACE7A00000EC47 /* cocoa_mic.mm in Sources */,
|
ABAD101B15ACE7A00000EC47 /* mic_ext.cpp in Sources */,
|
||||||
ABAD101C15ACE7A00000EC47 /* cocoa_output.mm in Sources */,
|
ABAD101C15ACE7A00000EC47 /* cocoa_output.mm in Sources */,
|
||||||
ABAD101D15ACE7A00000EC47 /* cocoa_rom.mm in Sources */,
|
ABAD101D15ACE7A00000EC47 /* cocoa_rom.mm in Sources */,
|
||||||
ABAD101E15ACE7A00000EC47 /* cocoa_util.mm in Sources */,
|
ABAD101E15ACE7A00000EC47 /* cocoa_util.mm in Sources */,
|
||||||
|
@ -3103,6 +3124,7 @@
|
||||||
AB4C4C5C16F55C64002E07CD /* WavFile.cpp in Sources */,
|
AB4C4C5C16F55C64002E07CD /* WavFile.cpp in Sources */,
|
||||||
AB2F56F21704C86900E28885 /* utilities.c in Sources */,
|
AB2F56F21704C86900E28885 /* utilities.c in Sources */,
|
||||||
AB213D47170CB141006DDB0F /* InputProfileController.mm in Sources */,
|
AB213D47170CB141006DDB0F /* InputProfileController.mm in Sources */,
|
||||||
|
AB2145231714DFF4006DDB0F /* audiosamplegenerator.cpp in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|
|
@ -354,7 +354,6 @@
|
||||||
AB796D4C15CDCBA200C59155 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; };
|
AB796D4C15CDCBA200C59155 /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; };
|
||||||
AB796D4D15CDCBA200C59155 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; };
|
AB796D4D15CDCBA200C59155 /* cocoa_firmware.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */; };
|
||||||
AB796D4F15CDCBA200C59155 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; };
|
AB796D4F15CDCBA200C59155 /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; };
|
||||||
AB796D5015CDCBA200C59155 /* cocoa_mic.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* cocoa_mic.mm */; };
|
|
||||||
AB796D5115CDCBA200C59155 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; };
|
AB796D5115CDCBA200C59155 /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; };
|
||||||
AB796D5215CDCBA200C59155 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; };
|
AB796D5215CDCBA200C59155 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; };
|
||||||
AB796D5315CDCBA200C59155 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; };
|
AB796D5315CDCBA200C59155 /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; };
|
||||||
|
@ -391,6 +390,9 @@
|
||||||
AB901BDE1420706100348EEC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; };
|
AB901BDE1420706100348EEC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; };
|
||||||
AB91D46B13BD013800462471 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; };
|
AB91D46B13BD013800462471 /* fs-linux.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEB21345AC8400AF11D1 /* fs-linux.cpp */; };
|
||||||
ABA6574B14511EC90077E5E9 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; };
|
ABA6574B14511EC90077E5E9 /* cocoa_cheat.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */; };
|
||||||
|
ABACB8DC1710B621003B845D /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABACB8DB1710B621003B845D /* AudioToolbox.framework */; };
|
||||||
|
ABACB8DD1710B656003B845D /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABACB8DB1710B621003B845D /* AudioToolbox.framework */; };
|
||||||
|
ABACB8DE1710B65F003B845D /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABACB8DB1710B621003B845D /* AudioToolbox.framework */; };
|
||||||
ABAD3E7113AF1D6D00502E1E /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6513AF1D6D00502E1E /* AAFilter.cpp */; };
|
ABAD3E7113AF1D6D00502E1E /* AAFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6513AF1D6D00502E1E /* AAFilter.cpp */; };
|
||||||
ABAD3E7413AF1D6D00502E1E /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6813AF1D6D00502E1E /* FIFOSampleBuffer.cpp */; };
|
ABAD3E7413AF1D6D00502E1E /* FIFOSampleBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6813AF1D6D00502E1E /* FIFOSampleBuffer.cpp */; };
|
||||||
ABAD3E7513AF1D6D00502E1E /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6913AF1D6D00502E1E /* FIRFilter.cpp */; };
|
ABAD3E7513AF1D6D00502E1E /* FIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABAD3E6913AF1D6D00502E1E /* FIRFilter.cpp */; };
|
||||||
|
@ -412,7 +414,6 @@
|
||||||
ABB3C6701501C04F00E0C22E /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; };
|
ABB3C6701501C04F00E0C22E /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; };
|
||||||
ABB3C6711501C04F00E0C22E /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; };
|
ABB3C6711501C04F00E0C22E /* cocoa_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104121346652500AF11D1 /* cocoa_core.mm */; };
|
||||||
ABB3C6721501C04F00E0C22E /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; };
|
ABB3C6721501C04F00E0C22E /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; };
|
||||||
ABB3C6731501C04F00E0C22E /* cocoa_mic.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* cocoa_mic.mm */; };
|
|
||||||
ABB3C6741501C04F00E0C22E /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; };
|
ABB3C6741501C04F00E0C22E /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; };
|
||||||
ABB3C6751501C04F00E0C22E /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; };
|
ABB3C6751501C04F00E0C22E /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; };
|
||||||
ABB3C6761501C04F00E0C22E /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; };
|
ABB3C6761501C04F00E0C22E /* cocoa_util.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB80E04C142BC4A800A52038 /* cocoa_util.mm */; };
|
||||||
|
@ -530,6 +531,14 @@
|
||||||
ABD1041E1346652500AF11D1 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; };
|
ABD1041E1346652500AF11D1 /* cocoa_rom.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104131346652500AF11D1 /* cocoa_rom.mm */; };
|
||||||
ABD1041F1346652500AF11D1 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD104141346652500AF11D1 /* sndOSX.cpp */; };
|
ABD1041F1346652500AF11D1 /* sndOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD104141346652500AF11D1 /* sndOSX.cpp */; };
|
||||||
ABD104281346653B00AF11D1 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABD104271346653B00AF11D1 /* main.m */; };
|
ABD104281346653B00AF11D1 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABD104271346653B00AF11D1 /* main.m */; };
|
||||||
|
ABD10AE71715FCDD00B5729D /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE51715FCDD00B5729D /* audiosamplegenerator.cpp */; };
|
||||||
|
ABD10AE81715FCDD00B5729D /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE51715FCDD00B5729D /* audiosamplegenerator.cpp */; };
|
||||||
|
ABD10AE91715FCDD00B5729D /* audiosamplegenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE51715FCDD00B5729D /* audiosamplegenerator.cpp */; };
|
||||||
|
ABD10AEA1715FCDD00B5729D /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE61715FCDD00B5729D /* mic_ext.cpp */; };
|
||||||
|
ABD10AEB1715FCDD00B5729D /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE61715FCDD00B5729D /* mic_ext.cpp */; };
|
||||||
|
ABD10AEC1715FCDD00B5729D /* mic_ext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD10AE61715FCDD00B5729D /* mic_ext.cpp */; };
|
||||||
|
ABD10AED17160C9300B5729D /* ringbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB1B9E601501A78000464647 /* ringbuffer.cpp */; };
|
||||||
|
ABD10AEE17160CDD00B5729D /* cocoa_input.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD104111346652500AF11D1 /* cocoa_input.mm */; };
|
||||||
ABD1FED01345AC8400AF11D1 /* addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA11345AC8400AF11D1 /* addons.cpp */; };
|
ABD1FED01345AC8400AF11D1 /* addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA11345AC8400AF11D1 /* addons.cpp */; };
|
||||||
ABD1FED21345AC8400AF11D1 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; };
|
ABD1FED21345AC8400AF11D1 /* arm_instructions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA31345AC8400AF11D1 /* arm_instructions.cpp */; };
|
||||||
ABD1FED31345AC8400AF11D1 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; };
|
ABD1FED31345AC8400AF11D1 /* armcpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FEA41345AC8400AF11D1 /* armcpu.cpp */; };
|
||||||
|
@ -598,7 +607,6 @@
|
||||||
ABD1FF681345ACBF00AF11D1 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; };
|
ABD1FF681345ACBF00AF11D1 /* vfat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF4F1345ACBF00AF11D1 /* vfat.cpp */; };
|
||||||
ABD1FF691345ACBF00AF11D1 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; };
|
ABD1FF691345ACBF00AF11D1 /* xstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF511345ACBF00AF11D1 /* xstring.cpp */; };
|
||||||
ABD1FF9F1345ACFA00AF11D1 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; };
|
ABD1FF9F1345ACFA00AF11D1 /* metaspu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABD1FF771345ACFA00AF11D1 /* metaspu.cpp */; };
|
||||||
ABD9A46513DB99B300777194 /* cocoa_mic.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABD9A46413DB99B300777194 /* cocoa_mic.mm */; };
|
|
||||||
ABE5DE95143F781900835AD8 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; };
|
ABE5DE95143F781900835AD8 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; };
|
||||||
ABE5DFE5143FB1DA00835AD8 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; };
|
ABE5DFE5143FB1DA00835AD8 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; };
|
||||||
ABE6702B1415DE6C00E8E4C9 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; };
|
ABE6702B1415DE6C00E8E4C9 /* tinystr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ABE670251415DE6C00E8E4C9 /* tinystr.cpp */; };
|
||||||
|
@ -809,6 +817,7 @@
|
||||||
AB9971CE134EDA0800531BA7 /* cocoa_globals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_globals.h; sourceTree = "<group>"; };
|
AB9971CE134EDA0800531BA7 /* cocoa_globals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_globals.h; sourceTree = "<group>"; };
|
||||||
ABA6574914511EC90077E5E9 /* cocoa_cheat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_cheat.h; sourceTree = "<group>"; };
|
ABA6574914511EC90077E5E9 /* cocoa_cheat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_cheat.h; sourceTree = "<group>"; };
|
||||||
ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_cheat.mm; sourceTree = "<group>"; };
|
ABA6574A14511EC90077E5E9 /* cocoa_cheat.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_cheat.mm; sourceTree = "<group>"; };
|
||||||
|
ABACB8DB1710B621003B845D /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
|
||||||
ABAD3E5913AF1D6D00502E1E /* AAFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAFilter.h; sourceTree = "<group>"; };
|
ABAD3E5913AF1D6D00502E1E /* AAFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAFilter.h; sourceTree = "<group>"; };
|
||||||
ABAD3E5A13AF1D6D00502E1E /* BPMDetect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BPMDetect.h; sourceTree = "<group>"; };
|
ABAD3E5A13AF1D6D00502E1E /* BPMDetect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BPMDetect.h; sourceTree = "<group>"; };
|
||||||
ABAD3E5B13AF1D6D00502E1E /* cpu_detect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpu_detect.h; sourceTree = "<group>"; };
|
ABAD3E5B13AF1D6D00502E1E /* cpu_detect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpu_detect.h; sourceTree = "<group>"; };
|
||||||
|
@ -862,6 +871,10 @@
|
||||||
ABD104141346652500AF11D1 /* sndOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sndOSX.cpp; sourceTree = "<group>"; };
|
ABD104141346652500AF11D1 /* sndOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sndOSX.cpp; sourceTree = "<group>"; };
|
||||||
ABD104271346653B00AF11D1 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
ABD104271346653B00AF11D1 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
||||||
ABD10452134666DD00AF11D1 /* DeSmuME_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeSmuME_Prefix.pch; sourceTree = "<group>"; };
|
ABD10452134666DD00AF11D1 /* DeSmuME_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeSmuME_Prefix.pch; sourceTree = "<group>"; };
|
||||||
|
ABD10AE31715FCDD00B5729D /* audiosamplegenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audiosamplegenerator.h; sourceTree = SOURCE_ROOT; };
|
||||||
|
ABD10AE41715FCDD00B5729D /* mic_ext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mic_ext.h; sourceTree = SOURCE_ROOT; };
|
||||||
|
ABD10AE51715FCDD00B5729D /* audiosamplegenerator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audiosamplegenerator.cpp; sourceTree = SOURCE_ROOT; };
|
||||||
|
ABD10AE61715FCDD00B5729D /* mic_ext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mic_ext.cpp; sourceTree = SOURCE_ROOT; };
|
||||||
ABD1FE6B1345AC8400AF11D1 /* addons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = addons.h; path = ../addons.h; sourceTree = SOURCE_ROOT; };
|
ABD1FE6B1345AC8400AF11D1 /* addons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = addons.h; path = ../addons.h; sourceTree = SOURCE_ROOT; };
|
||||||
ABD1FE6C1345AC8400AF11D1 /* agg2d.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = agg2d.h; path = ../agg2d.h; sourceTree = SOURCE_ROOT; };
|
ABD1FE6C1345AC8400AF11D1 /* agg2d.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = agg2d.h; path = ../agg2d.h; sourceTree = SOURCE_ROOT; };
|
||||||
ABD1FE6D1345AC8400AF11D1 /* aggdraw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aggdraw.h; path = ../aggdraw.h; sourceTree = SOURCE_ROOT; };
|
ABD1FE6D1345AC8400AF11D1 /* aggdraw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aggdraw.h; path = ../aggdraw.h; sourceTree = SOURCE_ROOT; };
|
||||||
|
@ -1029,8 +1042,6 @@
|
||||||
ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SndOut.cpp; sourceTree = "<group>"; };
|
ABD1FF7A1345ACFA00AF11D1 /* SndOut.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SndOut.cpp; sourceTree = "<group>"; };
|
||||||
ABD1FF7B1345ACFA00AF11D1 /* SndOut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SndOut.h; sourceTree = "<group>"; };
|
ABD1FF7B1345ACFA00AF11D1 /* SndOut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SndOut.h; sourceTree = "<group>"; };
|
||||||
ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Timestretcher.cpp; sourceTree = "<group>"; };
|
ABD1FF9B1345ACFA00AF11D1 /* Timestretcher.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Timestretcher.cpp; sourceTree = "<group>"; };
|
||||||
ABD9A46313DB99B300777194 /* cocoa_mic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_mic.h; sourceTree = "<group>"; };
|
|
||||||
ABD9A46413DB99B300777194 /* cocoa_mic.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_mic.mm; sourceTree = "<group>"; };
|
|
||||||
ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_videofilter.h; sourceTree = "<group>"; };
|
ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_videofilter.h; sourceTree = "<group>"; };
|
||||||
ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_videofilter.mm; sourceTree = "<group>"; };
|
ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_videofilter.mm; sourceTree = "<group>"; };
|
||||||
ABE670251415DE6C00E8E4C9 /* tinystr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinystr.cpp; sourceTree = "<group>"; };
|
ABE670251415DE6C00E8E4C9 /* tinystr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tinystr.cpp; sourceTree = "<group>"; };
|
||||||
|
@ -1068,6 +1079,7 @@
|
||||||
files = (
|
files = (
|
||||||
AB4FCEBE1692AB82000F498F /* Accelerate.framework in Frameworks */,
|
AB4FCEBE1692AB82000F498F /* Accelerate.framework in Frameworks */,
|
||||||
ABC5720D1344346600E7B0B1 /* AppKit.framework in Frameworks */,
|
ABC5720D1344346600E7B0B1 /* AppKit.framework in Frameworks */,
|
||||||
|
ABACB8DD1710B656003B845D /* AudioToolbox.framework in Frameworks */,
|
||||||
ABC570D1134431CE00E7B0B1 /* AudioUnit.framework in Frameworks */,
|
ABC570D1134431CE00E7B0B1 /* AudioUnit.framework in Frameworks */,
|
||||||
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
|
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
|
||||||
ABC572101344347000E7B0B1 /* Foundation.framework in Frameworks */,
|
ABC572101344347000E7B0B1 /* Foundation.framework in Frameworks */,
|
||||||
|
@ -1083,6 +1095,7 @@
|
||||||
files = (
|
files = (
|
||||||
AB4FCEBD1692AB82000F498F /* Accelerate.framework in Frameworks */,
|
AB4FCEBD1692AB82000F498F /* Accelerate.framework in Frameworks */,
|
||||||
AB796D6615CDCBA200C59155 /* AppKit.framework in Frameworks */,
|
AB796D6615CDCBA200C59155 /* AppKit.framework in Frameworks */,
|
||||||
|
ABACB8DC1710B621003B845D /* AudioToolbox.framework in Frameworks */,
|
||||||
AB796D6715CDCBA200C59155 /* AudioUnit.framework in Frameworks */,
|
AB796D6715CDCBA200C59155 /* AudioUnit.framework in Frameworks */,
|
||||||
AB796D6815CDCBA200C59155 /* Cocoa.framework in Frameworks */,
|
AB796D6815CDCBA200C59155 /* Cocoa.framework in Frameworks */,
|
||||||
AB796D6915CDCBA200C59155 /* Foundation.framework in Frameworks */,
|
AB796D6915CDCBA200C59155 /* Foundation.framework in Frameworks */,
|
||||||
|
@ -1098,6 +1111,7 @@
|
||||||
files = (
|
files = (
|
||||||
AB4FCEBF1692AB82000F498F /* Accelerate.framework in Frameworks */,
|
AB4FCEBF1692AB82000F498F /* Accelerate.framework in Frameworks */,
|
||||||
ABB3C6641501BF8A00E0C22E /* AppKit.framework in Frameworks */,
|
ABB3C6641501BF8A00E0C22E /* AppKit.framework in Frameworks */,
|
||||||
|
ABACB8DE1710B65F003B845D /* AudioToolbox.framework in Frameworks */,
|
||||||
ABB3C6651501BF8A00E0C22E /* AudioUnit.framework in Frameworks */,
|
ABB3C6651501BF8A00E0C22E /* AudioUnit.framework in Frameworks */,
|
||||||
ABB3C6661501BF8A00E0C22E /* Cocoa.framework in Frameworks */,
|
ABB3C6661501BF8A00E0C22E /* Cocoa.framework in Frameworks */,
|
||||||
ABB3C6671501BF8A00E0C22E /* Foundation.framework in Frameworks */,
|
ABB3C6671501BF8A00E0C22E /* Foundation.framework in Frameworks */,
|
||||||
|
@ -1116,10 +1130,13 @@
|
||||||
ABB3C63A1501BB8300E0C22E /* openemu */,
|
ABB3C63A1501BB8300E0C22E /* openemu */,
|
||||||
AB3ACB6514C2361100D7D192 /* userinterface */,
|
AB3ACB6514C2361100D7D192 /* userinterface */,
|
||||||
AB82445A1704AE9A00B8EE20 /* utilities.c */,
|
AB82445A1704AE9A00B8EE20 /* utilities.c */,
|
||||||
|
ABD10AE51715FCDD00B5729D /* audiosamplegenerator.cpp */,
|
||||||
AB1B9E5F1501A78000464647 /* coreaudiosound.cpp */,
|
AB1B9E5F1501A78000464647 /* coreaudiosound.cpp */,
|
||||||
AB23567216C2F6F400DA782E /* macosx_10_5_compat.cpp */,
|
AB23567216C2F6F400DA782E /* macosx_10_5_compat.cpp */,
|
||||||
|
ABD10AE61715FCDD00B5729D /* mic_ext.cpp */,
|
||||||
AB1B9E601501A78000464647 /* ringbuffer.cpp */,
|
AB1B9E601501A78000464647 /* ringbuffer.cpp */,
|
||||||
ABD104141346652500AF11D1 /* sndOSX.cpp */,
|
ABD104141346652500AF11D1 /* sndOSX.cpp */,
|
||||||
|
ABD10AE31715FCDD00B5729D /* audiosamplegenerator.h */,
|
||||||
ABA6574914511EC90077E5E9 /* cocoa_cheat.h */,
|
ABA6574914511EC90077E5E9 /* cocoa_cheat.h */,
|
||||||
ABD103FE1346652500AF11D1 /* cocoa_core.h */,
|
ABD103FE1346652500AF11D1 /* cocoa_core.h */,
|
||||||
AB58F32B1364F44B0074C376 /* cocoa_file.h */,
|
AB58F32B1364F44B0074C376 /* cocoa_file.h */,
|
||||||
|
@ -1127,12 +1144,12 @@
|
||||||
AB9971CE134EDA0800531BA7 /* cocoa_globals.h */,
|
AB9971CE134EDA0800531BA7 /* cocoa_globals.h */,
|
||||||
AB3A656416CC5442001F5D4A /* cocoa_GPU.h */,
|
AB3A656416CC5442001F5D4A /* cocoa_GPU.h */,
|
||||||
ABD103FF1346652500AF11D1 /* cocoa_input.h */,
|
ABD103FF1346652500AF11D1 /* cocoa_input.h */,
|
||||||
ABD9A46313DB99B300777194 /* cocoa_mic.h */,
|
|
||||||
AB3E34C7134AF4500056477A /* cocoa_output.h */,
|
AB3E34C7134AF4500056477A /* cocoa_output.h */,
|
||||||
ABD104001346652500AF11D1 /* cocoa_rom.h */,
|
ABD104001346652500AF11D1 /* cocoa_rom.h */,
|
||||||
AB80E050142BC4FA00A52038 /* cocoa_util.h */,
|
AB80E050142BC4FA00A52038 /* cocoa_util.h */,
|
||||||
ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */,
|
ABE5DFE3143FB1DA00835AD8 /* cocoa_videofilter.h */,
|
||||||
AB1B9E611501A78000464647 /* coreaudiosound.h */,
|
AB1B9E611501A78000464647 /* coreaudiosound.h */,
|
||||||
|
ABD10AE41715FCDD00B5729D /* mic_ext.h */,
|
||||||
AB1B9E621501A78000464647 /* ringbuffer.h */,
|
AB1B9E621501A78000464647 /* ringbuffer.h */,
|
||||||
ABD104011346652500AF11D1 /* sndOSX.h */,
|
ABD104011346652500AF11D1 /* sndOSX.h */,
|
||||||
AB82445E1704AEC400B8EE20 /* utilities.h */,
|
AB82445E1704AEC400B8EE20 /* utilities.h */,
|
||||||
|
@ -1142,7 +1159,6 @@
|
||||||
ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */,
|
ABE7F53D13EE1C7900FD3A71 /* cocoa_firmware.mm */,
|
||||||
AB3A656016CC5438001F5D4A /* cocoa_GPU.mm */,
|
AB3A656016CC5438001F5D4A /* cocoa_GPU.mm */,
|
||||||
ABD104111346652500AF11D1 /* cocoa_input.mm */,
|
ABD104111346652500AF11D1 /* cocoa_input.mm */,
|
||||||
ABD9A46413DB99B300777194 /* cocoa_mic.mm */,
|
|
||||||
AB3E34C8134AF4500056477A /* cocoa_output.mm */,
|
AB3E34C8134AF4500056477A /* cocoa_output.mm */,
|
||||||
ABD104131346652500AF11D1 /* cocoa_rom.mm */,
|
ABD104131346652500AF11D1 /* cocoa_rom.mm */,
|
||||||
AB80E04C142BC4A800A52038 /* cocoa_util.mm */,
|
AB80E04C142BC4A800A52038 /* cocoa_util.mm */,
|
||||||
|
@ -1156,6 +1172,7 @@
|
||||||
children = (
|
children = (
|
||||||
AB4FCEBC1692AB82000F498F /* Accelerate.framework */,
|
AB4FCEBC1692AB82000F498F /* Accelerate.framework */,
|
||||||
29B97324FDCFA39411CA2CEA /* AppKit.framework */,
|
29B97324FDCFA39411CA2CEA /* AppKit.framework */,
|
||||||
|
ABACB8DB1710B621003B845D /* AudioToolbox.framework */,
|
||||||
ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */,
|
ABC570D0134431CE00E7B0B1 /* AudioUnit.framework */,
|
||||||
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
|
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
|
||||||
29B97325FDCFA39411CA2CEA /* Foundation.framework */,
|
29B97325FDCFA39411CA2CEA /* Foundation.framework */,
|
||||||
|
@ -2197,7 +2214,6 @@
|
||||||
AB58F32D1364F44B0074C376 /* cocoa_file.mm in Sources */,
|
AB58F32D1364F44B0074C376 /* cocoa_file.mm in Sources */,
|
||||||
ABE7F53E13EE1C7900FD3A71 /* cocoa_firmware.mm in Sources */,
|
ABE7F53E13EE1C7900FD3A71 /* cocoa_firmware.mm in Sources */,
|
||||||
ABD1041C1346652500AF11D1 /* cocoa_input.mm in Sources */,
|
ABD1041C1346652500AF11D1 /* cocoa_input.mm in Sources */,
|
||||||
ABD9A46513DB99B300777194 /* cocoa_mic.mm in Sources */,
|
|
||||||
AB3E34C9134AF4500056477A /* cocoa_output.mm in Sources */,
|
AB3E34C9134AF4500056477A /* cocoa_output.mm in Sources */,
|
||||||
ABD1041E1346652500AF11D1 /* cocoa_rom.mm in Sources */,
|
ABD1041E1346652500AF11D1 /* cocoa_rom.mm in Sources */,
|
||||||
AB80E04D142BC4A800A52038 /* cocoa_util.mm in Sources */,
|
AB80E04D142BC4A800A52038 /* cocoa_util.mm in Sources */,
|
||||||
|
@ -2255,6 +2271,8 @@
|
||||||
AB29B33216D4BEBF000EF671 /* InputManager.mm in Sources */,
|
AB29B33216D4BEBF000EF671 /* InputManager.mm in Sources */,
|
||||||
AB82445C1704AE9A00B8EE20 /* utilities.c in Sources */,
|
AB82445C1704AE9A00B8EE20 /* utilities.c in Sources */,
|
||||||
AB01005F170D07B000D70FBE /* InputProfileController.mm in Sources */,
|
AB01005F170D07B000D70FBE /* InputProfileController.mm in Sources */,
|
||||||
|
ABD10AE81715FCDD00B5729D /* audiosamplegenerator.cpp in Sources */,
|
||||||
|
ABD10AEB1715FCDD00B5729D /* mic_ext.cpp in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -2358,7 +2376,6 @@
|
||||||
AB796D4C15CDCBA200C59155 /* cocoa_file.mm in Sources */,
|
AB796D4C15CDCBA200C59155 /* cocoa_file.mm in Sources */,
|
||||||
AB796D4D15CDCBA200C59155 /* cocoa_firmware.mm in Sources */,
|
AB796D4D15CDCBA200C59155 /* cocoa_firmware.mm in Sources */,
|
||||||
AB796D4F15CDCBA200C59155 /* cocoa_input.mm in Sources */,
|
AB796D4F15CDCBA200C59155 /* cocoa_input.mm in Sources */,
|
||||||
AB796D5015CDCBA200C59155 /* cocoa_mic.mm in Sources */,
|
|
||||||
AB796D5115CDCBA200C59155 /* cocoa_output.mm in Sources */,
|
AB796D5115CDCBA200C59155 /* cocoa_output.mm in Sources */,
|
||||||
AB796D5215CDCBA200C59155 /* cocoa_rom.mm in Sources */,
|
AB796D5215CDCBA200C59155 /* cocoa_rom.mm in Sources */,
|
||||||
AB796D5315CDCBA200C59155 /* cocoa_util.mm in Sources */,
|
AB796D5315CDCBA200C59155 /* cocoa_util.mm in Sources */,
|
||||||
|
@ -2414,6 +2431,8 @@
|
||||||
AB29B33116D4BEBF000EF671 /* InputManager.mm in Sources */,
|
AB29B33116D4BEBF000EF671 /* InputManager.mm in Sources */,
|
||||||
AB82445B1704AE9A00B8EE20 /* utilities.c in Sources */,
|
AB82445B1704AE9A00B8EE20 /* utilities.c in Sources */,
|
||||||
AB01005E170D07B000D70FBE /* InputProfileController.mm in Sources */,
|
AB01005E170D07B000D70FBE /* InputProfileController.mm in Sources */,
|
||||||
|
ABD10AE71715FCDD00B5729D /* audiosamplegenerator.cpp in Sources */,
|
||||||
|
ABD10AEA1715FCDD00B5729D /* mic_ext.cpp in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -2426,7 +2445,6 @@
|
||||||
ABB3C6701501C04F00E0C22E /* videofilter.cpp in Sources */,
|
ABB3C6701501C04F00E0C22E /* videofilter.cpp in Sources */,
|
||||||
ABB3C6711501C04F00E0C22E /* cocoa_core.mm in Sources */,
|
ABB3C6711501C04F00E0C22E /* cocoa_core.mm in Sources */,
|
||||||
ABB3C6721501C04F00E0C22E /* cocoa_file.mm in Sources */,
|
ABB3C6721501C04F00E0C22E /* cocoa_file.mm in Sources */,
|
||||||
ABB3C6731501C04F00E0C22E /* cocoa_mic.mm in Sources */,
|
|
||||||
ABB3C6741501C04F00E0C22E /* cocoa_output.mm in Sources */,
|
ABB3C6741501C04F00E0C22E /* cocoa_output.mm in Sources */,
|
||||||
ABB3C6751501C04F00E0C22E /* cocoa_rom.mm in Sources */,
|
ABB3C6751501C04F00E0C22E /* cocoa_rom.mm in Sources */,
|
||||||
ABB3C6761501C04F00E0C22E /* cocoa_util.mm in Sources */,
|
ABB3C6761501C04F00E0C22E /* cocoa_util.mm in Sources */,
|
||||||
|
@ -2561,6 +2579,10 @@
|
||||||
AB3A656316CC5438001F5D4A /* cocoa_GPU.mm in Sources */,
|
AB3A656316CC5438001F5D4A /* cocoa_GPU.mm in Sources */,
|
||||||
AB82445D1704AE9A00B8EE20 /* utilities.c in Sources */,
|
AB82445D1704AE9A00B8EE20 /* utilities.c in Sources */,
|
||||||
AB010060170D07B000D70FBE /* InputProfileController.mm in Sources */,
|
AB010060170D07B000D70FBE /* InputProfileController.mm in Sources */,
|
||||||
|
ABD10AE91715FCDD00B5729D /* audiosamplegenerator.cpp in Sources */,
|
||||||
|
ABD10AEC1715FCDD00B5729D /* mic_ext.cpp in Sources */,
|
||||||
|
ABD10AED17160C9300B5729D /* ringbuffer.cpp in Sources */,
|
||||||
|
ABD10AEE17160CDD00B5729D /* cocoa_input.mm in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|
|
@ -256,7 +256,9 @@
|
||||||
<key>inputSettingsSummary</key>
|
<key>inputSettingsSummary</key>
|
||||||
<string>Internal Noise Samples</string>
|
<string>Internal Noise Samples</string>
|
||||||
<key>intValue1</key>
|
<key>intValue1</key>
|
||||||
<string>1</string>
|
<integer>1</integer>
|
||||||
|
<key>floatValue0</key>
|
||||||
|
<real>250</real>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
<key>Lid</key>
|
<key>Lid</key>
|
||||||
|
@ -371,7 +373,7 @@
|
||||||
<key>inputSettingsSummary</key>
|
<key>inputSettingsSummary</key>
|
||||||
<string>0.50x Speed</string>
|
<string>0.50x Speed</string>
|
||||||
<key>floatValue0</key>
|
<key>floatValue0</key>
|
||||||
<string>0.5</string>
|
<real>0.5</real>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>deviceInfoSummary</key>
|
<key>deviceInfoSummary</key>
|
||||||
|
|
|
@ -0,0 +1,161 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2013 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
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This file is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#include <Availability.h>
|
||||||
|
#include "utilities.h"
|
||||||
|
#endif // __APPLE__
|
||||||
|
|
||||||
|
#include "audiosamplegenerator.h"
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#define NUM_INTERNAL_NOISE_SAMPLES 32
|
||||||
|
|
||||||
|
static const u8 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)
|
||||||
|
{
|
||||||
|
_buffer = (u8 *)malloc(sampleCount * sizeof(u8));
|
||||||
|
_sampleCount = sampleCount;
|
||||||
|
_samplePosition = 0;
|
||||||
|
memcpy(_buffer, audioBuffer, _sampleCount * sizeof(u8));
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioSampleBlockGenerator::~AudioSampleBlockGenerator()
|
||||||
|
{
|
||||||
|
free(this->_buffer);
|
||||||
|
this->_buffer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
u8* AudioSampleBlockGenerator::allocate(const size_t sampleCount)
|
||||||
|
{
|
||||||
|
if (this->_buffer != NULL)
|
||||||
|
{
|
||||||
|
free(this->_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->_buffer = (u8 *)malloc(sampleCount * sizeof(u8));
|
||||||
|
this->_sampleCount = sampleCount;
|
||||||
|
this->_samplePosition = 0;
|
||||||
|
memset(this->_buffer, MIC_NULL_SAMPLE_VALUE, this->_sampleCount * sizeof(u8));
|
||||||
|
|
||||||
|
return this->_buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
u8 AudioSampleBlockGenerator::generateSample()
|
||||||
|
{
|
||||||
|
if (this->_samplePosition >= this->_sampleCount)
|
||||||
|
{
|
||||||
|
this->_samplePosition = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this->_buffer[_samplePosition++];
|
||||||
|
}
|
||||||
|
|
||||||
|
u8* AudioSampleBlockGenerator::getBuffer() const
|
||||||
|
{
|
||||||
|
return this->_buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t AudioSampleBlockGenerator::getSampleCount() const
|
||||||
|
{
|
||||||
|
return this->_sampleCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t AudioSampleBlockGenerator::getSamplePosition() const
|
||||||
|
{
|
||||||
|
return this->_samplePosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioSampleBlockGenerator::setSamplePosition(size_t thePosition)
|
||||||
|
{
|
||||||
|
this->_samplePosition = thePosition % this->_sampleCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
InternalNoiseGenerator::InternalNoiseGenerator()
|
||||||
|
{
|
||||||
|
_buffer = (u8 *)malloc(NUM_INTERNAL_NOISE_SAMPLES * sizeof(u8));
|
||||||
|
_sampleCount = NUM_INTERNAL_NOISE_SAMPLES;
|
||||||
|
_samplePosition = 0;
|
||||||
|
memcpy(_buffer, noiseSample, _sampleCount * sizeof(u8));
|
||||||
|
}
|
||||||
|
|
||||||
|
u8 WhiteNoiseGenerator::generateSample()
|
||||||
|
{
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#ifdef MAC_OS_X_VERSION_10_7
|
||||||
|
if (IsOSXVersionSupported(10, 7, 0))
|
||||||
|
{
|
||||||
|
return (u8)(arc4random_uniform(0x00000080) & 0x7F);
|
||||||
|
}
|
||||||
|
return (u8)((arc4random() % 0x00000080) & 0x7F);
|
||||||
|
#else
|
||||||
|
return (u8)((arc4random() % 0x00000080) & 0x7F);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
return (u8)(rand() & 0x7F);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
SineWaveGenerator::SineWaveGenerator(const double freq, const double sampleRate)
|
||||||
|
{
|
||||||
|
_frequency = freq;
|
||||||
|
_sampleRate = sampleRate;
|
||||||
|
_cyclePosition = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
u8 SineWaveGenerator::generateSample()
|
||||||
|
{
|
||||||
|
const u8 sampleValue = (u8)(63.0 * sin(2.0 * M_PI * this->_cyclePosition)) + MIC_NULL_SAMPLE_VALUE;
|
||||||
|
this->_cyclePosition += (this->_frequency / this->_sampleRate);
|
||||||
|
|
||||||
|
return sampleValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
double SineWaveGenerator::getFrequency() const
|
||||||
|
{
|
||||||
|
return this->_frequency;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SineWaveGenerator::setFrequency(double freq)
|
||||||
|
{
|
||||||
|
this->_frequency = freq;
|
||||||
|
}
|
||||||
|
|
||||||
|
double SineWaveGenerator::getSampleRate() const
|
||||||
|
{
|
||||||
|
return this->_sampleRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SineWaveGenerator::setSampleRate(double sampleRate)
|
||||||
|
{
|
||||||
|
this->_sampleRate = sampleRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
double SineWaveGenerator::getCyclePosition() const
|
||||||
|
{
|
||||||
|
return this->_cyclePosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SineWaveGenerator::setCyclePosition(double thePosition)
|
||||||
|
{
|
||||||
|
this->_cyclePosition = thePosition;
|
||||||
|
}
|
|
@ -0,0 +1,118 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2013 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
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This file is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _AUDIO_SAMPLE_GENERATOR_
|
||||||
|
#define _AUDIO_SAMPLE_GENERATOR_
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
|
#define MIC_NULL_SAMPLE_VALUE 64
|
||||||
|
|
||||||
|
|
||||||
|
class AudioGenerator
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class NullGenerator : public AudioGenerator {};
|
||||||
|
|
||||||
|
class AudioSampleBlockGenerator : public AudioGenerator
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
u8 *_buffer;
|
||||||
|
size_t _sampleCount;
|
||||||
|
size_t _samplePosition;
|
||||||
|
|
||||||
|
public:
|
||||||
|
AudioSampleBlockGenerator()
|
||||||
|
: _buffer(NULL)
|
||||||
|
, _sampleCount(0)
|
||||||
|
, _samplePosition(0)
|
||||||
|
{};
|
||||||
|
AudioSampleBlockGenerator(const u8 *audioBuffer, const size_t sampleCount);
|
||||||
|
~AudioSampleBlockGenerator();
|
||||||
|
|
||||||
|
u8* allocate(const size_t sampleCount);
|
||||||
|
u8* getBuffer() const;
|
||||||
|
size_t getSampleCount() const;
|
||||||
|
size_t getSamplePosition() const;
|
||||||
|
void setSamplePosition(size_t thePosition);
|
||||||
|
|
||||||
|
virtual u8 generateSample();
|
||||||
|
};
|
||||||
|
|
||||||
|
class InternalNoiseGenerator : public AudioSampleBlockGenerator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
InternalNoiseGenerator();
|
||||||
|
};
|
||||||
|
|
||||||
|
class WhiteNoiseGenerator : public AudioGenerator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual u8 generateSample();
|
||||||
|
};
|
||||||
|
|
||||||
|
class SineWaveGenerator : public AudioGenerator
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
double _frequency;
|
||||||
|
double _sampleRate;
|
||||||
|
double _cyclePosition;
|
||||||
|
|
||||||
|
public:
|
||||||
|
SineWaveGenerator()
|
||||||
|
: _frequency(250.0)
|
||||||
|
, _sampleRate(44100.0)
|
||||||
|
, _cyclePosition(0.0)
|
||||||
|
{};
|
||||||
|
SineWaveGenerator(const double freq, const double sampleRate);
|
||||||
|
|
||||||
|
double getFrequency() const;
|
||||||
|
void setFrequency(double freq);
|
||||||
|
double getSampleRate() const;
|
||||||
|
void setSampleRate(double sampleRate);
|
||||||
|
double getCyclePosition() const;
|
||||||
|
void setCyclePosition(double thePosition);
|
||||||
|
|
||||||
|
virtual u8 generateSample();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // _AUDIO_SAMPLE_GENERATOR_
|
|
@ -109,7 +109,9 @@
|
||||||
#define NSSTRING_INPUTPREF_USE_DEVICE_COORDINATES NSLocalizedString(@"Use Device Coordinates", nil)
|
#define NSSTRING_INPUTPREF_USE_DEVICE_COORDINATES NSLocalizedString(@"Use Device Coordinates", nil)
|
||||||
#define NSSTRING_INPUTPREF_MIC_NONE NSLocalizedString(@"None", nil)
|
#define NSSTRING_INPUTPREF_MIC_NONE NSLocalizedString(@"None", nil)
|
||||||
#define NSSTRING_INPUTPREF_MIC_INTERNAL_NOISE NSLocalizedString(@"Internal Noise Samples", nil)
|
#define NSSTRING_INPUTPREF_MIC_INTERNAL_NOISE NSLocalizedString(@"Internal Noise Samples", nil)
|
||||||
|
#define NSSTRING_INPUTPREF_MIC_AUDIO_FILE_NONE_SELECTED NSLocalizedString(@"No audio file selected.", nil)
|
||||||
#define NSSTRING_INPUTPREF_MIC_WHITE_NOISE NSLocalizedString(@"White Noise", nil)
|
#define NSSTRING_INPUTPREF_MIC_WHITE_NOISE NSLocalizedString(@"White Noise", nil)
|
||||||
|
#define NSSTRING_INPUTPREF_MIC_SINE_WAVE NSLocalizedString(@"%1.1f Hz Sine Wave", nil)
|
||||||
#define NSSTRING_INPUTPREF_SPEED_SCALAR NSLocalizedString(@"%1.2fx Speed", nil)
|
#define NSSTRING_INPUTPREF_SPEED_SCALAR NSLocalizedString(@"%1.2fx Speed", nil)
|
||||||
#define NSSTRING_INPUTPREF_GPU_STATE_ALL_MAIN NSLocalizedString(@"Main GPU - All Layers", nil)
|
#define NSSTRING_INPUTPREF_GPU_STATE_ALL_MAIN NSLocalizedString(@"Main GPU - All Layers", nil)
|
||||||
#define NSSTRING_INPUTPREF_GPU_STATE_ALL_SUB NSLocalizedString(@"Sub GPU - All Layers", nil)
|
#define NSSTRING_INPUTPREF_GPU_STATE_ALL_SUB NSLocalizedString(@"Sub GPU - All Layers", nil)
|
||||||
|
@ -205,10 +207,8 @@
|
||||||
#define ROMINFO_GAME_CODE_LENGTH 4
|
#define ROMINFO_GAME_CODE_LENGTH 4
|
||||||
#define ROMINFO_GAME_BANNER_LENGTH 128
|
#define ROMINFO_GAME_BANNER_LENGTH 128
|
||||||
|
|
||||||
#define MIC_NULL_SAMPLE_VALUE 0
|
|
||||||
#define MIC_SAMPLE_RATE 16000
|
#define MIC_SAMPLE_RATE 16000
|
||||||
#define MIC_MAX_BUFFER_SAMPLES 320
|
#define MIC_MAX_BUFFER_SAMPLES (MIC_SAMPLE_RATE / DS_FRAMES_PER_SECOND)
|
||||||
#define MIC_BUFFER_SIZE (sizeof(UInt8) * MIC_MAX_BUFFER_SAMPLES)
|
|
||||||
|
|
||||||
#define COCOA_DIALOG_CANCEL 0
|
#define COCOA_DIALOG_CANCEL 0
|
||||||
#define COCOA_DIALOG_DEFAULT 1
|
#define COCOA_DIALOG_DEFAULT 1
|
||||||
|
@ -461,7 +461,8 @@ enum
|
||||||
{
|
{
|
||||||
MICMODE_NONE = 0,
|
MICMODE_NONE = 0,
|
||||||
MICMODE_INTERNAL_NOISE,
|
MICMODE_INTERNAL_NOISE,
|
||||||
MICMODE_SOUND_FILE,
|
MICMODE_AUDIO_FILE,
|
||||||
MICMODE_WHITE_NOISE,
|
MICMODE_WHITE_NOISE,
|
||||||
MICMODE_PHYSICAL
|
MICMODE_PHYSICAL,
|
||||||
|
MICMODE_SINE_WAVE
|
||||||
};
|
};
|
||||||
|
|
|
@ -18,8 +18,8 @@
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#include <libkern/OSAtomic.h>
|
#include <libkern/OSAtomic.h>
|
||||||
|
#include "mic_ext.h"
|
||||||
@class CocoaDSMic;
|
#undef BOOL
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -46,20 +46,21 @@ enum
|
||||||
|
|
||||||
@interface CocoaDSController : NSObject
|
@interface CocoaDSController : NSObject
|
||||||
{
|
{
|
||||||
CocoaDSMic *cdsMic;
|
NSInteger micMode;
|
||||||
NSPoint touchLocation;
|
NSPoint touchLocation;
|
||||||
bool controllerState[DSControllerState_StatesCount];
|
bool controllerState[DSControllerState_StatesCount];
|
||||||
|
AudioSampleBlockGenerator *selectedAudioFileGenerator;
|
||||||
|
|
||||||
OSSpinLock spinlockControllerState;
|
OSSpinLock spinlockControllerState;
|
||||||
}
|
}
|
||||||
|
|
||||||
@property (retain) CocoaDSMic *cdsMic;
|
@property (assign) NSInteger micMode;
|
||||||
|
@property (assign) AudioSampleBlockGenerator *selectedAudioFileGenerator;
|
||||||
- (id) initWithMic:(CocoaDSMic *)theMic;
|
|
||||||
|
|
||||||
- (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID;
|
- (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID;
|
||||||
- (void) setTouchState:(BOOL)theState location:(const NSPoint)theLocation;
|
- (void) setTouchState:(BOOL)theState location:(const NSPoint)theLocation;
|
||||||
- (void) setMicrophoneState:(BOOL)theState inputMode:(const NSInteger)inputMode;
|
- (void) setMicrophoneState:(BOOL)theState inputMode:(const NSInteger)inputMode;
|
||||||
|
- (void) setSineWaveGeneratorFrequency:(const double)freq;
|
||||||
- (void) flush;
|
- (void) flush;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -17,9 +17,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#import "cocoa_input.h"
|
#import "cocoa_input.h"
|
||||||
|
|
||||||
#import "cocoa_globals.h"
|
#import "cocoa_globals.h"
|
||||||
#import "cocoa_mic.h"
|
|
||||||
|
|
||||||
#include "../NDSSystem.h"
|
#include "../NDSSystem.h"
|
||||||
#undef BOOL
|
#undef BOOL
|
||||||
|
@ -27,14 +25,10 @@
|
||||||
|
|
||||||
@implementation CocoaDSController
|
@implementation CocoaDSController
|
||||||
|
|
||||||
@synthesize cdsMic;
|
@synthesize micMode;
|
||||||
|
@synthesize selectedAudioFileGenerator;
|
||||||
|
|
||||||
- (id)init
|
- (id)init
|
||||||
{
|
|
||||||
return [self initWithMic:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (id) initWithMic:(CocoaDSMic *)theMic
|
|
||||||
{
|
{
|
||||||
self = [super init];
|
self = [super init];
|
||||||
if (self == nil)
|
if (self == nil)
|
||||||
|
@ -48,8 +42,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
spinlockControllerState = OS_SPINLOCK_INIT;
|
spinlockControllerState = OS_SPINLOCK_INIT;
|
||||||
|
micMode = MICMODE_NONE;
|
||||||
cdsMic = [theMic retain];
|
selectedAudioFileGenerator = NULL;
|
||||||
touchLocation = NSMakePoint(0.0f, 0.0f);
|
touchLocation = NSMakePoint(0.0f, 0.0f);
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
|
@ -57,8 +51,6 @@
|
||||||
|
|
||||||
- (void)dealloc
|
- (void)dealloc
|
||||||
{
|
{
|
||||||
self.cdsMic = nil;
|
|
||||||
|
|
||||||
[super dealloc];
|
[super dealloc];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,17 +78,22 @@
|
||||||
{
|
{
|
||||||
OSSpinLockLock(&spinlockControllerState);
|
OSSpinLockLock(&spinlockControllerState);
|
||||||
controllerState[DSControllerState_Microphone] = (theState) ? true : false;
|
controllerState[DSControllerState_Microphone] = (theState) ? true : false;
|
||||||
self.cdsMic.mode = inputMode;
|
micMode = inputMode;
|
||||||
OSSpinLockUnlock(&spinlockControllerState);
|
OSSpinLockUnlock(&spinlockControllerState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void) setSineWaveGeneratorFrequency:(const double)freq
|
||||||
|
{
|
||||||
|
sineWaveGenerator.setFrequency(freq);
|
||||||
|
}
|
||||||
|
|
||||||
- (void) flush
|
- (void) flush
|
||||||
{
|
{
|
||||||
OSSpinLockLock(&spinlockControllerState);
|
OSSpinLockLock(&spinlockControllerState);
|
||||||
|
|
||||||
NSPoint theLocation = touchLocation;
|
const NSPoint theLocation = touchLocation;
|
||||||
NSInteger micMode = cdsMic.mode;
|
const NSInteger theMicMode = micMode;
|
||||||
bool flushedStates[DSControllerState_StatesCount] = {0};
|
static bool flushedStates[DSControllerState_StatesCount] = {0};
|
||||||
|
|
||||||
for (unsigned int i = 0; i < DSControllerState_StatesCount; i++)
|
for (unsigned int i = 0; i < DSControllerState_StatesCount; i++)
|
||||||
{
|
{
|
||||||
|
@ -105,8 +102,8 @@
|
||||||
|
|
||||||
OSSpinLockUnlock(&spinlockControllerState);
|
OSSpinLockUnlock(&spinlockControllerState);
|
||||||
|
|
||||||
bool isTouchDown = flushedStates[DSControllerState_Touch];
|
const bool isTouchDown = flushedStates[DSControllerState_Touch];
|
||||||
bool isMicPressed = flushedStates[DSControllerState_Microphone];
|
const bool isMicPressed = flushedStates[DSControllerState_Microphone];
|
||||||
|
|
||||||
// Setup the DS pad.
|
// Setup the DS pad.
|
||||||
NDS_setPad(flushedStates[DSControllerState_Right],
|
NDS_setPad(flushedStates[DSControllerState_Right],
|
||||||
|
@ -135,27 +132,66 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup the DS mic.
|
// Setup the DS mic.
|
||||||
NDS_setMic(isMicPressed);
|
AudioGenerator *selectedGenerator = &nullSampleGenerator;
|
||||||
|
switch (theMicMode)
|
||||||
|
{
|
||||||
|
case MICMODE_INTERNAL_NOISE:
|
||||||
|
selectedGenerator = &internalNoiseGenerator;
|
||||||
|
break;
|
||||||
|
|
||||||
if (isMicPressed)
|
case MICMODE_WHITE_NOISE:
|
||||||
|
selectedGenerator = &whiteNoiseGenerator;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MICMODE_SINE_WAVE:
|
||||||
|
selectedGenerator = &sineWaveGenerator;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MICMODE_AUDIO_FILE:
|
||||||
|
if (selectedAudioFileGenerator != NULL)
|
||||||
{
|
{
|
||||||
if (micMode == MICMODE_NONE)
|
selectedGenerator = selectedAudioFileGenerator;
|
||||||
{
|
|
||||||
[cdsMic fillWithNullSamples];
|
|
||||||
}
|
}
|
||||||
else if (micMode == MICMODE_INTERNAL_NOISE)
|
break;
|
||||||
{
|
|
||||||
[cdsMic fillWithInternalNoise];
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (micMode == MICMODE_WHITE_NOISE)
|
|
||||||
|
NDS_setMic(isMicPressed);
|
||||||
|
if (!isMicPressed)
|
||||||
{
|
{
|
||||||
[cdsMic fillWithWhiteNoise];
|
selectedGenerator = &nullSampleGenerator;
|
||||||
}
|
|
||||||
else if (micMode == MICMODE_SOUND_FILE)
|
internalNoiseGenerator.setSamplePosition(0);
|
||||||
|
sineWaveGenerator.setCyclePosition(0.0);
|
||||||
|
|
||||||
|
if (selectedAudioFileGenerator != NULL)
|
||||||
{
|
{
|
||||||
// TODO: Need to implement. Does nothing for now.
|
selectedAudioFileGenerator->setSamplePosition(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -1,63 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright (C) 2011 Roger Manuel
|
|
||||||
Copyright (C) 2012 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
|
|
||||||
the Free Software Foundation, either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This file is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with the this software. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
|
||||||
|
|
||||||
|
|
||||||
#define NUM_INTERNAL_NOISE_SAMPLES 32
|
|
||||||
|
|
||||||
static const UInt8 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
|
|
||||||
};
|
|
||||||
|
|
||||||
@interface CocoaDSMic : NSObject
|
|
||||||
{
|
|
||||||
UInt8 *buffer;
|
|
||||||
UInt8 *readPosition;
|
|
||||||
UInt8 *writePosition;
|
|
||||||
NSUInteger fillCount;
|
|
||||||
BOOL needsActivate;
|
|
||||||
NSInteger mode;
|
|
||||||
|
|
||||||
NSUInteger internalSamplePosition;
|
|
||||||
}
|
|
||||||
|
|
||||||
@property (readonly) UInt8 *buffer;
|
|
||||||
@property (readonly) UInt8 *readPosition;
|
|
||||||
@property (readonly) UInt8 *writePosition;
|
|
||||||
@property (readonly) NSUInteger fillCount;
|
|
||||||
@property (assign) BOOL needsActivate;
|
|
||||||
@property (assign) NSInteger mode;
|
|
||||||
|
|
||||||
- (void) clear;
|
|
||||||
- (NSUInteger) fillCountRemaining;
|
|
||||||
- (BOOL) isFull;
|
|
||||||
- (BOOL) isEmpty;
|
|
||||||
- (UInt8) read;
|
|
||||||
- (void) write:(UInt8)theSample;
|
|
||||||
- (UInt8) generateInternalNoiseSample;
|
|
||||||
- (UInt8) generateWhiteNoiseSample;
|
|
||||||
- (void) fillWithNullSamples;
|
|
||||||
- (void) fillWithInternalNoise;
|
|
||||||
- (void) fillWithWhiteNoise;
|
|
||||||
+ (CocoaDSMic *) masterMic;
|
|
||||||
+ (void) setMasterMic:(CocoaDSMic *)theMic;
|
|
||||||
|
|
||||||
@end
|
|
|
@ -1,258 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright (C) 2011 Roger Manuel
|
|
||||||
Copyright (C) 2012-2013 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
|
|
||||||
the Free Software Foundation, either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This file is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with the this software. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#import "cocoa_mic.h"
|
|
||||||
#import "cocoa_globals.h"
|
|
||||||
|
|
||||||
#include "../NDSSystem.h"
|
|
||||||
#undef BOOL
|
|
||||||
|
|
||||||
static CocoaDSMic *masterMic = nil;
|
|
||||||
|
|
||||||
@implementation CocoaDSMic
|
|
||||||
|
|
||||||
@synthesize buffer;
|
|
||||||
@synthesize readPosition;
|
|
||||||
@synthesize writePosition;
|
|
||||||
@synthesize fillCount;
|
|
||||||
@synthesize needsActivate;
|
|
||||||
@dynamic mode;
|
|
||||||
|
|
||||||
- (id)init
|
|
||||||
{
|
|
||||||
self = [super init];
|
|
||||||
if (self == nil)
|
|
||||||
{
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
UInt8 *newBuffer = (UInt8 *)malloc(MIC_BUFFER_SIZE);
|
|
||||||
if (newBuffer == nil)
|
|
||||||
{
|
|
||||||
[self release];
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer = newBuffer;
|
|
||||||
[self clear];
|
|
||||||
|
|
||||||
internalSamplePosition = 0;
|
|
||||||
needsActivate = YES;
|
|
||||||
mode = MICMODE_NONE;
|
|
||||||
|
|
||||||
[CocoaDSMic setMasterMic:self];
|
|
||||||
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)dealloc
|
|
||||||
{
|
|
||||||
if ([CocoaDSMic masterMic] == self)
|
|
||||||
{
|
|
||||||
[CocoaDSMic setMasterMic:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
free(buffer);
|
|
||||||
buffer = NULL;
|
|
||||||
|
|
||||||
[super dealloc];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSInteger) mode
|
|
||||||
{
|
|
||||||
return mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) setMode:(NSInteger)theMode
|
|
||||||
{
|
|
||||||
switch (theMode)
|
|
||||||
{
|
|
||||||
case MICMODE_NONE:
|
|
||||||
self.needsActivate = YES;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MICMODE_INTERNAL_NOISE:
|
|
||||||
self.needsActivate = YES;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MICMODE_SOUND_FILE:
|
|
||||||
self.needsActivate = YES;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MICMODE_WHITE_NOISE:
|
|
||||||
self.needsActivate = YES;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MICMODE_PHYSICAL:
|
|
||||||
self.needsActivate = NO;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
mode = theMode;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) clear
|
|
||||||
{
|
|
||||||
memset(buffer, MIC_NULL_SAMPLE_VALUE, MIC_BUFFER_SIZE);
|
|
||||||
readPosition = buffer;
|
|
||||||
writePosition = buffer;
|
|
||||||
fillCount = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSUInteger) fillCountRemaining
|
|
||||||
{
|
|
||||||
return (MIC_MAX_BUFFER_SAMPLES - self.fillCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (BOOL) isFull
|
|
||||||
{
|
|
||||||
return (self.fillCount >= MIC_MAX_BUFFER_SAMPLES);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (BOOL) isEmpty
|
|
||||||
{
|
|
||||||
return (self.fillCount == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (UInt8) read
|
|
||||||
{
|
|
||||||
UInt8 theSample = MIC_NULL_SAMPLE_VALUE;
|
|
||||||
|
|
||||||
bool isMicActive = NDS_getFinalUserInput().mic.micButtonPressed;
|
|
||||||
if ([self isEmpty] || (self.needsActivate && !isMicActive))
|
|
||||||
{
|
|
||||||
return theSample;
|
|
||||||
}
|
|
||||||
|
|
||||||
theSample = *readPosition;
|
|
||||||
readPosition++;
|
|
||||||
fillCount--;
|
|
||||||
|
|
||||||
// Move the pointer back to start if we reach the end of the memory block.
|
|
||||||
if (readPosition >= (buffer + MIC_BUFFER_SIZE))
|
|
||||||
{
|
|
||||||
readPosition = buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
return theSample;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) write:(UInt8)theSample
|
|
||||||
{
|
|
||||||
if ([self isFull])
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
*writePosition = theSample;
|
|
||||||
writePosition++;
|
|
||||||
fillCount++;
|
|
||||||
|
|
||||||
// Move the pointer back to start if we reach the end of the memory block.
|
|
||||||
if (writePosition >= (buffer + MIC_BUFFER_SIZE))
|
|
||||||
{
|
|
||||||
writePosition = buffer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- (UInt8) generateInternalNoiseSample
|
|
||||||
{
|
|
||||||
internalSamplePosition++;
|
|
||||||
if (internalSamplePosition >= NUM_INTERNAL_NOISE_SAMPLES)
|
|
||||||
{
|
|
||||||
internalSamplePosition = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return noiseSample[internalSamplePosition];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (UInt8) generateWhiteNoiseSample
|
|
||||||
{
|
|
||||||
return (UInt8)(arc4random() & 0xFF);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) fillWithNullSamples
|
|
||||||
{
|
|
||||||
while (self.fillCount < MIC_MAX_BUFFER_SAMPLES)
|
|
||||||
{
|
|
||||||
[self write:MIC_NULL_SAMPLE_VALUE];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) fillWithInternalNoise
|
|
||||||
{
|
|
||||||
while (self.fillCount < MIC_MAX_BUFFER_SAMPLES)
|
|
||||||
{
|
|
||||||
[self write:[self generateInternalNoiseSample]];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) fillWithWhiteNoise
|
|
||||||
{
|
|
||||||
while (self.fillCount < MIC_MAX_BUFFER_SAMPLES)
|
|
||||||
{
|
|
||||||
[self write:[self generateWhiteNoiseSample]];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (CocoaDSMic *) masterMic
|
|
||||||
{
|
|
||||||
return masterMic;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (void) setMasterMic:(CocoaDSMic *)theMic
|
|
||||||
{
|
|
||||||
masterMic = theMic;
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
BOOL Mic_Init()
|
|
||||||
{
|
|
||||||
// Do nothing. The CocoaDSMic object will take care of this.
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mic_Reset()
|
|
||||||
{
|
|
||||||
// Do nothing.
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mic_DeInit()
|
|
||||||
{
|
|
||||||
// Do nothing. The CocoaDSMic object will take care of this.
|
|
||||||
}
|
|
||||||
|
|
||||||
u8 Mic_ReadSample()
|
|
||||||
{
|
|
||||||
return [masterMic read];
|
|
||||||
}
|
|
||||||
|
|
||||||
void mic_savestate(EMUFILE* os)
|
|
||||||
{
|
|
||||||
write32le(-1, os);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool mic_loadstate(EMUFILE* is, int size)
|
|
||||||
{
|
|
||||||
is->fseek(size, SEEK_CUR);
|
|
||||||
return true;
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2013 DeSmuME team
|
Copyright (C) 2012-2013 DeSmuME team
|
||||||
|
|
||||||
This file is free software: you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -175,11 +175,6 @@ CoreAudioOutput::~CoreAudioOutput()
|
||||||
_spinlockAU = NULL;
|
_spinlockAU = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
RingBuffer* CoreAudioOutput::getBuffer() const
|
|
||||||
{
|
|
||||||
return this->_buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CoreAudioOutput::start()
|
void CoreAudioOutput::start()
|
||||||
{
|
{
|
||||||
this->clearBuffer();
|
this->clearBuffer();
|
||||||
|
@ -199,9 +194,15 @@ void CoreAudioOutput::stop()
|
||||||
this->clearBuffer();
|
this->clearBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CoreAudioOutput::writeToBuffer(const void *buffer, size_t numberBytes)
|
void CoreAudioOutput::writeToBuffer(const void *buffer, size_t numberSampleFrames)
|
||||||
{
|
{
|
||||||
this->getBuffer()->write(buffer, numberBytes);
|
size_t availableSampleFrames = this->_buffer->getAvailableElements();
|
||||||
|
if (availableSampleFrames < numberSampleFrames)
|
||||||
|
{
|
||||||
|
this->_buffer->drop(numberSampleFrames - availableSampleFrames);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->_buffer->write(buffer, numberSampleFrames);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CoreAudioOutput::clearBuffer()
|
void CoreAudioOutput::clearBuffer()
|
||||||
|
@ -251,13 +252,12 @@ OSStatus CoreAudioOutputRenderCallback(void *inRefCon,
|
||||||
{
|
{
|
||||||
RingBuffer *__restrict__ audioBuffer = (RingBuffer *)inRefCon;
|
RingBuffer *__restrict__ audioBuffer = (RingBuffer *)inRefCon;
|
||||||
UInt8 *__restrict__ playbackBuffer = (UInt8 *)ioData->mBuffers[0].mData;
|
UInt8 *__restrict__ playbackBuffer = (UInt8 *)ioData->mBuffers[0].mData;
|
||||||
const size_t totalReadSize = inNumberFrames * audioBuffer->getElementSize();
|
const size_t framesRead = audioBuffer->read(playbackBuffer, inNumberFrames);
|
||||||
const size_t bytesRead = audioBuffer->read(playbackBuffer, totalReadSize);
|
|
||||||
|
|
||||||
// Pad any remaining samples.
|
// Pad any remaining samples.
|
||||||
if (bytesRead < totalReadSize)
|
if (framesRead < inNumberFrames)
|
||||||
{
|
{
|
||||||
memset(playbackBuffer + bytesRead, 0, totalReadSize - bytesRead);
|
memset(playbackBuffer + (framesRead * SPU_SAMPLE_SIZE), 0, (inNumberFrames - framesRead) * SPU_SAMPLE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy to other channels.
|
// Copy to other channels.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2013 DeSmuME team
|
Copyright (C) 2012-2013 DeSmuME team
|
||||||
|
|
||||||
This file is free software: you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -24,6 +24,7 @@
|
||||||
#include <libkern/OSAtomic.h>
|
#include <libkern/OSAtomic.h>
|
||||||
#include "ringbuffer.h"
|
#include "ringbuffer.h"
|
||||||
|
|
||||||
|
|
||||||
class CoreAudioOutput
|
class CoreAudioOutput
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
@ -38,10 +39,9 @@ public:
|
||||||
|
|
||||||
void start();
|
void start();
|
||||||
void stop();
|
void stop();
|
||||||
void writeToBuffer(const void *buffer, size_t numberBytes);
|
void writeToBuffer(const void *buffer, size_t numberSampleFrames);
|
||||||
void clearBuffer();
|
void clearBuffer();
|
||||||
size_t getAvailableSamples() const;
|
size_t getAvailableSamples() const;
|
||||||
RingBuffer* getBuffer() const;
|
|
||||||
void mute();
|
void mute();
|
||||||
void unmute();
|
void unmute();
|
||||||
float getVolume() const;
|
float getVolume() const;
|
||||||
|
|
|
@ -0,0 +1,102 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2011 Roger Manuel
|
||||||
|
Copyright (C) 2012-2013 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
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This file is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "cocoa_globals.h"
|
||||||
|
#include "mic_ext.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;
|
||||||
|
|
||||||
|
|
||||||
|
BOOL Mic_Init()
|
||||||
|
{
|
||||||
|
// Do nothing.
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mic_Reset()
|
||||||
|
{
|
||||||
|
micInputBuffer.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mic_DeInit()
|
||||||
|
{
|
||||||
|
// Do nothing.
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Mic_GetUseBufferedSource()
|
||||||
|
{
|
||||||
|
return _micUseBufferedSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mic_SetUseBufferedSource(bool theState)
|
||||||
|
{
|
||||||
|
_micUseBufferedSource = theState;
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioGenerator* Mic_GetSelectedDirectSampleGenerator()
|
||||||
|
{
|
||||||
|
return _selectedDirectSampleGenerator;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mic_SetSelectedDirectSampleGenerator(AudioGenerator *theGenerator)
|
||||||
|
{
|
||||||
|
_selectedDirectSampleGenerator = theGenerator;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mic_savestate(EMUFILE* os)
|
||||||
|
{
|
||||||
|
write32le(-1, os);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool mic_loadstate(EMUFILE* is, int size)
|
||||||
|
{
|
||||||
|
is->fseek(size, SEEK_CUR);
|
||||||
|
return true;
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2011 Roger Manuel
|
||||||
|
Copyright (C) 2012-2013 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
|
||||||
|
the Free Software Foundation, either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This file is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with the this software. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _MIC_EXTENSION_
|
||||||
|
#define _MIC_EXTENSION_
|
||||||
|
|
||||||
|
#include "audiosamplegenerator.h"
|
||||||
|
#include "ringbuffer.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool Mic_GetUseBufferedSource();
|
||||||
|
void Mic_SetUseBufferedSource(bool theState);
|
||||||
|
AudioGenerator* Mic_GetSelectedDirectSampleGenerator();
|
||||||
|
void Mic_SetSelectedDirectSampleGenerator(AudioGenerator *theGenerator);
|
||||||
|
|
||||||
|
extern RingBuffer micInputBuffer;
|
||||||
|
extern NullGenerator nullSampleGenerator;
|
||||||
|
extern InternalNoiseGenerator internalNoiseGenerator;
|
||||||
|
extern WhiteNoiseGenerator whiteNoiseGenerator;
|
||||||
|
extern SineWaveGenerator sineWaveGenerator;
|
||||||
|
|
||||||
|
extern AudioGenerator *selectedGeneratorDirect;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // _MIC_EXTENSION_
|
|
@ -17,27 +17,29 @@
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#import <OpenEmuBase/OEGameCore.h>
|
#import <OpenEmuBase/OEGameCore.h>
|
||||||
|
#import "OENDSSystemResponderClient.h"
|
||||||
#include <libkern/OSAtomic.h>
|
#include <libkern/OSAtomic.h>
|
||||||
|
|
||||||
@class CocoaDSFirmware;
|
@class CocoaDSFirmware;
|
||||||
@class CocoaDSMic;
|
@class CocoaDSController;
|
||||||
|
|
||||||
|
|
||||||
@interface NDSGameCore : OEGameCore
|
@interface NDSGameCore : OEGameCore
|
||||||
{
|
{
|
||||||
bool *input;
|
NSPoint touchLocation;
|
||||||
bool isTouchPressed;
|
CocoaDSController *cdsController;
|
||||||
OEIntPoint touchLocation;
|
|
||||||
CocoaDSFirmware *firmware;
|
CocoaDSFirmware *firmware;
|
||||||
CocoaDSMic *microphone;
|
NSInteger micMode;
|
||||||
NSInteger displayMode;
|
NSInteger displayMode;
|
||||||
OEIntRect displayRect;
|
OEIntRect displayRect;
|
||||||
|
NSInteger inputID[OENDSButtonCount]; // Key = OpenEmu's input ID, Value = DeSmuME's input ID
|
||||||
|
|
||||||
OSSpinLock spinlockDisplayMode;
|
OSSpinLock spinlockDisplayMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@property (retain) CocoaDSController *cdsController;
|
||||||
@property (retain) CocoaDSFirmware *firmware;
|
@property (retain) CocoaDSFirmware *firmware;
|
||||||
@property (retain) CocoaDSMic *microphone;
|
@property (assign) NSInteger micMode;
|
||||||
@property (assign) NSInteger displayMode;
|
@property (assign) NSInteger displayMode;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
#import "cocoa_globals.h"
|
#import "cocoa_globals.h"
|
||||||
#import "cocoa_file.h"
|
#import "cocoa_file.h"
|
||||||
#import "cocoa_firmware.h"
|
#import "cocoa_firmware.h"
|
||||||
|
#import "cocoa_input.h"
|
||||||
#import "cocoa_core.h"
|
#import "cocoa_core.h"
|
||||||
#import "cocoa_mic.h"
|
|
||||||
#import "cocoa_output.h"
|
#import "cocoa_output.h"
|
||||||
#import "OESoundInterface.h"
|
#import "OESoundInterface.h"
|
||||||
#import "OENDSSystemResponderClient.h"
|
#import "OENDSSystemResponderClient.h"
|
||||||
|
@ -32,8 +32,9 @@
|
||||||
|
|
||||||
@implementation NDSGameCore
|
@implementation NDSGameCore
|
||||||
|
|
||||||
|
@synthesize cdsController;
|
||||||
@synthesize firmware;
|
@synthesize firmware;
|
||||||
@synthesize microphone;
|
@synthesize micMode;
|
||||||
@dynamic displayMode;
|
@dynamic displayMode;
|
||||||
|
|
||||||
- (id)init
|
- (id)init
|
||||||
|
@ -45,20 +46,37 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up input handling
|
// Set up input handling
|
||||||
input = (bool *)calloc(sizeof(bool), OENDSButtonCount);
|
|
||||||
isTouchPressed = false;
|
|
||||||
touchLocation.x = 0;
|
touchLocation.x = 0;
|
||||||
touchLocation.y = 0;
|
touchLocation.y = 0;
|
||||||
microphone = [[CocoaDSMic alloc] init];
|
micMode = MICMODE_INTERNAL_NOISE;
|
||||||
microphone.mode = MICMODE_INTERNAL_NOISE;
|
|
||||||
|
inputID[OENDSButtonUp] = DSControllerState_Up;
|
||||||
|
inputID[OENDSButtonDown] = DSControllerState_Down;
|
||||||
|
inputID[OENDSButtonLeft] = DSControllerState_Left;
|
||||||
|
inputID[OENDSButtonRight] = DSControllerState_Right;
|
||||||
|
inputID[OENDSButtonA] = DSControllerState_A;
|
||||||
|
inputID[OENDSButtonB] = DSControllerState_B;
|
||||||
|
inputID[OENDSButtonX] = DSControllerState_X;
|
||||||
|
inputID[OENDSButtonY] = DSControllerState_Y;
|
||||||
|
inputID[OENDSButtonL] = DSControllerState_L;
|
||||||
|
inputID[OENDSButtonR] = DSControllerState_R;
|
||||||
|
inputID[OENDSButtonStart] = DSControllerState_Start;
|
||||||
|
inputID[OENDSButtonSelect] = DSControllerState_Select;
|
||||||
|
inputID[OENDSButtonMicrophone] = DSControllerState_Microphone;
|
||||||
|
inputID[OENDSButtonLid] = DSControllerState_Lid;
|
||||||
|
inputID[OENDSButtonDebug] = DSControllerState_Debug;
|
||||||
|
|
||||||
// Set up the emulation core
|
// Set up the emulation core
|
||||||
CommonSettings.advanced_timing = true;
|
CommonSettings.advanced_timing = true;
|
||||||
CommonSettings.use_jit = false;
|
CommonSettings.use_jit = false;
|
||||||
[CocoaDSCore startupCore];
|
[CocoaDSCore startupCore];
|
||||||
|
|
||||||
|
// Set up the DS controller
|
||||||
|
cdsController = [[[[CocoaDSController alloc] init] retain] autorelease];
|
||||||
|
[cdsController setMicMode:MICMODE_INTERNAL_NOISE];
|
||||||
|
|
||||||
// Set up the DS firmware using the internal firmware
|
// Set up the DS firmware using the internal firmware
|
||||||
firmware = [[CocoaDSFirmware alloc] init];
|
firmware = [[[[CocoaDSFirmware alloc] init] retain] autorelease];
|
||||||
[firmware update];
|
[firmware update];
|
||||||
|
|
||||||
// Set up the 3D renderer
|
// Set up the 3D renderer
|
||||||
|
@ -103,14 +121,12 @@
|
||||||
|
|
||||||
- (void)dealloc
|
- (void)dealloc
|
||||||
{
|
{
|
||||||
self.microphone = nil;
|
|
||||||
free(input);
|
|
||||||
|
|
||||||
SPU_ChangeSoundCore(SNDCORE_DUMMY, 0);
|
SPU_ChangeSoundCore(SNDCORE_DUMMY, 0);
|
||||||
NDS_3D_ChangeCore(CORE3DLIST_NULL);
|
NDS_3D_ChangeCore(CORE3DLIST_NULL);
|
||||||
[CocoaDSCore shutdownCore];
|
[CocoaDSCore shutdownCore];
|
||||||
|
|
||||||
self.firmware = nil;
|
[self setCdsController:nil];
|
||||||
|
[self setFirmware:nil];
|
||||||
|
|
||||||
[super dealloc];
|
[super dealloc];
|
||||||
}
|
}
|
||||||
|
@ -175,7 +191,7 @@
|
||||||
|
|
||||||
- (void)executeFrame
|
- (void)executeFrame
|
||||||
{
|
{
|
||||||
[self updateNDSController];
|
[cdsController flush];
|
||||||
|
|
||||||
NDS_beginProcessingInput();
|
NDS_beginProcessingInput();
|
||||||
NDS_endProcessingInput();
|
NDS_endProcessingInput();
|
||||||
|
@ -282,36 +298,35 @@
|
||||||
return [self audioSampleRate];
|
return [self audioSampleRate];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#pragma mark Input
|
#pragma mark Input
|
||||||
|
|
||||||
- (oneway void)didPushNDSButton:(OENDSButton)button forPlayer:(NSUInteger)player
|
- (oneway void)didPushNDSButton:(OENDSButton)button forPlayer:(NSUInteger)player
|
||||||
{
|
{
|
||||||
input[button] = true;
|
[cdsController setControllerState:YES controlID:inputID[button]];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (oneway void)didReleaseNDSButton:(OENDSButton)button forPlayer:(NSUInteger)player
|
- (oneway void)didReleaseNDSButton:(OENDSButton)button forPlayer:(NSUInteger)player
|
||||||
{
|
{
|
||||||
input[button] = false;
|
[cdsController setControllerState:NO controlID:inputID[button]];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (oneway void)didTouchScreenPoint:(OEIntPoint)aPoint
|
- (oneway void)didTouchScreenPoint:(OEIntPoint)aPoint
|
||||||
{
|
{
|
||||||
bool touchPressed = false;
|
BOOL isTouchPressed = NO;
|
||||||
NSInteger dispMode = [self displayMode];
|
NSInteger dispMode = [self displayMode];
|
||||||
|
|
||||||
switch (dispMode)
|
switch (dispMode)
|
||||||
{
|
{
|
||||||
case DS_DISPLAY_TYPE_MAIN:
|
case DS_DISPLAY_TYPE_MAIN:
|
||||||
touchPressed = false; // Reject touch input if showing only the main screen.
|
isTouchPressed = NO; // Reject touch input if showing only the main screen.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DS_DISPLAY_TYPE_TOUCH:
|
case DS_DISPLAY_TYPE_TOUCH:
|
||||||
touchPressed = true;
|
isTouchPressed = YES;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DS_DISPLAY_TYPE_COMBO:
|
case DS_DISPLAY_TYPE_COMBO:
|
||||||
touchPressed = true;
|
isTouchPressed = YES;
|
||||||
aPoint.y -= GPU_DISPLAY_HEIGHT; // Normalize the y-coordinate to the DS.
|
aPoint.y -= GPU_DISPLAY_HEIGHT; // Normalize the y-coordinate to the DS.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -339,65 +354,13 @@
|
||||||
aPoint.y = (GPU_DISPLAY_HEIGHT - 1);
|
aPoint.y = (GPU_DISPLAY_HEIGHT - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
isTouchPressed = touchPressed;
|
touchLocation = NSMakePoint(aPoint.x, aPoint.y);
|
||||||
touchLocation = aPoint;
|
[cdsController setTouchState:isTouchPressed location:touchLocation];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (oneway void)didReleaseTouch
|
- (oneway void)didReleaseTouch
|
||||||
{
|
{
|
||||||
isTouchPressed = false;
|
[cdsController setTouchState:NO location:touchLocation];
|
||||||
}
|
|
||||||
|
|
||||||
- (void) updateNDSController
|
|
||||||
{
|
|
||||||
// Setup the DS pad.
|
|
||||||
NDS_setPad(input[OENDSButtonRight],
|
|
||||||
input[OENDSButtonLeft],
|
|
||||||
input[OENDSButtonDown],
|
|
||||||
input[OENDSButtonUp],
|
|
||||||
input[OENDSButtonSelect],
|
|
||||||
input[OENDSButtonStart],
|
|
||||||
input[OENDSButtonB],
|
|
||||||
input[OENDSButtonA],
|
|
||||||
input[OENDSButtonY],
|
|
||||||
input[OENDSButtonX],
|
|
||||||
input[OENDSButtonL],
|
|
||||||
input[OENDSButtonR],
|
|
||||||
input[OENDSButtonDebug],
|
|
||||||
input[OENDSButtonLid]);
|
|
||||||
|
|
||||||
// Setup the DS touch pad.
|
|
||||||
if (isTouchPressed)
|
|
||||||
{
|
|
||||||
NDS_setTouchPos((u16)touchLocation.x, (u16)touchLocation.y);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
NDS_releaseTouch();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setup the DS mic.
|
|
||||||
NDS_setMic(input[OENDSButtonMicrophone]);
|
|
||||||
|
|
||||||
if (input[OENDSButtonMicrophone])
|
|
||||||
{
|
|
||||||
if (self.microphone.mode == MICMODE_NONE)
|
|
||||||
{
|
|
||||||
[self.microphone fillWithNullSamples];
|
|
||||||
}
|
|
||||||
else if (self.microphone.mode == MICMODE_INTERNAL_NOISE)
|
|
||||||
{
|
|
||||||
[self.microphone fillWithInternalNoise];
|
|
||||||
}
|
|
||||||
else if (self.microphone.mode == MICMODE_WHITE_NOISE)
|
|
||||||
{
|
|
||||||
[self.microphone fillWithWhiteNoise];
|
|
||||||
}
|
|
||||||
else if (self.microphone.mode == MICMODE_SOUND_FILE)
|
|
||||||
{
|
|
||||||
// TODO: Need to implement. Does nothing for now.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSTrackingAreaOptions)mouseTrackingOptions
|
- (NSTrackingAreaOptions)mouseTrackingOptions
|
||||||
|
|
|
@ -23,14 +23,15 @@
|
||||||
|
|
||||||
RingBuffer::RingBuffer(const size_t numberElements, const size_t newBufferElementSize)
|
RingBuffer::RingBuffer(const size_t numberElements, const size_t newBufferElementSize)
|
||||||
{
|
{
|
||||||
_buffer = (uint8_t *)calloc(numberElements + 1, newBufferElementSize);
|
_elementCapacity = numberElements;
|
||||||
_bufferSize = (numberElements + 1) * newBufferElementSize;
|
|
||||||
_numElements = numberElements;
|
|
||||||
_elementSize = newBufferElementSize;
|
_elementSize = newBufferElementSize;
|
||||||
|
|
||||||
_readPosition = newBufferElementSize - 1;
|
_buffer = (uint8_t *)calloc(numberElements + 2, newBufferElementSize);
|
||||||
_writePosition = newBufferElementSize;
|
_bufferSize = (numberElements + 2) * newBufferElementSize;
|
||||||
_bufferFillSize = 0;
|
|
||||||
|
_readPosition = 0;
|
||||||
|
_writePosition = 1;
|
||||||
|
_elementFillCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
RingBuffer::~RingBuffer()
|
RingBuffer::~RingBuffer()
|
||||||
|
@ -41,58 +42,66 @@ RingBuffer::~RingBuffer()
|
||||||
|
|
||||||
void RingBuffer::clear()
|
void RingBuffer::clear()
|
||||||
{
|
{
|
||||||
this->_readPosition = this->_elementSize - 1;
|
this->_readPosition = 0;
|
||||||
this->_writePosition = this->_elementSize;
|
this->_writePosition = 1;
|
||||||
this->_bufferFillSize = 0;
|
this->_elementFillCount = 0;
|
||||||
memset(_buffer, 0, this->_bufferSize);
|
memset(_buffer, 0, this->_bufferSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t RingBuffer::read(void *__restrict__ destBuffer, size_t requestedNumberBytes)
|
size_t RingBuffer::read(void *__restrict__ destBuffer, size_t requestedNumberElements)
|
||||||
{
|
{
|
||||||
if (destBuffer == NULL)
|
if (destBuffer == NULL)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t hiBufferAvailable = 0;
|
size_t hiElementsAvailable = 0;
|
||||||
size_t loBufferAvailable = 0;
|
size_t loElementsAvailable = 0;
|
||||||
|
|
||||||
const uint8_t *__restrict__ inputData = this->_buffer;
|
const uint8_t *__restrict__ inputData = this->_buffer;
|
||||||
size_t inputDataReadPos = this->_readPosition;
|
size_t inputDataReadPos = this->_readPosition;
|
||||||
const size_t inputDataWritePos = this->_writePosition;
|
const size_t inputDataWritePos = this->_writePosition;
|
||||||
const size_t inputDataSize = this->_bufferSize;
|
const size_t inputDataSize = this->_elementCapacity + 2;
|
||||||
|
|
||||||
// Check buffer availability
|
// Check buffer availability
|
||||||
if (inputDataReadPos < inputDataWritePos)
|
if (inputDataReadPos < inputDataWritePos)
|
||||||
{
|
{
|
||||||
hiBufferAvailable = inputDataWritePos - inputDataReadPos - 1;
|
hiElementsAvailable = inputDataWritePos - inputDataReadPos - 1;
|
||||||
}
|
}
|
||||||
else if (inputDataReadPos > inputDataWritePos)
|
else if (inputDataReadPos > inputDataWritePos)
|
||||||
{
|
{
|
||||||
hiBufferAvailable = inputDataSize - inputDataReadPos - 1;
|
hiElementsAvailable = inputDataSize - inputDataReadPos - 1;
|
||||||
loBufferAvailable = inputDataWritePos;
|
loElementsAvailable = inputDataWritePos;
|
||||||
}
|
|
||||||
|
|
||||||
// Bounds check for buffer overrun
|
|
||||||
if (requestedNumberBytes > hiBufferAvailable + loBufferAvailable)
|
|
||||||
{
|
|
||||||
requestedNumberBytes = hiBufferAvailable + loBufferAvailable;
|
|
||||||
requestedNumberBytes -= requestedNumberBytes % this->_elementSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy ring buffer to destination buffer
|
|
||||||
if (requestedNumberBytes <= hiBufferAvailable)
|
|
||||||
{
|
|
||||||
memcpy(destBuffer, inputData + inputDataReadPos + 1, requestedNumberBytes);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
memcpy(destBuffer, inputData + inputDataReadPos + 1, hiBufferAvailable);
|
return requestedNumberElements;
|
||||||
memcpy((uint8_t *)destBuffer + hiBufferAvailable, inputData, requestedNumberBytes - hiBufferAvailable);
|
}
|
||||||
|
|
||||||
|
// Bounds check for buffer overrun
|
||||||
|
if (requestedNumberElements > hiElementsAvailable + loElementsAvailable)
|
||||||
|
{
|
||||||
|
requestedNumberElements = hiElementsAvailable + loElementsAvailable;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (requestedNumberElements == 0)
|
||||||
|
{
|
||||||
|
return requestedNumberElements;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy ring buffer to destination buffer
|
||||||
|
if (requestedNumberElements <= hiElementsAvailable)
|
||||||
|
{
|
||||||
|
memcpy(destBuffer, inputData + ((inputDataReadPos + 1) * this->_elementSize), requestedNumberElements * this->_elementSize);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy(destBuffer, inputData + ((inputDataReadPos + 1) * this->_elementSize), hiElementsAvailable * this->_elementSize);
|
||||||
|
memcpy((uint8_t *)destBuffer + (hiElementsAvailable * this->_elementSize), inputData, (requestedNumberElements - hiElementsAvailable) * this->_elementSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Advance the read position
|
// Advance the read position
|
||||||
inputDataReadPos += requestedNumberBytes;
|
inputDataReadPos += requestedNumberElements;
|
||||||
if (inputDataReadPos >= inputDataSize)
|
if (inputDataReadPos >= inputDataSize)
|
||||||
{
|
{
|
||||||
inputDataReadPos -= inputDataSize;
|
inputDataReadPos -= inputDataSize;
|
||||||
|
@ -101,92 +110,149 @@ size_t RingBuffer::read(void *__restrict__ destBuffer, size_t requestedNumberByt
|
||||||
this->_readPosition = inputDataReadPos;
|
this->_readPosition = inputDataReadPos;
|
||||||
|
|
||||||
// Decrease the fill size now that we're done reading.
|
// Decrease the fill size now that we're done reading.
|
||||||
OSAtomicAdd32Barrier(-(int32_t)requestedNumberBytes, &this->_bufferFillSize);
|
OSAtomicAdd32Barrier(-(int32_t)requestedNumberElements, &this->_elementFillCount);
|
||||||
|
|
||||||
return requestedNumberBytes;
|
return requestedNumberElements;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t RingBuffer::write(const void *__restrict__ srcBuffer, size_t requestedNumberBytes)
|
size_t RingBuffer::write(const void *__restrict__ srcBuffer, size_t requestedNumberElements)
|
||||||
{
|
{
|
||||||
if (srcBuffer == NULL)
|
if (srcBuffer == NULL)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t hiBufferAvailable = 0;
|
size_t hiElementsAvailable = 0;
|
||||||
size_t loBufferAvailable = 0;
|
size_t loElementsAvailable = 0;
|
||||||
|
|
||||||
uint8_t *__restrict__ inputData = this->_buffer;
|
uint8_t *__restrict__ inputData = this->_buffer;
|
||||||
const size_t inputDataReadPos = this->_readPosition;
|
const size_t inputDataReadPos = this->_readPosition;
|
||||||
size_t inputDataWritePos = this->_writePosition;
|
size_t inputDataWritePos = this->_writePosition;
|
||||||
const size_t inputDataSize = this->_bufferSize;
|
const size_t inputDataSize = this->_elementCapacity + 2;
|
||||||
|
|
||||||
// Check buffer availability.
|
// Check buffer availability.
|
||||||
if (inputDataWritePos >= inputDataReadPos)
|
if (inputDataWritePos > inputDataReadPos)
|
||||||
{
|
{
|
||||||
hiBufferAvailable = inputDataSize - inputDataWritePos;
|
hiElementsAvailable = inputDataSize - inputDataWritePos;
|
||||||
loBufferAvailable = inputDataReadPos;
|
loElementsAvailable = (inputDataReadPos > 0) ? inputDataReadPos - 1 : 0;
|
||||||
|
}
|
||||||
// Subtract one element's worth of bytes
|
else if (inputDataWritePos < inputDataReadPos)
|
||||||
if (loBufferAvailable > 0)
|
|
||||||
{
|
{
|
||||||
loBufferAvailable -= 1;
|
hiElementsAvailable = inputDataReadPos - inputDataWritePos - 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hiBufferAvailable -= 1;
|
return requestedNumberElements;
|
||||||
}
|
|
||||||
}
|
|
||||||
else // (inputDataWritePos < inputDataReadPos)
|
|
||||||
{
|
|
||||||
hiBufferAvailable = inputDataReadPos - inputDataWritePos - 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bounds check for buffer overrun
|
// Bounds check for buffer overrun
|
||||||
if (requestedNumberBytes > hiBufferAvailable + loBufferAvailable)
|
if (requestedNumberElements > hiElementsAvailable + loElementsAvailable)
|
||||||
{
|
{
|
||||||
requestedNumberBytes = hiBufferAvailable + loBufferAvailable;
|
requestedNumberElements = hiElementsAvailable + loElementsAvailable;
|
||||||
requestedNumberBytes -= requestedNumberBytes % this->_elementSize;
|
}
|
||||||
|
|
||||||
|
if (requestedNumberElements == 0)
|
||||||
|
{
|
||||||
|
return requestedNumberElements;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Increase the fill size before writing anything.
|
// Increase the fill size before writing anything.
|
||||||
OSAtomicAdd32Barrier((int32_t)requestedNumberBytes, &this->_bufferFillSize);
|
OSAtomicAdd32Barrier((int32_t)requestedNumberElements, &this->_elementFillCount);
|
||||||
|
|
||||||
// Copy source buffer to ring buffer.
|
// Copy source buffer to ring buffer.
|
||||||
if (requestedNumberBytes <= hiBufferAvailable)
|
if (requestedNumberElements <= hiElementsAvailable)
|
||||||
{
|
{
|
||||||
memcpy(inputData + inputDataWritePos, srcBuffer, requestedNumberBytes);
|
memcpy(inputData + (inputDataWritePos * this->_elementSize), srcBuffer, requestedNumberElements * this->_elementSize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
memcpy(inputData + inputDataWritePos, srcBuffer, hiBufferAvailable);
|
memcpy(inputData + (inputDataWritePos * this->_elementSize), srcBuffer, hiElementsAvailable * this->_elementSize);
|
||||||
memcpy(inputData, (uint8_t *)srcBuffer + hiBufferAvailable, requestedNumberBytes - hiBufferAvailable);
|
memcpy(inputData, (uint8_t *)srcBuffer + (hiElementsAvailable * this->_elementSize), (requestedNumberElements - hiElementsAvailable) * this->_elementSize);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Advance the write position.
|
// Advance the write position.
|
||||||
inputDataWritePos += requestedNumberBytes;
|
inputDataWritePos += requestedNumberElements;
|
||||||
if (inputDataWritePos >= inputDataSize)
|
if (inputDataWritePos > inputDataSize)
|
||||||
{
|
{
|
||||||
inputDataWritePos -= inputDataSize;
|
inputDataWritePos -= inputDataSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->_writePosition = inputDataWritePos;
|
this->_writePosition = inputDataWritePos;
|
||||||
|
|
||||||
return requestedNumberBytes;
|
return requestedNumberElements;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t RingBuffer::getBufferFillSize() const
|
size_t RingBuffer::drop(size_t requestedNumberElements)
|
||||||
{
|
{
|
||||||
return (size_t)this->_bufferFillSize;
|
size_t hiElementsAvailable = 0;
|
||||||
|
size_t loElementsAvailable = 0;
|
||||||
|
|
||||||
|
size_t inputDataReadPos = this->_readPosition;
|
||||||
|
const size_t inputDataWritePos = this->_writePosition;
|
||||||
|
const size_t inputDataSize = this->_elementCapacity + 2;
|
||||||
|
|
||||||
|
// Check buffer availability
|
||||||
|
if (inputDataReadPos < inputDataWritePos)
|
||||||
|
{
|
||||||
|
hiElementsAvailable = inputDataWritePos - inputDataReadPos - 1;
|
||||||
|
}
|
||||||
|
else if (inputDataReadPos > inputDataWritePos)
|
||||||
|
{
|
||||||
|
hiElementsAvailable = inputDataSize - inputDataReadPos - 1;
|
||||||
|
loElementsAvailable = inputDataWritePos;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return requestedNumberElements;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bounds check for buffer overrun
|
||||||
|
if (requestedNumberElements > hiElementsAvailable + loElementsAvailable)
|
||||||
|
{
|
||||||
|
requestedNumberElements = hiElementsAvailable + loElementsAvailable;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (requestedNumberElements == 0)
|
||||||
|
{
|
||||||
|
return requestedNumberElements;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Advance the read position
|
||||||
|
inputDataReadPos += requestedNumberElements;
|
||||||
|
if (inputDataReadPos >= inputDataSize)
|
||||||
|
{
|
||||||
|
inputDataReadPos -= inputDataSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->_readPosition = inputDataReadPos;
|
||||||
|
|
||||||
|
// Decrease the fill size now that we're done reading.
|
||||||
|
OSAtomicAdd32Barrier(-(int32_t)requestedNumberElements, &this->_elementFillCount);
|
||||||
|
|
||||||
|
return requestedNumberElements;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t RingBuffer::getAvailableElements() const
|
size_t RingBuffer::getAvailableElements() const
|
||||||
{
|
{
|
||||||
return ((this->_bufferSize - this->_bufferFillSize) / this->_elementSize) - 1;
|
return (this->_elementCapacity - this->_elementFillCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t RingBuffer::getElementCapacity() const
|
||||||
|
{
|
||||||
|
return this->_elementCapacity;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t RingBuffer::getElementSize() const
|
size_t RingBuffer::getElementSize() const
|
||||||
{
|
{
|
||||||
return this->_elementSize;
|
return this->_elementSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RingBuffer::isEmpty() const
|
||||||
|
{
|
||||||
|
return (this->_elementFillCount == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RingBuffer::isFull() const
|
||||||
|
{
|
||||||
|
return ((size_t)this->_elementFillCount >= this->_elementCapacity);
|
||||||
|
}
|
||||||
|
|
|
@ -26,11 +26,11 @@ class RingBuffer
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
uint8_t *_buffer;
|
uint8_t *_buffer;
|
||||||
uint8_t *_bufferEnd;
|
|
||||||
size_t _bufferSize;
|
size_t _bufferSize;
|
||||||
size_t _numElements;
|
|
||||||
|
size_t _elementCapacity;
|
||||||
size_t _elementSize;
|
size_t _elementSize;
|
||||||
int32_t _bufferFillSize; // need to use int32_t for OSAtomicAdd32Barrier()
|
int32_t _elementFillCount; // need to use int32_t for OSAtomicAdd32Barrier()
|
||||||
size_t _readPosition;
|
size_t _readPosition;
|
||||||
size_t _writePosition;
|
size_t _writePosition;
|
||||||
|
|
||||||
|
@ -39,11 +39,14 @@ public:
|
||||||
~RingBuffer();
|
~RingBuffer();
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
size_t read(void *__restrict__ destBuffer, size_t requestedNumberBytes);
|
size_t read(void *__restrict__ destBuffer, size_t requestedNumberElements);
|
||||||
size_t write(const void *__restrict__ srcBuffer, size_t requestedNumberBytes);
|
size_t write(const void *__restrict__ srcBuffer, size_t requestedNumberElements);
|
||||||
size_t getBufferFillSize() const;
|
size_t drop(size_t requestedNumberElements);
|
||||||
size_t getAvailableElements() const;
|
size_t getAvailableElements() const;
|
||||||
|
size_t getElementCapacity() const;
|
||||||
size_t getElementSize() const;
|
size_t getElementSize() const;
|
||||||
|
bool isEmpty() const;
|
||||||
|
bool isFull() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -93,7 +93,7 @@ void SNDOSXUpdateAudio(s16 *buffer, u32 num_samples)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
coreAudioPlaybackManager->writeToBuffer(buffer, coreAudioPlaybackManager->getBuffer()->getElementSize() * (size_t)num_samples);
|
coreAudioPlaybackManager->writeToBuffer(buffer, num_samples);
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 SNDOSXGetAudioSpace()
|
u32 SNDOSXGetAudioSpace()
|
||||||
|
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
@ -26,7 +26,7 @@
|
||||||
@class CocoaDSCheatManager;
|
@class CocoaDSCheatManager;
|
||||||
@class CheatWindowDelegate;
|
@class CheatWindowDelegate;
|
||||||
@class DisplayWindowController;
|
@class DisplayWindowController;
|
||||||
|
class AudioSampleBlockGenerator;
|
||||||
|
|
||||||
@interface EmuControllerDelegate : NSObject <NSUserInterfaceValidations>
|
@interface EmuControllerDelegate : NSObject <NSUserInterfaceValidations>
|
||||||
{
|
{
|
||||||
|
@ -224,6 +224,9 @@
|
||||||
- (void) pauseCore;
|
- (void) pauseCore;
|
||||||
- (void) restoreCoreState;
|
- (void) restoreCoreState;
|
||||||
|
|
||||||
|
- (AudioSampleBlockGenerator *) selectedAudioFileGenerator;
|
||||||
|
- (void) setSelectedAudioFileGenerator:(AudioSampleBlockGenerator *)theGenerator;
|
||||||
|
|
||||||
- (void) didEndFileMigrationSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
|
- (void) didEndFileMigrationSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
|
||||||
- (void) didEndSaveStateSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
|
- (void) didEndSaveStateSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
|
||||||
- (void) didEndSaveStateSheetOpen:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
|
- (void) didEndSaveStateSheetOpen:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
|
||||||
|
|
|
@ -1004,7 +1004,14 @@
|
||||||
}
|
}
|
||||||
else if (controlID == DSControllerState_Microphone)
|
else if (controlID == DSControllerState_Microphone)
|
||||||
{
|
{
|
||||||
[[cdsCore cdsController] setMicrophoneState:theState inputMode:cmdAttr.intValue[1]];
|
const NSInteger micMode = cmdAttr.intValue[1];
|
||||||
|
[[cdsCore cdsController] setMicrophoneState:theState inputMode:micMode];
|
||||||
|
|
||||||
|
const float sineWaveFrequency = cmdAttr.floatValue[0];
|
||||||
|
[[cdsCore cdsController] setSineWaveGeneratorFrequency:sineWaveFrequency];
|
||||||
|
|
||||||
|
NSString *audioFilePath = cmdAttr.object[0];
|
||||||
|
[[cdsCore cdsController] setSelectedAudioFileGenerator:[inputManager audioFileGeneratorFromFilePath:audioFilePath]];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1639,6 +1646,18 @@
|
||||||
[cdsCore restoreCoreState];
|
[cdsCore restoreCoreState];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (AudioSampleBlockGenerator *) selectedAudioFileGenerator
|
||||||
|
{
|
||||||
|
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
|
||||||
|
return [[cdsCore cdsController] selectedAudioFileGenerator];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) setSelectedAudioFileGenerator:(AudioSampleBlockGenerator *)theGenerator
|
||||||
|
{
|
||||||
|
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
|
||||||
|
[[cdsCore cdsController] setSelectedAudioFileGenerator:theGenerator];
|
||||||
|
}
|
||||||
|
|
||||||
- (void) didEndFileMigrationSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
|
- (void) didEndFileMigrationSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
|
||||||
{
|
{
|
||||||
NSURL *romURL = (NSURL *)contextInfo;
|
NSURL *romURL = (NSURL *)contextInfo;
|
||||||
|
|
|
@ -23,6 +23,9 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "mic_ext.h"
|
||||||
|
#undef BOOL
|
||||||
|
|
||||||
#define INPUT_HANDLER_STRING_LENGTH 256
|
#define INPUT_HANDLER_STRING_LENGTH 256
|
||||||
|
|
||||||
enum InputAttributeState
|
enum InputAttributeState
|
||||||
|
@ -33,7 +36,6 @@ enum InputAttributeState
|
||||||
};
|
};
|
||||||
|
|
||||||
@class EmuControllerDelegate;
|
@class EmuControllerDelegate;
|
||||||
@class CocoaDSController;
|
|
||||||
@class InputManager;
|
@class InputManager;
|
||||||
@class InputHIDManager;
|
@class InputHIDManager;
|
||||||
|
|
||||||
|
@ -81,6 +83,7 @@ typedef std::vector<CommandAttributes> CommandAttributesList;
|
||||||
typedef std::tr1::unordered_map<std::string, CommandAttributes> InputCommandMap; // Key = Input key in deviceCode:elementCode format, Value = CommandAttributes
|
typedef std::tr1::unordered_map<std::string, CommandAttributes> InputCommandMap; // Key = Input key in deviceCode:elementCode format, Value = CommandAttributes
|
||||||
typedef std::tr1::unordered_map<std::string, CommandAttributes> CommandAttributesMap; // Key = Command Tag, Value = CommandAttributes
|
typedef std::tr1::unordered_map<std::string, CommandAttributes> CommandAttributesMap; // Key = Command Tag, Value = CommandAttributes
|
||||||
typedef std::tr1::unordered_map<std::string, SEL> CommandSelectorMap; // Key = Command Tag, Value = Obj-C Selector
|
typedef std::tr1::unordered_map<std::string, SEL> CommandSelectorMap; // Key = Command Tag, Value = Obj-C Selector
|
||||||
|
typedef std::tr1::unordered_map<std::string, AudioSampleBlockGenerator> AudioFileSampleGeneratorMap; // Key = File path to audio file, Value = AudioSampleBlockGenerator
|
||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
@interface InputHIDDevice : NSObject
|
@interface InputHIDDevice : NSObject
|
||||||
|
@ -153,6 +156,7 @@ void HandleDeviceRemovalCallback(void *inContext, IOReturn inResult, void *inSen
|
||||||
InputCommandMap commandMap;
|
InputCommandMap commandMap;
|
||||||
CommandAttributesMap defaultCommandAttributes;
|
CommandAttributesMap defaultCommandAttributes;
|
||||||
CommandSelectorMap commandSelector;
|
CommandSelectorMap commandSelector;
|
||||||
|
AudioFileSampleGeneratorMap audioFileGenerators;
|
||||||
}
|
}
|
||||||
|
|
||||||
@property (readonly) IBOutlet EmuControllerDelegate *emuControl;
|
@property (readonly) IBOutlet EmuControllerDelegate *emuControl;
|
||||||
|
@ -185,12 +189,16 @@ void HandleDeviceRemovalCallback(void *inContext, IOReturn inResult, void *inSen
|
||||||
- (void) setMappedCommandAttributes:(const CommandAttributes *)cmdAttr deviceCode:(const char *)deviceCode elementCode:(const char *)elementCode;
|
- (void) setMappedCommandAttributes:(const CommandAttributes *)cmdAttr deviceCode:(const char *)deviceCode elementCode:(const char *)elementCode;
|
||||||
- (void) updateInputSettingsSummaryInDeviceInfoDictionary:(NSMutableDictionary *)deviceInfo commandTag:(const char *)commandTag;
|
- (void) updateInputSettingsSummaryInDeviceInfoDictionary:(NSMutableDictionary *)deviceInfo commandTag:(const char *)commandTag;
|
||||||
|
|
||||||
|
- (OSStatus) loadAudioFileUsingPath:(NSString *)filePath;
|
||||||
|
- (AudioSampleBlockGenerator *) audioFileGeneratorFromFilePath:(NSString *)filePath;
|
||||||
|
- (void) updateAudioFileGenerators;
|
||||||
|
|
||||||
CommandAttributes NewDefaultCommandAttributes(const char *commandTag);
|
CommandAttributes NewDefaultCommandAttributes(const char *commandTag);
|
||||||
CommandAttributes NewCommandAttributesForSelector(const char *commandTag, const SEL theSelector);
|
CommandAttributes NewCommandAttributesForSelector(const char *commandTag, const SEL theSelector);
|
||||||
CommandAttributes NewCommandAttributesForDSControl(const char *commandTag, const NSUInteger controlID);
|
CommandAttributes NewCommandAttributesForDSControl(const char *commandTag, const NSUInteger controlID);
|
||||||
void UpdateCommandAttributesWithDeviceInfoDictionary(CommandAttributes *cmdAttr, NSDictionary *deviceInfo);
|
void UpdateCommandAttributesWithDeviceInfoDictionary(CommandAttributes *cmdAttr, NSDictionary *deviceInfo);
|
||||||
|
|
||||||
NSDictionary* DeviceInfoDictionaryWithCommandAttributes(const CommandAttributes *cmdAttr,
|
NSMutableDictionary* DeviceInfoDictionaryWithCommandAttributes(const CommandAttributes *cmdAttr,
|
||||||
NSString *deviceCode,
|
NSString *deviceCode,
|
||||||
NSString *deviceName,
|
NSString *deviceName,
|
||||||
NSString *elementCode,
|
NSString *elementCode,
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
#import "cocoa_input.h"
|
#import "cocoa_input.h"
|
||||||
#import "cocoa_util.h"
|
#import "cocoa_util.h"
|
||||||
|
|
||||||
|
#include <AudioToolbox/AudioToolbox.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Get the symbols for UpdateSystemActivity().
|
Get the symbols for UpdateSystemActivity().
|
||||||
|
|
||||||
|
@ -893,6 +895,7 @@ static std::tr1::unordered_map<unsigned short, std::string> keyboardNameTable; /
|
||||||
|
|
||||||
CommandAttributes cmdDSControlMic = NewCommandAttributesForDSControl("Microphone", DSControllerState_Microphone);
|
CommandAttributes cmdDSControlMic = NewCommandAttributesForDSControl("Microphone", DSControllerState_Microphone);
|
||||||
cmdDSControlMic.intValue[1] = MICMODE_INTERNAL_NOISE;
|
cmdDSControlMic.intValue[1] = MICMODE_INTERNAL_NOISE;
|
||||||
|
cmdDSControlMic.floatValue[0] = 250.0f;
|
||||||
|
|
||||||
CommandAttributes cmdLoadEmuSaveStateSlot = NewCommandAttributesForSelector("Load State Slot", commandSelector["Load State Slot"]);
|
CommandAttributes cmdLoadEmuSaveStateSlot = NewCommandAttributesForSelector("Load State Slot", commandSelector["Load State Slot"]);
|
||||||
CommandAttributes cmdSaveEmuSaveStateSlot = NewCommandAttributesForSelector("Save State Slot", commandSelector["Save State Slot"]);
|
CommandAttributes cmdSaveEmuSaveStateSlot = NewCommandAttributesForSelector("Save State Slot", commandSelector["Save State Slot"]);
|
||||||
|
@ -1014,7 +1017,7 @@ static std::tr1::unordered_map<unsigned short, std::string> keyboardNameTable; /
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy all command attributes into a new deviceInfo dictionary.
|
// Copy all command attributes into a new deviceInfo dictionary.
|
||||||
NSDictionary *newDeviceInfo = DeviceInfoDictionaryWithCommandAttributes(&cmdAttr,
|
NSMutableDictionary *newDeviceInfo = DeviceInfoDictionaryWithCommandAttributes(&cmdAttr,
|
||||||
[deviceInfo valueForKey:@"deviceCode"],
|
[deviceInfo valueForKey:@"deviceCode"],
|
||||||
[deviceInfo valueForKey:@"deviceName"],
|
[deviceInfo valueForKey:@"deviceName"],
|
||||||
[deviceInfo valueForKey:@"elementCode"],
|
[deviceInfo valueForKey:@"elementCode"],
|
||||||
|
@ -1023,6 +1026,8 @@ static std::tr1::unordered_map<unsigned short, std::string> keyboardNameTable; /
|
||||||
[self addMappingUsingDeviceInfoDictionary:newDeviceInfo commandAttributes:&cmdAttr];
|
[self addMappingUsingDeviceInfoDictionary:newDeviceInfo commandAttributes:&cmdAttr];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[self updateAudioFileGenerators];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) addMappingUsingDeviceInfoDictionary:(NSDictionary *)deviceInfo commandAttributes:(const CommandAttributes *)cmdAttr
|
- (void) addMappingUsingDeviceInfoDictionary:(NSDictionary *)deviceInfo commandAttributes:(const CommandAttributes *)cmdAttr
|
||||||
|
@ -1064,7 +1069,7 @@ static std::tr1::unordered_map<unsigned short, std::string> keyboardNameTable; /
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSDictionary *deviceInfo = DeviceInfoDictionaryWithCommandAttributes(cmdAttr,
|
NSMutableDictionary *deviceInfo = DeviceInfoDictionaryWithCommandAttributes(cmdAttr,
|
||||||
[NSString stringWithCString:inputAttr->deviceCode encoding:NSUTF8StringEncoding],
|
[NSString stringWithCString:inputAttr->deviceCode encoding:NSUTF8StringEncoding],
|
||||||
[NSString stringWithCString:inputAttr->deviceName encoding:NSUTF8StringEncoding],
|
[NSString stringWithCString:inputAttr->deviceName encoding:NSUTF8StringEncoding],
|
||||||
[NSString stringWithCString:inputAttr->elementCode encoding:NSUTF8StringEncoding],
|
[NSString stringWithCString:inputAttr->elementCode encoding:NSUTF8StringEncoding],
|
||||||
|
@ -1119,8 +1124,7 @@ static std::tr1::unordered_map<unsigned short, std::string> keyboardNameTable; /
|
||||||
[self removeMappingUsingDeviceCode:deviceCode elementCode:elementCode];
|
[self removeMappingUsingDeviceCode:deviceCode elementCode:elementCode];
|
||||||
|
|
||||||
// Map the input.
|
// Map the input.
|
||||||
const std::string inputKey = std::string(deviceCode) + ":" + std::string(elementCode);
|
[self setMappedCommandAttributes:cmdAttr deviceCode:deviceCode elementCode:elementCode];
|
||||||
commandMap[inputKey] = *cmdAttr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) removeMappingUsingDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode
|
- (void) removeMappingUsingDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode
|
||||||
|
@ -1131,12 +1135,7 @@ static std::tr1::unordered_map<unsigned short, std::string> keyboardNameTable; /
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string inputKey = std::string(deviceCode) + ":" + std::string(elementCode);
|
const std::string inputKey = std::string(deviceCode) + ":" + std::string(elementCode);
|
||||||
|
commandMap.erase(inputKey);
|
||||||
InputCommandMap::iterator it = commandMap.find(inputKey);
|
|
||||||
if (it != commandMap.end())
|
|
||||||
{
|
|
||||||
commandMap.erase(it);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (NSString *inputCommandTag in inputMappings)
|
for (NSString *inputCommandTag in inputMappings)
|
||||||
{
|
{
|
||||||
|
@ -1312,7 +1311,7 @@ static std::tr1::unordered_map<unsigned short, std::string> keyboardNameTable; /
|
||||||
|
|
||||||
- (void) updateInputSettingsSummaryInDeviceInfoDictionary:(NSMutableDictionary *)deviceInfo commandTag:(const char *)commandTag
|
- (void) updateInputSettingsSummaryInDeviceInfoDictionary:(NSMutableDictionary *)deviceInfo commandTag:(const char *)commandTag
|
||||||
{
|
{
|
||||||
NSString *inputSummary = @"";
|
NSString *inputSummary = nil;
|
||||||
|
|
||||||
if (strncmp(commandTag, "Touch", INPUT_HANDLER_STRING_LENGTH) == 0)
|
if (strncmp(commandTag, "Touch", INPUT_HANDLER_STRING_LENGTH) == 0)
|
||||||
{
|
{
|
||||||
|
@ -1341,14 +1340,22 @@ static std::tr1::unordered_map<unsigned short, std::string> keyboardNameTable; /
|
||||||
inputSummary = NSSTRING_INPUTPREF_MIC_INTERNAL_NOISE;
|
inputSummary = NSSTRING_INPUTPREF_MIC_INTERNAL_NOISE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MICMODE_SOUND_FILE:
|
case MICMODE_AUDIO_FILE:
|
||||||
inputSummary = @"Sound File:";
|
inputSummary = (NSString *)[deviceInfo valueForKey:@"object1"];
|
||||||
|
if (inputSummary == nil)
|
||||||
|
{
|
||||||
|
inputSummary = NSSTRING_INPUTPREF_MIC_AUDIO_FILE_NONE_SELECTED;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MICMODE_WHITE_NOISE:
|
case MICMODE_WHITE_NOISE:
|
||||||
inputSummary = NSSTRING_INPUTPREF_MIC_WHITE_NOISE;
|
inputSummary = NSSTRING_INPUTPREF_MIC_WHITE_NOISE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MICMODE_SINE_WAVE:
|
||||||
|
inputSummary = [NSString stringWithFormat:NSSTRING_INPUTPREF_MIC_SINE_WAVE, [(NSNumber *)[deviceInfo valueForKey:@"floatValue0"] floatValue]];
|
||||||
|
break;
|
||||||
|
|
||||||
case MICMODE_PHYSICAL:
|
case MICMODE_PHYSICAL:
|
||||||
inputSummary = @"Physical:";
|
inputSummary = @"Physical:";
|
||||||
break;
|
break;
|
||||||
|
@ -1430,9 +1437,171 @@ static std::tr1::unordered_map<unsigned short, std::string> keyboardNameTable; /
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (inputSummary == nil)
|
||||||
|
{
|
||||||
|
inputSummary = @"";
|
||||||
|
}
|
||||||
|
|
||||||
[deviceInfo setObject:inputSummary forKey:@"inputSettingsSummary"];
|
[deviceInfo setObject:inputSummary forKey:@"inputSettingsSummary"];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (OSStatus) loadAudioFileUsingPath:(NSString *)filePath
|
||||||
|
{
|
||||||
|
OSStatus error = noErr;
|
||||||
|
|
||||||
|
if (filePath == nil)
|
||||||
|
{
|
||||||
|
error = 1;
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the audio file is already loaded. If it is, don't load it again.
|
||||||
|
std::string filePathStr = std::string([filePath cStringUsingEncoding:NSUTF8StringEncoding]);
|
||||||
|
for (AudioFileSampleGeneratorMap::iterator it=audioFileGenerators.begin(); it!=audioFileGenerators.end(); ++it)
|
||||||
|
{
|
||||||
|
if (it->first.find(filePathStr) != std::string::npos)
|
||||||
|
{
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open the audio file using the file URL.
|
||||||
|
NSURL *fileURL = [NSURL fileURLWithPath:filePath isDirectory:NO];
|
||||||
|
if (fileURL == nil)
|
||||||
|
{
|
||||||
|
error = 1;
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
ExtAudioFileRef audioFile;
|
||||||
|
error = ExtAudioFileOpenURL((CFURLRef)fileURL, &audioFile);
|
||||||
|
if (error != noErr)
|
||||||
|
{
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create an ASBD of the DS mic audio format.
|
||||||
|
AudioStreamBasicDescription outputFormat;
|
||||||
|
outputFormat.mSampleRate = MIC_SAMPLE_RATE;
|
||||||
|
outputFormat.mFormatID = kAudioFormatLinearPCM;
|
||||||
|
outputFormat.mFormatFlags = kAudioFormatFlagIsPacked;
|
||||||
|
outputFormat.mBytesPerPacket = 1;
|
||||||
|
outputFormat.mFramesPerPacket = 1;
|
||||||
|
outputFormat.mBytesPerFrame = 1;
|
||||||
|
outputFormat.mChannelsPerFrame = 1;
|
||||||
|
outputFormat.mBitsPerChannel = 8;
|
||||||
|
|
||||||
|
error = ExtAudioFileSetProperty(audioFile, kExtAudioFileProperty_ClientDataFormat, sizeof(outputFormat), &outputFormat);
|
||||||
|
if (error != noErr)
|
||||||
|
{
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
SInt64 fileLengthFrames = 0;
|
||||||
|
UInt32 propertySize = sizeof(fileLengthFrames);
|
||||||
|
|
||||||
|
error = ExtAudioFileGetProperty(audioFile, kExtAudioFileProperty_FileLengthFrames, &propertySize, &fileLengthFrames);
|
||||||
|
if (error != noErr)
|
||||||
|
{
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a new audio file generator.
|
||||||
|
audioFileGenerators[filePathStr] = AudioSampleBlockGenerator();
|
||||||
|
AudioSampleBlockGenerator &theGenerator = audioFileGenerators[filePathStr];
|
||||||
|
u8 *buffer = theGenerator.allocate(fileLengthFrames);
|
||||||
|
|
||||||
|
// Read the audio file and fill the generator's buffer.
|
||||||
|
const size_t convertBufferSize = 32 * 1024;
|
||||||
|
AudioBufferList convertedData;
|
||||||
|
convertedData.mNumberBuffers = 1;
|
||||||
|
convertedData.mBuffers[0].mNumberChannels = outputFormat.mChannelsPerFrame;
|
||||||
|
convertedData.mBuffers[0].mDataByteSize = convertBufferSize;
|
||||||
|
convertedData.mBuffers[0].mData = buffer;
|
||||||
|
|
||||||
|
UInt32 readFrames = convertBufferSize;
|
||||||
|
while (readFrames > 0)
|
||||||
|
{
|
||||||
|
ExtAudioFileRead(audioFile, &readFrames, &convertedData);
|
||||||
|
buffer += readFrames;
|
||||||
|
convertedData.mBuffers[0].mData = buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close the audio file.
|
||||||
|
ExtAudioFileDispose(audioFile);
|
||||||
|
|
||||||
|
// Convert the audio buffer to 7-bit unsigned PCM.
|
||||||
|
buffer = theGenerator.getBuffer();
|
||||||
|
for (SInt64 i = 0; i < fileLengthFrames; i++)
|
||||||
|
{
|
||||||
|
*(buffer+i) >>= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (AudioSampleBlockGenerator *) audioFileGeneratorFromFilePath:(NSString *)filePath
|
||||||
|
{
|
||||||
|
BOOL isAudioFileLoaded = NO;
|
||||||
|
|
||||||
|
if (filePath == nil)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string filePathStr = std::string([filePath cStringUsingEncoding:NSUTF8StringEncoding]);
|
||||||
|
for (AudioFileSampleGeneratorMap::iterator it=audioFileGenerators.begin(); it!=audioFileGenerators.end(); ++it)
|
||||||
|
{
|
||||||
|
if (it->first.find(filePathStr) != std::string::npos)
|
||||||
|
{
|
||||||
|
isAudioFileLoaded = YES;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (isAudioFileLoaded) ? &audioFileGenerators[filePathStr] : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) updateAudioFileGenerators
|
||||||
|
{
|
||||||
|
NSMutableArray *inputList = (NSMutableArray *)[inputMappings valueForKey:@"Microphone"];
|
||||||
|
|
||||||
|
// Load any unloaded audio files
|
||||||
|
for (NSMutableArray *deviceInfo in inputList)
|
||||||
|
{
|
||||||
|
NSString *filePath = (NSString *)[deviceInfo valueForKey:@"object0"];
|
||||||
|
[self loadAudioFileUsingPath:filePath];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unload any orphaned audio files
|
||||||
|
for (AudioFileSampleGeneratorMap::iterator it=audioFileGenerators.begin(); it!=audioFileGenerators.end(); ++it)
|
||||||
|
{
|
||||||
|
BOOL didFindKey = NO;
|
||||||
|
NSString *audioGeneratorKey = [NSString stringWithCString:it->first.c_str() encoding:NSUTF8StringEncoding];
|
||||||
|
|
||||||
|
for (NSMutableDictionary *deviceInfo in inputList)
|
||||||
|
{
|
||||||
|
NSString *deviceAudioFilePath = (NSString *)[deviceInfo valueForKey:@"object0"];
|
||||||
|
if ([audioGeneratorKey isEqualToString:deviceAudioFilePath])
|
||||||
|
{
|
||||||
|
didFindKey = YES;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!didFindKey)
|
||||||
|
{
|
||||||
|
AudioSampleBlockGenerator *selectedGenerator = [emuControl selectedAudioFileGenerator];
|
||||||
|
if (selectedGenerator == &it->second)
|
||||||
|
{
|
||||||
|
[emuControl setSelectedAudioFileGenerator:NULL];
|
||||||
|
}
|
||||||
|
|
||||||
|
audioFileGenerators.erase(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CommandAttributes NewDefaultCommandAttributes(const char *commandTag)
|
CommandAttributes NewDefaultCommandAttributes(const char *commandTag)
|
||||||
{
|
{
|
||||||
CommandAttributes cmdAttr;
|
CommandAttributes cmdAttr;
|
||||||
|
@ -1447,10 +1616,10 @@ CommandAttributes NewDefaultCommandAttributes(const char *commandTag)
|
||||||
cmdAttr.floatValue[1] = 0;
|
cmdAttr.floatValue[1] = 0;
|
||||||
cmdAttr.floatValue[2] = 0;
|
cmdAttr.floatValue[2] = 0;
|
||||||
cmdAttr.floatValue[3] = 0;
|
cmdAttr.floatValue[3] = 0;
|
||||||
cmdAttr.object[0] = 0;
|
cmdAttr.object[0] = nil;
|
||||||
cmdAttr.object[1] = 0;
|
cmdAttr.object[1] = nil;
|
||||||
cmdAttr.object[2] = 0;
|
cmdAttr.object[2] = nil;
|
||||||
cmdAttr.object[3] = 0;
|
cmdAttr.object[3] = nil;
|
||||||
|
|
||||||
cmdAttr.useInputForIntCoord = false;
|
cmdAttr.useInputForIntCoord = false;
|
||||||
cmdAttr.useInputForFloatCoord = false;
|
cmdAttr.useInputForFloatCoord = false;
|
||||||
|
@ -1472,6 +1641,7 @@ CommandAttributes NewCommandAttributesForDSControl(const char *commandTag, const
|
||||||
{
|
{
|
||||||
CommandAttributes cmdAttr = NewCommandAttributesForSelector(commandTag, @selector(cmdUpdateDSController:));
|
CommandAttributes cmdAttr = NewCommandAttributesForSelector(commandTag, @selector(cmdUpdateDSController:));
|
||||||
cmdAttr.intValue[0] = controlID;
|
cmdAttr.intValue[0] = controlID;
|
||||||
|
cmdAttr.floatValue[0] = 250.0f;
|
||||||
|
|
||||||
return cmdAttr;
|
return cmdAttr;
|
||||||
}
|
}
|
||||||
|
@ -1491,6 +1661,10 @@ void UpdateCommandAttributesWithDeviceInfoDictionary(CommandAttributes *cmdAttr,
|
||||||
NSNumber *floatValue1 = (NSNumber *)[deviceInfo valueForKey:@"floatValue1"];
|
NSNumber *floatValue1 = (NSNumber *)[deviceInfo valueForKey:@"floatValue1"];
|
||||||
NSNumber *floatValue2 = (NSNumber *)[deviceInfo valueForKey:@"floatValue2"];
|
NSNumber *floatValue2 = (NSNumber *)[deviceInfo valueForKey:@"floatValue2"];
|
||||||
NSNumber *floatValue3 = (NSNumber *)[deviceInfo valueForKey:@"floatValue3"];
|
NSNumber *floatValue3 = (NSNumber *)[deviceInfo valueForKey:@"floatValue3"];
|
||||||
|
NSObject *object0 = [deviceInfo valueForKey:@"object0"];
|
||||||
|
NSObject *object1 = [deviceInfo valueForKey:@"object1"];
|
||||||
|
NSObject *object2 = [deviceInfo valueForKey:@"object2"];
|
||||||
|
NSObject *object3 = [deviceInfo valueForKey:@"object3"];
|
||||||
NSNumber *useInputForIntCoord = (NSNumber *)[deviceInfo valueForKey:@"useInputForIntCoord"];
|
NSNumber *useInputForIntCoord = (NSNumber *)[deviceInfo valueForKey:@"useInputForIntCoord"];
|
||||||
NSNumber *useInputForFloatCoord = (NSNumber *)[deviceInfo valueForKey:@"useInputForFloatCoord"];
|
NSNumber *useInputForFloatCoord = (NSNumber *)[deviceInfo valueForKey:@"useInputForFloatCoord"];
|
||||||
NSNumber *useInputForScalar = (NSNumber *)[deviceInfo valueForKey:@"useInputForScalar"];
|
NSNumber *useInputForScalar = (NSNumber *)[deviceInfo valueForKey:@"useInputForScalar"];
|
||||||
|
@ -1508,9 +1682,14 @@ void UpdateCommandAttributesWithDeviceInfoDictionary(CommandAttributes *cmdAttr,
|
||||||
if (useInputForFloatCoord != nil) cmdAttr->useInputForFloatCoord = [useInputForFloatCoord boolValue];
|
if (useInputForFloatCoord != nil) cmdAttr->useInputForFloatCoord = [useInputForFloatCoord boolValue];
|
||||||
if (useInputForScalar != nil) cmdAttr->useInputForScalar = [useInputForScalar boolValue];
|
if (useInputForScalar != nil) cmdAttr->useInputForScalar = [useInputForScalar boolValue];
|
||||||
if (useInputForSender != nil) cmdAttr->useInputForSender = [useInputForSender boolValue];
|
if (useInputForSender != nil) cmdAttr->useInputForSender = [useInputForSender boolValue];
|
||||||
|
|
||||||
|
cmdAttr->object[0] = object0;
|
||||||
|
cmdAttr->object[1] = object1;
|
||||||
|
cmdAttr->object[2] = object2;
|
||||||
|
cmdAttr->object[3] = object3;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSDictionary* DeviceInfoDictionaryWithCommandAttributes(const CommandAttributes *cmdAttr,
|
NSMutableDictionary* DeviceInfoDictionaryWithCommandAttributes(const CommandAttributes *cmdAttr,
|
||||||
NSString *deviceCode,
|
NSString *deviceCode,
|
||||||
NSString *deviceName,
|
NSString *deviceName,
|
||||||
NSString *elementCode,
|
NSString *elementCode,
|
||||||
|
@ -1527,7 +1706,7 @@ NSDictionary* DeviceInfoDictionaryWithCommandAttributes(const CommandAttributes
|
||||||
|
|
||||||
NSString *deviceInfoSummary = [[deviceName stringByAppendingString:@": "] stringByAppendingString:elementName];
|
NSString *deviceInfoSummary = [[deviceName stringByAppendingString:@": "] stringByAppendingString:elementName];
|
||||||
|
|
||||||
return [NSDictionary dictionaryWithObjectsAndKeys:
|
NSMutableDictionary *newDeviceInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
|
||||||
deviceCode, @"deviceCode",
|
deviceCode, @"deviceCode",
|
||||||
deviceName, @"deviceName",
|
deviceName, @"deviceName",
|
||||||
elementCode, @"elementCode",
|
elementCode, @"elementCode",
|
||||||
|
@ -1547,6 +1726,14 @@ NSDictionary* DeviceInfoDictionaryWithCommandAttributes(const CommandAttributes
|
||||||
[NSNumber numberWithBool:cmdAttr->useInputForScalar], @"useInputForScalar",
|
[NSNumber numberWithBool:cmdAttr->useInputForScalar], @"useInputForScalar",
|
||||||
[NSNumber numberWithBool:cmdAttr->useInputForSender], @"useInputForSender",
|
[NSNumber numberWithBool:cmdAttr->useInputForSender], @"useInputForSender",
|
||||||
nil];
|
nil];
|
||||||
|
|
||||||
|
// Set the object references last since these could be nil.
|
||||||
|
[newDeviceInfo setValue:cmdAttr->object[0] forKey:@"object0"];
|
||||||
|
[newDeviceInfo setValue:cmdAttr->object[1] forKey:@"object1"];
|
||||||
|
[newDeviceInfo setValue:cmdAttr->object[2] forKey:@"object2"];
|
||||||
|
[newDeviceInfo setValue:cmdAttr->object[3] forKey:@"object3"];
|
||||||
|
|
||||||
|
return newDeviceInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
InputAttributesList InputManagerEncodeHIDQueue(const IOHIDQueueRef hidQueue)
|
InputAttributesList InputManagerEncodeHIDQueue(const IOHIDQueueRef hidQueue)
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
#import "cocoa_firmware.h"
|
#import "cocoa_firmware.h"
|
||||||
#import "cocoa_globals.h"
|
#import "cocoa_globals.h"
|
||||||
#import "cocoa_input.h"
|
#import "cocoa_input.h"
|
||||||
#import "cocoa_mic.h"
|
|
||||||
#import "cocoa_rom.h"
|
#import "cocoa_rom.h"
|
||||||
#import "cocoa_util.h"
|
#import "cocoa_util.h"
|
||||||
|
|
||||||
|
@ -172,8 +171,7 @@
|
||||||
[cdsCoreController setContent:newCore];
|
[cdsCoreController setContent:newCore];
|
||||||
|
|
||||||
// Init the DS controller and microphone.
|
// Init the DS controller and microphone.
|
||||||
CocoaDSMic *newMic = [[[CocoaDSMic alloc] init] autorelease];
|
CocoaDSController *newController = [[[CocoaDSController alloc] init] autorelease];
|
||||||
CocoaDSController *newController = [[[CocoaDSController alloc] initWithMic:newMic] autorelease];
|
|
||||||
[newCore setCdsController:newController];
|
[newCore setCdsController:newController];
|
||||||
|
|
||||||
// Init the DS speakers.
|
// Init the DS speakers.
|
||||||
|
|
|
@ -49,6 +49,7 @@
|
||||||
InputManager *inputManager;
|
InputManager *inputManager;
|
||||||
NSString *configInputTargetID;
|
NSString *configInputTargetID;
|
||||||
NSMutableDictionary *configInputList;
|
NSMutableDictionary *configInputList;
|
||||||
|
NSMutableDictionary *inputSettingsInEdit;
|
||||||
|
|
||||||
NSDictionary *inputSettingsMappings;
|
NSDictionary *inputSettingsMappings;
|
||||||
|
|
||||||
|
@ -76,6 +77,7 @@
|
||||||
|
|
||||||
@property (readonly) IBOutlet InputManager *inputManager;
|
@property (readonly) IBOutlet InputManager *inputManager;
|
||||||
@property (retain) NSString *configInputTargetID;
|
@property (retain) NSString *configInputTargetID;
|
||||||
|
@property (retain) NSMutableDictionary *inputSettingsInEdit;
|
||||||
|
|
||||||
- (void) initSettingsSheets;
|
- (void) initSettingsSheets;
|
||||||
- (void) populateInputProfileMenu;
|
- (void) populateInputProfileMenu;
|
||||||
|
@ -106,4 +108,7 @@
|
||||||
- (IBAction) closeProfileSheet:(id)sender;
|
- (IBAction) closeProfileSheet:(id)sender;
|
||||||
- (IBAction) closeProfileRenameSheet:(id)sender;
|
- (IBAction) closeProfileRenameSheet:(id)sender;
|
||||||
|
|
||||||
|
- (IBAction) audioFileChoose:(id)sender;
|
||||||
|
- (IBAction) audioFileChooseNone:(id)sender;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
@synthesize inputProfileRenameSheet;
|
@synthesize inputProfileRenameSheet;
|
||||||
@synthesize inputManager;
|
@synthesize inputManager;
|
||||||
@dynamic configInputTargetID;
|
@dynamic configInputTargetID;
|
||||||
|
@synthesize inputSettingsInEdit;
|
||||||
|
|
||||||
- (id)initWithFrame:(NSRect)frame
|
- (id)initWithFrame:(NSRect)frame
|
||||||
{
|
{
|
||||||
|
@ -69,6 +70,7 @@
|
||||||
|
|
||||||
configInputTargetID = nil;
|
configInputTargetID = nil;
|
||||||
configInputList = [[NSMutableDictionary alloc] initWithCapacity:128];
|
configInputList = [[NSMutableDictionary alloc] initWithCapacity:128];
|
||||||
|
inputSettingsInEdit = nil;
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
@ -221,6 +223,12 @@
|
||||||
[inputManager addMappingUsingInputAttributes:inputAttr commandAttributes:&cmdAttr];
|
[inputManager addMappingUsingInputAttributes:inputAttr commandAttributes:&cmdAttr];
|
||||||
[inputManager writeDefaultsInputMappings];
|
[inputManager writeDefaultsInputMappings];
|
||||||
|
|
||||||
|
// If we're dealing with a Microphone command, update the audio file generators list.
|
||||||
|
if ([commandTag isEqualToString:@"Microphone"])
|
||||||
|
{
|
||||||
|
[inputManager updateAudioFileGenerators];
|
||||||
|
}
|
||||||
|
|
||||||
// Deselect the row of the command tag.
|
// Deselect the row of the command tag.
|
||||||
NSDictionary *inputMappings = [inputManager inputMappings];
|
NSDictionary *inputMappings = [inputManager inputMappings];
|
||||||
NSArray *mappingList = (NSArray *)[inputMappings valueForKey:[self configInputTargetID]];
|
NSArray *mappingList = (NSArray *)[inputMappings valueForKey:[self configInputTargetID]];
|
||||||
|
@ -263,6 +271,12 @@
|
||||||
[inputManager updateInputSettingsSummaryInDeviceInfoDictionary:deviceInfo commandTag:cmdAttr.tag];
|
[inputManager updateInputSettingsSummaryInDeviceInfoDictionary:deviceInfo commandTag:cmdAttr.tag];
|
||||||
[inputManager setMappedCommandAttributes:&cmdAttr deviceCode:devCode elementCode:elCode];
|
[inputManager setMappedCommandAttributes:&cmdAttr deviceCode:devCode elementCode:elCode];
|
||||||
[inputManager writeDefaultsInputMappings];
|
[inputManager writeDefaultsInputMappings];
|
||||||
|
|
||||||
|
// If we're dealing with a Microphone command, update the audio file generators list.
|
||||||
|
if (strncmp(cmdAttr.tag, "Microphone", INPUT_HANDLER_STRING_LENGTH) == 0)
|
||||||
|
{
|
||||||
|
[inputManager updateAudioFileGenerators];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL) doesProfileNameExist:(NSString *)profileName
|
- (BOOL) doesProfileNameExist:(NSString *)profileName
|
||||||
|
@ -306,7 +320,8 @@
|
||||||
[sheet orderOut:self];
|
[sheet orderOut:self];
|
||||||
|
|
||||||
NSOutlineView *outlineView = (NSOutlineView *)contextInfo;
|
NSOutlineView *outlineView = (NSOutlineView *)contextInfo;
|
||||||
NSMutableDictionary *deviceInfo = (NSMutableDictionary *)[inputSettingsController content];
|
NSMutableDictionary *editedDeviceInfo = (NSMutableDictionary *)[inputSettingsController content];
|
||||||
|
NSMutableDictionary *deviceInfoInEdit = [self inputSettingsInEdit];
|
||||||
|
|
||||||
switch (returnCode)
|
switch (returnCode)
|
||||||
{
|
{
|
||||||
|
@ -314,8 +329,9 @@
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NSOKButton:
|
case NSOKButton:
|
||||||
[self setMappingUsingDeviceInfoDictionary:deviceInfo];
|
[deviceInfoInEdit setDictionary:editedDeviceInfo];
|
||||||
[outlineView reloadItem:deviceInfo reloadChildren:NO];
|
[self setMappingUsingDeviceInfoDictionary:deviceInfoInEdit];
|
||||||
|
[outlineView reloadItem:deviceInfoInEdit reloadChildren:NO];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -323,6 +339,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
[inputSettingsController setContent:nil];
|
[inputSettingsController setContent:nil];
|
||||||
|
[self setInputSettingsInEdit:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) didEndProfileSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
|
- (void) didEndProfileSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
|
||||||
|
@ -553,6 +570,10 @@
|
||||||
if ([item isKindOfClass:[NSDictionary class]])
|
if ([item isKindOfClass:[NSDictionary class]])
|
||||||
{
|
{
|
||||||
settingsSummary = [item valueForKey:@"inputSettingsSummary"];
|
settingsSummary = [item valueForKey:@"inputSettingsSummary"];
|
||||||
|
if (settingsSummary == nil)
|
||||||
|
{
|
||||||
|
settingsSummary = @"";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return settingsSummary;
|
return settingsSummary;
|
||||||
|
@ -680,12 +701,18 @@
|
||||||
const NSInteger rowNumber = [outlineView clickedRow];
|
const NSInteger rowNumber = [outlineView clickedRow];
|
||||||
|
|
||||||
NSDictionary *deviceInfo = (NSDictionary *)[outlineView itemAtRow:rowNumber];
|
NSDictionary *deviceInfo = (NSDictionary *)[outlineView itemAtRow:rowNumber];
|
||||||
NSMutableArray *inputList = (NSMutableArray *)[outlineView parentForItem:deviceInfo];
|
NSArray *inputList = (NSArray *)[outlineView parentForItem:deviceInfo];
|
||||||
|
|
||||||
[inputManager removeMappingUsingDeviceCode:[(NSString *)[deviceInfo valueForKey:@"deviceCode"] cStringUsingEncoding:NSUTF8StringEncoding] elementCode:[(NSString *)[deviceInfo valueForKey:@"elementCode"] cStringUsingEncoding:NSUTF8StringEncoding]];
|
[inputManager removeMappingUsingDeviceCode:[(NSString *)[deviceInfo valueForKey:@"deviceCode"] cStringUsingEncoding:NSUTF8StringEncoding] elementCode:[(NSString *)[deviceInfo valueForKey:@"elementCode"] cStringUsingEncoding:NSUTF8StringEncoding]];
|
||||||
[inputManager writeDefaultsInputMappings];
|
[inputManager writeDefaultsInputMappings];
|
||||||
|
|
||||||
[outlineView reloadItem:inputList reloadChildren:YES];
|
[outlineView reloadItem:inputList reloadChildren:YES];
|
||||||
|
|
||||||
|
// If we're dealing with a Microphone command, update the audio file generators list.
|
||||||
|
if ([[inputManager commandTagFromInputList:inputList] isEqualToString:@"Microphone"])
|
||||||
|
{
|
||||||
|
[inputManager updateAudioFileGenerators];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction) changeSpeed:(id)sender
|
- (IBAction) changeSpeed:(id)sender
|
||||||
|
@ -703,8 +730,8 @@
|
||||||
NSOutlineView *outlineView = (NSOutlineView *)sender;
|
NSOutlineView *outlineView = (NSOutlineView *)sender;
|
||||||
const NSInteger rowNumber = [outlineView clickedRow];
|
const NSInteger rowNumber = [outlineView clickedRow];
|
||||||
|
|
||||||
NSMutableDictionary *item = (NSMutableDictionary *)[outlineView itemAtRow:rowNumber];
|
[self setInputSettingsInEdit:(NSMutableDictionary *)[outlineView itemAtRow:rowNumber]];
|
||||||
NSString *commandTag = [inputManager commandTagFromInputList:[outlineView parentForItem:item]];
|
NSString *commandTag = [inputManager commandTagFromInputList:[outlineView parentForItem:[self inputSettingsInEdit]]];
|
||||||
NSWindow *theSheet = (NSWindow *)[inputSettingsMappings valueForKey:commandTag];
|
NSWindow *theSheet = (NSWindow *)[inputSettingsMappings valueForKey:commandTag];
|
||||||
|
|
||||||
if (theSheet == nil)
|
if (theSheet == nil)
|
||||||
|
@ -712,7 +739,7 @@
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
[inputSettingsController setContent:item];
|
[inputSettingsController setContent:[NSMutableDictionary dictionaryWithDictionary:[self inputSettingsInEdit]]];
|
||||||
|
|
||||||
[NSApp beginSheet:theSheet
|
[NSApp beginSheet:theSheet
|
||||||
modalForWindow:prefWindow
|
modalForWindow:prefWindow
|
||||||
|
@ -746,7 +773,7 @@
|
||||||
|
|
||||||
[savedProfilesList addObject:newProfile];
|
[savedProfilesList addObject:newProfile];
|
||||||
|
|
||||||
NSInteger profileIndex = _defaultProfileListCount + [savedProfilesList count] - 1;
|
const NSInteger profileIndex = _defaultProfileListCount + [savedProfilesList count] - 1;
|
||||||
NSMenu *profileMenu = [inputProfileMenu menu];
|
NSMenu *profileMenu = [inputProfileMenu menu];
|
||||||
NSMenuItem *newProfileMenuItem = [[[NSMenuItem alloc] initWithTitle:newProfileName
|
NSMenuItem *newProfileMenuItem = [[[NSMenuItem alloc] initWithTitle:newProfileName
|
||||||
action:@selector(profileSelect:)
|
action:@selector(profileSelect:)
|
||||||
|
@ -825,7 +852,7 @@
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSInteger profileIndex = [inputProfileMenu indexOfSelectedItem] - 1;
|
const NSInteger profileIndex = [inputProfileMenu indexOfSelectedItem] - 1;
|
||||||
NSMenu *profileMenu = [inputProfileMenu menu];
|
NSMenu *profileMenu = [inputProfileMenu menu];
|
||||||
|
|
||||||
[profileMenu removeItemAtIndex:[inputProfileMenu indexOfSelectedItem]];
|
[profileMenu removeItemAtIndex:[inputProfileMenu indexOfSelectedItem]];
|
||||||
|
@ -855,7 +882,7 @@
|
||||||
|
|
||||||
- (IBAction) profileSelect:(id)sender
|
- (IBAction) profileSelect:(id)sender
|
||||||
{
|
{
|
||||||
NSInteger profileID = [CocoaDSUtil getIBActionSenderTag:sender];
|
const NSInteger profileID = [CocoaDSUtil getIBActionSenderTag:sender];
|
||||||
NSArray *profileList = nil;
|
NSArray *profileList = nil;
|
||||||
|
|
||||||
if (profileID < 0 || profileID >= (NSInteger)(_defaultProfileListCount + [savedProfilesList count]))
|
if (profileID < 0 || profileID >= (NSInteger)(_defaultProfileListCount + [savedProfilesList count]))
|
||||||
|
@ -902,6 +929,71 @@
|
||||||
[NSApp endSheet:sheet returnCode:[CocoaDSUtil getIBActionSenderTag:sender]];
|
[NSApp endSheet:sheet returnCode:[CocoaDSUtil getIBActionSenderTag:sender]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (IBAction) audioFileChoose:(id)sender
|
||||||
|
{
|
||||||
|
NSURL *selectedFileURL = nil;
|
||||||
|
|
||||||
|
NSOpenPanel *panel = [NSOpenPanel openPanel];
|
||||||
|
[panel setCanChooseDirectories:NO];
|
||||||
|
[panel setCanChooseFiles:YES];
|
||||||
|
[panel setResolvesAliases:YES];
|
||||||
|
[panel setAllowsMultipleSelection:NO];
|
||||||
|
[panel setTitle:@"Select Audio File"];
|
||||||
|
NSArray *fileTypes = [NSArray arrayWithObjects:
|
||||||
|
@"3gp",
|
||||||
|
@"3g2",
|
||||||
|
@"aac",
|
||||||
|
@"adts",
|
||||||
|
@"ac3",
|
||||||
|
@"aifc",
|
||||||
|
@"aiff",
|
||||||
|
@"aif",
|
||||||
|
@"amr",
|
||||||
|
@"caf",
|
||||||
|
@"mpeg",
|
||||||
|
@"mpa",
|
||||||
|
@"mp1",
|
||||||
|
@"mp2",
|
||||||
|
@"mp3",
|
||||||
|
@"mp4",
|
||||||
|
@"m4a",
|
||||||
|
@"snd",
|
||||||
|
@"au",
|
||||||
|
@"sd2",
|
||||||
|
@"wav",
|
||||||
|
nil];
|
||||||
|
|
||||||
|
// The NSOpenPanel method -(NSInt)runModalForDirectory:file:types:
|
||||||
|
// is deprecated in Mac OS X v10.6.
|
||||||
|
#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5
|
||||||
|
[panel setAllowedFileTypes:fileTypes];
|
||||||
|
const NSInteger buttonClicked = [panel runModal];
|
||||||
|
#else
|
||||||
|
const NSInteger buttonClicked = [panel runModalForDirectory:nil file:nil types:fileTypes];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (buttonClicked == NSFileHandlingPanelOKButton)
|
||||||
|
{
|
||||||
|
selectedFileURL = [[panel URLs] lastObject];
|
||||||
|
if(selectedFileURL == nil)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSString *selectedFilePath = [selectedFileURL path];
|
||||||
|
NSMutableDictionary *editedDeviceInfo = (NSMutableDictionary *)[inputSettingsController content];
|
||||||
|
[editedDeviceInfo setValue:selectedFilePath forKey:@"object0"];
|
||||||
|
[editedDeviceInfo setValue:[selectedFilePath lastPathComponent] forKey:@"object1"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction) audioFileChooseNone:(id)sender
|
||||||
|
{
|
||||||
|
NSMutableDictionary *editedDeviceInfo = (NSMutableDictionary *)[inputSettingsController content];
|
||||||
|
[editedDeviceInfo setValue:nil forKey:@"object0"];
|
||||||
|
[editedDeviceInfo setValue:nil forKey:@"object1"];
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark NSControl Delegate Methods
|
#pragma mark NSControl Delegate Methods
|
||||||
|
|
||||||
- (void)controlTextDidEndEditing:(NSNotification *)aNotification
|
- (void)controlTextDidEndEditing:(NSNotification *)aNotification
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
#import "cocoa_globals.h"
|
#import "cocoa_globals.h"
|
||||||
#import "cocoa_input.h"
|
#import "cocoa_input.h"
|
||||||
#import "cocoa_file.h"
|
#import "cocoa_file.h"
|
||||||
#import "cocoa_mic.h"
|
|
||||||
#import "cocoa_videofilter.h"
|
#import "cocoa_videofilter.h"
|
||||||
#import "cocoa_util.h"
|
#import "cocoa_util.h"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue