Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| dd86bd1ddb | |||
| 3e84bed561 | |||
| 40d3c1bc39 | |||
| 2041d3708f | |||
| 499bd380d4 | |||
| 73b13490bb | |||
| 19c0ed9ae3 | |||
| e4b9a66c9e | |||
| 6bf3cefc21 | |||
| 59a43f6e16 | |||
| 3b780e0fce | |||
| 1225c80616 | |||
| 6986850cc1 | |||
| c0e1f10371 | |||
| b964bf251f | |||
| 2a37738cbe | |||
| 1e49fd519e |
+1
-1
@@ -1,5 +1,5 @@
|
||||
# Xcode
|
||||
*/build/*
|
||||
build
|
||||
*/Build/*
|
||||
*.pbxuser
|
||||
!default.pbxuser
|
||||
|
||||
+4
-3
@@ -1,3 +1,4 @@
|
||||
[submodule "mame"]
|
||||
path = mame
|
||||
url = git@github.com:stuartcarnie/mame.git
|
||||
[submodule "deps/mame"]
|
||||
path = deps/mame
|
||||
url = https://github.com/stuartcarnie/mame.git
|
||||
branch = mame0209-headless
|
||||
|
||||
+15
-1
@@ -19,7 +19,7 @@
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>0.169.0</string>
|
||||
<string>0.215.0</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string>OEGameCoreController</string>
|
||||
<key>OEGameCoreClass</key>
|
||||
@@ -36,5 +36,19 @@
|
||||
<string>1</string>
|
||||
<key>SUFeedURL</key>
|
||||
<string>https://raw.github.com/OpenEmu/OpenEmu-Update/master/mame_appcast.xml</string>
|
||||
<key>OEGameCoreOptions</key>
|
||||
<dict>
|
||||
<key>openemu.system.arcade</key>
|
||||
<dict>
|
||||
<key>OEGameCoreRewindBufferSeconds</key>
|
||||
<integer>10</integer>
|
||||
<key>OEGameCoreRewindInterval</key>
|
||||
<integer>0</integer>
|
||||
<key>OEGameCoreSupportsDisplayModeChange</key>
|
||||
<true/>
|
||||
<key>OEGameCoreSupportsRewinding</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
+125
-127
@@ -3,7 +3,7 @@
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 46;
|
||||
objectVersion = 51;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXAggregateTarget section */
|
||||
@@ -22,15 +22,10 @@
|
||||
/* End PBXAggregateTarget section */
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
051A8EE71C55CCCB00AB4D95 /* libmame_x64.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 051A8EE61C55CCCB00AB4D95 /* libmame_x64.a */; };
|
||||
051A8EE91C55CCD300AB4D95 /* makefile in Sources */ = {isa = PBXBuildFile; fileRef = 051A8EE81C55CCD300AB4D95 /* makefile */; };
|
||||
051A8EEB1C55CD1400AB4D95 /* minidir.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 051A8EEA1C55CD1400AB4D95 /* minidir.cpp */; };
|
||||
05334A961C52AEEF0066D493 /* CoreMIDI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05334A951C52AEEF0066D493 /* CoreMIDI.framework */; };
|
||||
05334A991C52AF0E0066D493 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05334A981C52AF0E0066D493 /* CoreAudio.framework */; };
|
||||
8C3132F8177F667D0002D0B9 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C3132F7177F667D0002D0B9 /* OpenGL.framework */; };
|
||||
8CA9071017A83C08001591B7 /* osx_osd_interface.mm in Sources */ = {isa = PBXBuildFile; fileRef = D00DAE0B176E1E6900F58FBB /* osx_osd_interface.mm */; };
|
||||
0510AA1E2300825E002028C1 /* mamearcade_headless.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 0510AA1D2300825D002028C1 /* mamearcade_headless.dylib */; };
|
||||
0510AA1F23008294002028C1 /* mamearcade_headless.dylib in Embed Libraries */ = {isa = PBXBuildFile; fileRef = 0510AA1D2300825D002028C1 /* mamearcade_headless.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
|
||||
D00A068E1763763000C99008 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D00A068D1763763000C99008 /* Cocoa.framework */; };
|
||||
D00A06A617637E9100C99008 /* MAMEGameCore.mm in Sources */ = {isa = PBXBuildFile; fileRef = D00A06A517637E9100C99008 /* MAMEGameCore.mm */; };
|
||||
D00A06A617637E9100C99008 /* MAMEGameCore.m in Sources */ = {isa = PBXBuildFile; fileRef = D00A06A517637E9100C99008 /* MAMEGameCore.m */; };
|
||||
D0AADE31176382F900759E26 /* OpenEmuBase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AADE30176382F900759E26 /* OpenEmuBase.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
@@ -44,10 +39,28 @@
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
0510AA2023008294002028C1 /* Embed Libraries */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 10;
|
||||
files = (
|
||||
0510AA1F23008294002028C1 /* mamearcade_headless.dylib in Embed Libraries */,
|
||||
);
|
||||
name = "Embed Libraries";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
051A8EE61C55CCCB00AB4D95 /* libmame_x64.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libmame_x64.a; sourceTree = "<group>"; };
|
||||
051A8EE81C55CCD300AB4D95 /* makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = makefile; sourceTree = "<group>"; };
|
||||
051A8EEA1C55CD1400AB4D95 /* minidir.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidir.cpp; path = osd/minidir.cpp; sourceTree = "<group>"; };
|
||||
050B7E8823775A04000ECB19 /* driver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = driver.h; path = deps/mame/src/osd/headless/public/driver.h; sourceTree = "<group>"; };
|
||||
050B7E8923775A04000ECB19 /* oecommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = oecommon.h; path = deps/mame/src/osd/headless/public/oecommon.h; sourceTree = "<group>"; };
|
||||
050B7E8A23775A04000ECB19 /* options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = options.h; path = deps/mame/src/osd/headless/public/options.h; sourceTree = "<group>"; };
|
||||
050B7E8B23775A04000ECB19 /* headless.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = headless.h; path = deps/mame/src/osd/headless/public/headless.h; sourceTree = "<group>"; };
|
||||
0510AA1B230081F3002028C1 /* inputenum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = inputenum.h; path = deps/mame/src/osd/headless/public/inputenum.h; sourceTree = "<group>"; };
|
||||
0510AA1C230081F3002028C1 /* osd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = osd.h; path = deps/mame/src/osd/headless/public/osd.h; sourceTree = "<group>"; };
|
||||
0510AA1D2300825D002028C1 /* mamearcade_headless.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = mamearcade_headless.dylib; path = deps/mame/mamearcade_headless.dylib; sourceTree = "<group>"; };
|
||||
05334A951C52AEEF0066D493 /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
|
||||
05334A981C52AF0E0066D493 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
|
||||
8C3132F7177F667D0002D0B9 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; };
|
||||
@@ -56,10 +69,8 @@
|
||||
D00A06921763763000C99008 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
||||
D00A069F17637AB600C99008 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };
|
||||
D00A06A417637E9100C99008 /* MAMEGameCore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MAMEGameCore.h; sourceTree = "<group>"; };
|
||||
D00A06A517637E9100C99008 /* MAMEGameCore.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MAMEGameCore.mm; sourceTree = "<group>"; };
|
||||
D00A06A517637E9100C99008 /* MAMEGameCore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MAMEGameCore.m; sourceTree = "<group>"; };
|
||||
D00A06A717637EB500C99008 /* OEArcadeSystemResponderClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OEArcadeSystemResponderClient.h; path = ../OpenEmu/Arcade/OEArcadeSystemResponderClient.h; sourceTree = "<group>"; };
|
||||
D00DAE0A176E1E6900F58FBB /* osx_osd_interface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = osx_osd_interface.h; path = osd/osx_osd_interface.h; sourceTree = "<group>"; };
|
||||
D00DAE0B176E1E6900F58FBB /* osx_osd_interface.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = osx_osd_interface.mm; path = osd/osx_osd_interface.mm; sourceTree = "<group>"; };
|
||||
D0AADE2F176381FB00759E26 /* MAME_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MAME_Prefix.pch; sourceTree = "<group>"; };
|
||||
D0AADE30176382F900759E26 /* OpenEmuBase.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = OpenEmuBase.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0AADE331763838A00759E26 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
|
||||
@@ -71,11 +82,8 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
051A8EE71C55CCCB00AB4D95 /* libmame_x64.a in Frameworks */,
|
||||
05334A991C52AF0E0066D493 /* CoreAudio.framework in Frameworks */,
|
||||
05334A961C52AEEF0066D493 /* CoreMIDI.framework in Frameworks */,
|
||||
0510AA1E2300825E002028C1 /* mamearcade_headless.dylib in Frameworks */,
|
||||
D00A068E1763763000C99008 /* Cocoa.framework in Frameworks */,
|
||||
8C3132F8177F667D0002D0B9 /* OpenGL.framework in Frameworks */,
|
||||
D0AADE31176382F900759E26 /* OpenEmuBase.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@@ -83,20 +91,10 @@
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
051A8EE51C55CC7900AB4D95 /* lib */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
051A8EE81C55CCD300AB4D95 /* makefile */,
|
||||
051A8EE61C55CCCB00AB4D95 /* libmame_x64.a */,
|
||||
);
|
||||
path = lib;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D00A06811763762F00C99008 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D00A06A317637BDD00C99008 /* Classes */,
|
||||
051A8EE51C55CC7900AB4D95 /* lib */,
|
||||
D0AADE2E176381E900759E26 /* Other Sources */,
|
||||
D00A06931763763000C99008 /* Resources */,
|
||||
D00A068C1763763000C99008 /* Frameworks and Libraries */,
|
||||
@@ -115,6 +113,7 @@
|
||||
D00A068C1763763000C99008 /* Frameworks and Libraries */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
0510AA1D2300825D002028C1 /* mamearcade_headless.dylib */,
|
||||
D0AADE30176382F900759E26 /* OpenEmuBase.framework */,
|
||||
D00A068F1763763000C99008 /* Linked Frameworks */,
|
||||
D0AADE321763833600759E26 /* Other Frameworks */,
|
||||
@@ -147,7 +146,7 @@
|
||||
children = (
|
||||
D00A06A717637EB500C99008 /* OEArcadeSystemResponderClient.h */,
|
||||
D00A06A417637E9100C99008 /* MAMEGameCore.h */,
|
||||
D00A06A517637E9100C99008 /* MAMEGameCore.mm */,
|
||||
D00A06A517637E9100C99008 /* MAMEGameCore.m */,
|
||||
D0BA5A9517645D630033A910 /* osd */,
|
||||
);
|
||||
name = Classes;
|
||||
@@ -174,9 +173,12 @@
|
||||
D0BA5A9517645D630033A910 /* osd */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D00DAE0A176E1E6900F58FBB /* osx_osd_interface.h */,
|
||||
D00DAE0B176E1E6900F58FBB /* osx_osd_interface.mm */,
|
||||
051A8EEA1C55CD1400AB4D95 /* minidir.cpp */,
|
||||
050B7E8823775A04000ECB19 /* driver.h */,
|
||||
050B7E8B23775A04000ECB19 /* headless.h */,
|
||||
050B7E8923775A04000ECB19 /* oecommon.h */,
|
||||
050B7E8A23775A04000ECB19 /* options.h */,
|
||||
0510AA1B230081F3002028C1 /* inputenum.h */,
|
||||
0510AA1C230081F3002028C1 /* osd.h */,
|
||||
);
|
||||
name = osd;
|
||||
sourceTree = "<group>";
|
||||
@@ -191,6 +193,8 @@
|
||||
D00A06861763763000C99008 /* Sources */,
|
||||
D00A06871763763000C99008 /* Frameworks */,
|
||||
D00A06881763763000C99008 /* Resources */,
|
||||
0510AA2023008294002028C1 /* Embed Libraries */,
|
||||
0510AA2123008883002028C1 /* ShellScript */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@@ -207,14 +211,15 @@
|
||||
D00A06821763762F00C99008 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 0700;
|
||||
LastUpgradeCheck = 1100;
|
||||
ORGANIZATIONNAME = OpenEmu;
|
||||
};
|
||||
buildConfigurationList = D00A06851763762F00C99008 /* Build configuration list for PBXProject "MAME" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
compatibilityVersion = "Xcode 10.0";
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
English,
|
||||
en,
|
||||
);
|
||||
mainGroup = D00A06811763762F00C99008;
|
||||
@@ -239,6 +244,23 @@
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
0510AA2123008883002028C1 /* ShellScript */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputFileListPaths = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
outputFileListPaths = (
|
||||
);
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "install_name_tool -change mamearcade_headless.dylib @rpath/mamearcade_headless.dylib ${TARGET_BUILD_DIR}/${EXECUTABLE_PATH}\n";
|
||||
};
|
||||
D0AADE2D1763815000759E26 /* ShellScript */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
@@ -259,10 +281,7 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
051A8EEB1C55CD1400AB4D95 /* minidir.cpp in Sources */,
|
||||
D00A06A617637E9100C99008 /* MAMEGameCore.mm in Sources */,
|
||||
8CA9071017A83C08001591B7 /* osx_osd_interface.mm in Sources */,
|
||||
051A8EE91C55CCD300AB4D95 /* makefile in Sources */,
|
||||
D00A06A617637E9100C99008 /* MAMEGameCore.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -280,18 +299,38 @@
|
||||
D00A069A1763763000C99008 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
|
||||
CLANG_CXX_LIBRARY = "compiler-default";
|
||||
CLANG_DEBUG_INFORMATION_LEVEL = default;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = YES;
|
||||
DEAD_CODE_STRIPPING = NO;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = NO;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu89;
|
||||
GCC_INCREASE_PRECOMPILED_HEADER_SHARING = YES;
|
||||
GCC_INPUT_FILETYPE = sourcecode.cpp.cpp;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "";
|
||||
@@ -300,105 +339,69 @@
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_SYMBOLS_PRIVATE_EXTERN = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VALUE = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"\"$(SRCROOT)\"",
|
||||
"\"$(SRCROOT)/osd\"",
|
||||
"\"$(SRCROOT)/mame/src/osd\"",
|
||||
"\"$(SRCROOT)/mame/src/emu\"",
|
||||
"\"$(SRCROOT)/mame/src/lib/util\"",
|
||||
"\"$(SRCROOT)/mame/src/osd/modules/lib\"",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.11;
|
||||
OTHER_CFLAGS = (
|
||||
"-DMAME_DEBUG",
|
||||
"-DFLAC__NO_DLL",
|
||||
"-DNATIVE_DRC=drcbe_x64",
|
||||
"-D__DYNAMIC__",
|
||||
);
|
||||
OTHER_CPLUSPLUSFLAGS = (
|
||||
"$(OTHER_CFLAGS)",
|
||||
"-Woverloaded-virtual",
|
||||
);
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
|
||||
SDKROOT = macosx;
|
||||
USE_HEADERMAP = NO;
|
||||
WARNING_CFLAGS = (
|
||||
"-Wall",
|
||||
"-Wcast-align",
|
||||
"-Wundef",
|
||||
"-Wformat-security",
|
||||
"-Wwrite-strings",
|
||||
"-Wno-sign-compare",
|
||||
"-Wno-conversion",
|
||||
"-Wno-cast-align",
|
||||
"-Wno-tautological-compare",
|
||||
"-Wno-constant-logical-operand",
|
||||
"-Wno-shift-count-overflow",
|
||||
"-Wno-self-assign-field",
|
||||
"-Wno-unused-local-typedef",
|
||||
);
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
D00A069B1763763000C99008 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
|
||||
CLANG_CXX_LIBRARY = "compiler-default";
|
||||
CLANG_DEBUG_INFORMATION_LEVEL = default;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = YES;
|
||||
DEAD_CODE_STRIPPING = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = NO;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu89;
|
||||
GCC_INCREASE_PRECOMPILED_HEADER_SHARING = YES;
|
||||
GCC_INPUT_FILETYPE = sourcecode.cpp.cpp;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 3;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = "";
|
||||
GCC_SYMBOLS_PRIVATE_EXTERN = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VALUE = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"\"$(SRCROOT)\"",
|
||||
"\"$(SRCROOT)/osd\"",
|
||||
"\"$(SRCROOT)/mame/src/osd\"",
|
||||
"\"$(SRCROOT)/mame/src/emu\"",
|
||||
"\"$(SRCROOT)/mame/src/lib/util\"",
|
||||
"\"$(SRCROOT)/mame/src/osd/modules/lib\"",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.11;
|
||||
OTHER_CFLAGS = (
|
||||
"-DNDEBUG",
|
||||
"-DFLAC__NO_DLL",
|
||||
"-DNATIVE_DRC=drcbe_x64",
|
||||
"-fno-strict-aliasing",
|
||||
"-D__DYNAMIC__",
|
||||
);
|
||||
OTHER_CPLUSPLUSFLAGS = (
|
||||
"$(OTHER_CFLAGS)",
|
||||
"-Woverloaded-virtual",
|
||||
);
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
||||
PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO;
|
||||
SDKROOT = macosx;
|
||||
USE_HEADERMAP = NO;
|
||||
WARNING_CFLAGS = (
|
||||
"-Wall",
|
||||
"-Wcast-align",
|
||||
"-Wundef",
|
||||
"-Wformat-security",
|
||||
"-Wwrite-strings",
|
||||
"-Wno-sign-compare",
|
||||
"-Wno-conversion",
|
||||
"-Wno-cast-align",
|
||||
"-Wno-tautological-compare",
|
||||
"-Wno-constant-logical-operand",
|
||||
"-Wno-shift-count-overflow",
|
||||
"-Wno-self-assign-field",
|
||||
"-Wno-unused-local-typedef",
|
||||
);
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
@@ -409,21 +412,18 @@
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
GCC_INPUT_FILETYPE = sourcecode.cpp.objcpp;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = NO;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"PTR64=1",
|
||||
"CRLF=2",
|
||||
LSB_FIRST,
|
||||
SDLMAME_DARWIN,
|
||||
"USE_OPENGL=1",
|
||||
"DEBUG=1",
|
||||
);
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"\"$(SRCROOT)/../OpenEmu/Arcade\"",
|
||||
"$(SRCROOT)/deps/mame/src/osd/headless/public",
|
||||
);
|
||||
INFOPLIST_FILE = Info.plist;
|
||||
INSTALL_PATH = "\"$(USER_LIBRARY_DIR)/Application Support/OpenEmu/Cores\"";
|
||||
LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/lib";
|
||||
LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/deps/mame",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "org.openemu.${PRODUCT_NAME:rfc1034identifier}";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SKIP_INSTALL = YES;
|
||||
@@ -438,20 +438,18 @@
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
GCC_INPUT_FILETYPE = sourcecode.cpp.objcpp;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = NO;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"PTR64=1",
|
||||
"CRLF=2",
|
||||
LSB_FIRST,
|
||||
SDLMAME_DARWIN,
|
||||
"USE_OPENGL=1",
|
||||
);
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"\"$(SRCROOT)/../OpenEmu/Arcade\"",
|
||||
"$(SRCROOT)/deps/mame/src/osd/headless/public",
|
||||
);
|
||||
INFOPLIST_FILE = Info.plist;
|
||||
INSTALL_PATH = "\"$(USER_LIBRARY_DIR)/Application Support/OpenEmu/Cores\"";
|
||||
LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/lib";
|
||||
LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/deps/mame",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "org.openemu.${PRODUCT_NAME:rfc1034identifier}";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SKIP_INSTALL = YES;
|
||||
|
||||
+2
-9
@@ -27,16 +27,9 @@
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#import <OpenEmuBase/OEGameCore.h>
|
||||
#import "OEArcadeSystemResponderClient.h"
|
||||
#import "osdcomm.h"
|
||||
|
||||
class running_machine;
|
||||
#import "osd.h"
|
||||
|
||||
OE_EXPORTED_CLASS
|
||||
@interface MAMEGameCore : OEGameCore
|
||||
|
||||
- (void)osd_init:(running_machine *)machine;
|
||||
- (void)osd_exit:(running_machine *)machine;
|
||||
- (void)osd_update:(bool)skip_redraw;
|
||||
- (void)osd_update_audio_stream:(const INT16 *)buffer samples:(int)samples_this_frame;
|
||||
@interface MAMEGameCore : OEGameCore<OSDDelegate>
|
||||
|
||||
@end
|
||||
|
||||
+527
@@ -0,0 +1,527 @@
|
||||
/*
|
||||
Copyright (c) 2013, OpenEmu Team
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the OpenEmu Team nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY OpenEmu Team ''AS IS'' AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL OpenEmu Team BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#import "MAMEGameCore.h"
|
||||
|
||||
#import <OpenEmuBase/OERingBuffer.h>
|
||||
#import <OpenGL/gl.h>
|
||||
#import <os/log.h>
|
||||
|
||||
@interface MAMEAuditResult: NSObject
|
||||
|
||||
/*! Returns the unique identifier of this result
|
||||
*
|
||||
* @remarks
|
||||
*
|
||||
* Identifier which groups resources by their driver, parent or CHD name
|
||||
*/
|
||||
@property (nonatomic, readonly) NSString *identifier;
|
||||
@property (nonatomic, readonly) NSString *fileName;
|
||||
|
||||
- (instancetype)initWithDriver:(NSString *)driver auditRecord:(AuditRecord *)record;
|
||||
- (BOOL)checkSetExistsInDir:(NSURL *)dir;
|
||||
|
||||
@end
|
||||
|
||||
@interface MAMEGameCore () <OEArcadeSystemResponderClient>
|
||||
{
|
||||
uint32_t _buttons[8][OEArcadeButtonCount];
|
||||
uint32_t _axes[8][InputMaxAxis];
|
||||
|
||||
uint32_t *_buffer;
|
||||
OEIntSize _bufferSize;
|
||||
OEIntRect _screenRect;
|
||||
OEIntSize _aspectSize;
|
||||
|
||||
NSTimeInterval _frameInterval;
|
||||
|
||||
|
||||
// dylib
|
||||
void *_handle;
|
||||
OSD *_osd;
|
||||
BOOL _supportsRewinding;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
static uint32_t joystick_get_state(void *device_internal, void *item_internal)
|
||||
{
|
||||
return *(uint32_t *)item_internal;
|
||||
}
|
||||
|
||||
static os_log_t OE_CORE_LOG, OE_CORE_AUDIT_LOG;
|
||||
|
||||
@implementation MAMEGameCore
|
||||
|
||||
#pragma mark - Lifecycle
|
||||
|
||||
+ (void)initialize
|
||||
{
|
||||
OE_CORE_LOG = os_log_create("org.openemu.MAME", "");
|
||||
OE_CORE_AUDIT_LOG = os_log_create("org.openemu.MAME", "audit");
|
||||
}
|
||||
|
||||
- (id)init
|
||||
{
|
||||
self = [super init];
|
||||
if(!self)
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
// Sensible defaults
|
||||
_bufferSize = OEIntSizeMake(1024, 1024);
|
||||
_frameInterval = 60;
|
||||
_screenRect = { {0,0}, _bufferSize };
|
||||
_aspectSize = { 4, 3 };
|
||||
|
||||
_osd = [OSD shared];
|
||||
_osd.delegate = self;
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
#pragma mark - OSDDelegate
|
||||
|
||||
- (void)didInitialize
|
||||
{
|
||||
// initialize joysticks
|
||||
for (int i = 0; i < 8; i++) {
|
||||
NSString *name = [NSString stringWithFormat:@"OpenEmu Player %d", i];
|
||||
InputDevice *dev = [_osd.joystick addDeviceNamed:name];
|
||||
[dev addItemNamed:@"X Axis" id:InputItemID_XAXIS getter:joystick_get_state context:&_axes[i][0]];
|
||||
[dev addItemNamed:@"Y Axis" id:InputItemID_YAXIS getter:joystick_get_state context:&_axes[i][1]];
|
||||
[dev addItemNamed:@"Start" id:InputItemID_START getter:joystick_get_state context:&_buttons[i][OEArcadeButtonP1Start]];
|
||||
[dev addItemNamed:@"Insert Coin" id:InputItemID_SELECT getter:joystick_get_state context:&_buttons[i][OEArcadeButtonInsertCoin]];
|
||||
[dev addItemNamed:@"Button 1" id:InputItemID_BUTTON1 getter:joystick_get_state context:&_buttons[i][OEArcadeButton1]];
|
||||
[dev addItemNamed:@"Button 2" id:InputItemID_BUTTON2 getter:joystick_get_state context:&_buttons[i][OEArcadeButton2]];
|
||||
[dev addItemNamed:@"Button 3" id:InputItemID_BUTTON3 getter:joystick_get_state context:&_buttons[i][OEArcadeButton3]];
|
||||
[dev addItemNamed:@"Button 4" id:InputItemID_BUTTON4 getter:joystick_get_state context:&_buttons[i][OEArcadeButton4]];
|
||||
[dev addItemNamed:@"Button 5" id:InputItemID_BUTTON5 getter:joystick_get_state context:&_buttons[i][OEArcadeButton5]];
|
||||
[dev addItemNamed:@"Button 6" id:InputItemID_BUTTON6 getter:joystick_get_state context:&_buttons[i][OEArcadeButton6]];
|
||||
}
|
||||
|
||||
// Special keys
|
||||
InputDevice *kb = [_osd.keyboard addDeviceNamed:@"OpenEmu Keyboard"];
|
||||
[kb addItemNamed:@"Service" id:InputItemID_F2 getter:joystick_get_state context:&_buttons[0][OEArcadeButtonService]];
|
||||
[kb addItemNamed:@"UI Configure" id:InputItemID_TAB getter:joystick_get_state context:&_buttons[0][OEArcadeUIConfigure]];
|
||||
}
|
||||
|
||||
- (void)didChangeDisplayBounds:(NSSize)bounds fps:(double)fps aspect:(NSSize)aspect
|
||||
{
|
||||
_screenRect = {{0, 0}, OEIntSizeMake(bounds.width, bounds.height)};
|
||||
|
||||
// for single screen games:
|
||||
BOOL singleScreen = YES;
|
||||
if (singleScreen)
|
||||
{
|
||||
CGFloat newHeight = (aspect.height / aspect.width) * bounds.width;
|
||||
_aspectSize = OEIntSizeMake(bounds.width, newHeight);
|
||||
}
|
||||
else
|
||||
{
|
||||
_aspectSize = OEIntSizeMake(bounds.width, bounds.height);
|
||||
}
|
||||
|
||||
_frameInterval = fps;
|
||||
}
|
||||
|
||||
- (void)updateAudioBuffer:(const int16_t *)buffer samples:(NSInteger)samples
|
||||
{
|
||||
id<OEAudioBuffer> buf = [self audioBufferAtIndex:0];
|
||||
[buf write:buffer maxLength:samples * 2 * sizeof(int16_t)];
|
||||
}
|
||||
|
||||
- (void)logLevel:(OSDLogLevel)level message:(NSString *)msg
|
||||
{
|
||||
switch (level) {
|
||||
case OSDLogLevelError:
|
||||
os_log_error(OE_CORE_LOG, "%{public}s", msg.UTF8String);
|
||||
break;
|
||||
|
||||
case OSDLogLevelVerbose:
|
||||
os_log_debug(OE_CORE_LOG, "%{public}s", msg.UTF8String);
|
||||
break;
|
||||
|
||||
default:
|
||||
os_log_info(OE_CORE_LOG, "%{public}s", msg.UTF8String);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Execution
|
||||
|
||||
- (BOOL)loadFileAtPath:(NSString *)path error:(NSError **)error
|
||||
{
|
||||
NSString *romDir = [path stringByDeletingLastPathComponent];
|
||||
Options *opts = _osd.options;
|
||||
[opts setBasePath:self.supportDirectoryPath];
|
||||
opts.romsPath = romDir;
|
||||
BOOL prev;
|
||||
prev = opts.autoStretchXY;
|
||||
opts.autoStretchXY = NO;
|
||||
prev = opts.unevenStretchX;
|
||||
opts.unevenStretchX = NO;
|
||||
prev = opts.unevenStretchY;
|
||||
opts.unevenStretchY = NO;
|
||||
prev = opts.unevenStretch;
|
||||
opts.unevenStretch = NO;
|
||||
opts.keepAspect = YES;
|
||||
|
||||
_osd.verboseOutput = NO; // TODO: debug only; remove later
|
||||
|
||||
NSString *rom = [[path lastPathComponent] stringByDeletingPathExtension];
|
||||
AuditResult *ar;
|
||||
BOOL success = [_osd loadGame:rom withAuditResult:&ar error:error];
|
||||
if (!success)
|
||||
{
|
||||
if (error != nil && ar != nil)
|
||||
{
|
||||
*error = [self processAuditResult:ar forRomDir:romDir];
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
_supportsRewinding = _osd.supportsSave && _osd.stateSize < 1e6;
|
||||
if (_osd.supportsSave && !_supportsRewinding)
|
||||
{
|
||||
os_log_info(OE_CORE_LOG, "disabling rewind support, save state size too big %{iec-bytes}ld", _osd.stateSize);
|
||||
}
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (NSError *)processAuditResult:(AuditResult *)ar forRomDir:(NSString *)romDir
|
||||
{
|
||||
NSString *gameDriverName = _osd.driverName;
|
||||
NSMutableOrderedSet<MAMEAuditResult *> *results = [NSMutableOrderedSet new];
|
||||
|
||||
for (AuditRecord *rec in ar.records) {
|
||||
|
||||
switch (rec.substatus) {
|
||||
case AuditSubstatusGood:
|
||||
continue;
|
||||
|
||||
case AuditSubstatusFoundNodump:
|
||||
case AuditSubstatusGoodNeedsRedump:
|
||||
case AuditSubstatusNotFoundNoDump:
|
||||
case AuditSubstatusNotFoundOptional:
|
||||
// acceptable conditions, based on audit.cpp:media_auditor::summarize method,
|
||||
// which all result in a BEST_AVAILABLE status
|
||||
continue;
|
||||
|
||||
// bad conditions
|
||||
|
||||
case AuditSubstatusFoundWrongLength: {
|
||||
os_log_debug(OE_CORE_AUDIT_LOG, "wrong length: %{public}@, media type %ld", rec.name, rec.mediaType);
|
||||
[results addObject:[[MAMEAuditResult alloc] initWithDriver:gameDriverName auditRecord:rec]];
|
||||
break;
|
||||
}
|
||||
|
||||
case AuditSubstatusFoundBadChecksum: {
|
||||
os_log_debug(OE_CORE_AUDIT_LOG, "bad checksum: %{public}@, media type %ld", rec.name, rec.mediaType);
|
||||
[results addObject:[[MAMEAuditResult alloc] initWithDriver:gameDriverName auditRecord:rec]];
|
||||
break;
|
||||
}
|
||||
|
||||
case AuditSubstatusNotFound: {
|
||||
os_log_debug(OE_CORE_AUDIT_LOG, "not found: %{public}@, media type %ld", rec.name, rec.mediaType);
|
||||
[results addObject:[[MAMEAuditResult alloc] initWithDriver:gameDriverName auditRecord:rec]];
|
||||
break;
|
||||
}
|
||||
|
||||
case AuditSubstatusUnverified:
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Sort missing files by ascending order
|
||||
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"self"
|
||||
ascending:YES];
|
||||
[results sortUsingDescriptors:@[sortDescriptor]];
|
||||
|
||||
// Determine if ROMs exist with missing files, or are not found
|
||||
NSURL *romDirURL = [NSURL fileURLWithPath:romDir isDirectory:YES];
|
||||
NSMutableString *missingFilesList = [NSMutableString string];
|
||||
for(MAMEAuditResult *result in results)
|
||||
{
|
||||
if ([result checkSetExistsInDir:romDirURL])
|
||||
{
|
||||
[missingFilesList appendString:[NSString stringWithFormat:@"%@ \t- INCORRECT SET\n", result.fileName]];
|
||||
}
|
||||
else
|
||||
{
|
||||
[missingFilesList appendString:[NSString stringWithFormat:@"%@ \t- NOT FOUND\n", result.fileName]];
|
||||
}
|
||||
}
|
||||
|
||||
// Give an audit report to the user
|
||||
NSString *game = [NSString stringWithFormat:@"%@ (%@.zip)", _osd.driverFullName, _osd.driverName];
|
||||
NSString *versionRequired = [[[[[self owner] bundle] infoDictionary] objectForKey:@"CFBundleVersion"] substringToIndex:5];
|
||||
|
||||
NSError *outErr = [NSError errorWithDomain:OEGameCoreErrorDomain code:OEGameCoreCouldNotLoadROMError userInfo:@{
|
||||
NSLocalizedDescriptionKey : @"Required files are missing.",
|
||||
NSLocalizedRecoverySuggestionErrorKey : [NSString stringWithFormat:@"%@ requires:\n\n%@\nThese ROMs must be from a MAME %@ ROM set. Some of these files can be parent/device/BIOS ROMs, which are not part of the game, but are still required. Delete files already imported and reimport with correct files.", game, missingFilesList, versionRequired],
|
||||
}];
|
||||
|
||||
return outErr;
|
||||
}
|
||||
|
||||
- (void)resetEmulation
|
||||
{
|
||||
[_osd scheduleHardReset];
|
||||
}
|
||||
|
||||
#pragma mark - Video
|
||||
|
||||
- (const void *)getVideoBufferWithHint:(void *)hint
|
||||
{
|
||||
_buffer = (uint32_t *)hint;
|
||||
[_osd setBuffer:hint size:NSSizeFromOEIntSize(_bufferSize)];
|
||||
return _buffer;
|
||||
}
|
||||
|
||||
- (OEIntSize)bufferSize
|
||||
{
|
||||
return _bufferSize;
|
||||
}
|
||||
|
||||
- (OEIntRect)screenRect {
|
||||
return _screenRect;
|
||||
}
|
||||
|
||||
- (OEIntSize)aspectSize
|
||||
{
|
||||
return _aspectSize;
|
||||
}
|
||||
|
||||
- (GLenum)pixelFormat
|
||||
{
|
||||
return GL_BGRA;
|
||||
}
|
||||
|
||||
- (GLenum)pixelType
|
||||
{
|
||||
return GL_UNSIGNED_INT_8_8_8_8_REV;
|
||||
}
|
||||
|
||||
#pragma mark - execution
|
||||
|
||||
- (void)executeFrame
|
||||
{
|
||||
[_osd execute];
|
||||
}
|
||||
|
||||
- (void)stopEmulation
|
||||
{
|
||||
[_osd unload];
|
||||
_osd.delegate = nil;
|
||||
[super stopEmulation];
|
||||
}
|
||||
|
||||
- (NSTimeInterval)frameInterval
|
||||
{
|
||||
return _frameInterval;
|
||||
}
|
||||
|
||||
#pragma mark - Audio
|
||||
|
||||
- (double)audioSampleRate
|
||||
{
|
||||
return 48000;
|
||||
}
|
||||
|
||||
- (NSUInteger)channelCount
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
#pragma mark - Input
|
||||
|
||||
- (void)setState:(BOOL)pressed ofButton:(OEArcadeButton)button forPlayer:(NSUInteger)player
|
||||
{
|
||||
_buttons[player-1][button] = pressed ? 1 : 0;
|
||||
_axes[player-1][0] = _buttons[player-1][OEArcadeButtonLeft] ? InputAbsoluteMin : (_buttons[player-1][OEArcadeButtonRight] ? InputAbsoluteMax : 0);
|
||||
_axes[player-1][1] = _buttons[player-1][OEArcadeButtonUp] ? InputAbsoluteMin : (_buttons[player-1][OEArcadeButtonDown] ? InputAbsoluteMax : 0);
|
||||
}
|
||||
|
||||
- (oneway void)didPushArcadeButton:(OEArcadeButton)button forPlayer:(NSUInteger)player
|
||||
{
|
||||
[self setState:YES ofButton:button forPlayer:player];
|
||||
}
|
||||
|
||||
- (oneway void)didReleaseArcadeButton:(OEArcadeButton)button forPlayer:(NSUInteger)player
|
||||
{
|
||||
[self setState:NO ofButton:button forPlayer:player];
|
||||
}
|
||||
|
||||
#pragma mark - Save State
|
||||
|
||||
- (void)saveStateToFileAtPath:(NSString *)fileName completionHandler:(void (^)(BOOL, NSError *))block
|
||||
{
|
||||
BOOL res = NO;
|
||||
NSError *err = nil;
|
||||
|
||||
if (_osd.supportsSave)
|
||||
{
|
||||
res = [_osd saveStateFromFileAtPath:fileName error:&err];
|
||||
}
|
||||
else
|
||||
{
|
||||
err = [NSError errorWithDomain:OEGameCoreErrorDomain code:OEGameCoreCouldNotSaveStateError userInfo:@{
|
||||
NSLocalizedDescriptionKey : [NSString stringWithFormat:@"Game \"%@\" does not not support save states.", _osd.driverFullName],
|
||||
}];
|
||||
}
|
||||
|
||||
block(res, err);
|
||||
}
|
||||
|
||||
- (void)loadStateFromFileAtPath:(NSString *)fileName completionHandler:(void (^)(BOOL, NSError *))block
|
||||
{
|
||||
BOOL res = NO;
|
||||
NSError *err = nil;
|
||||
|
||||
if (_osd.supportsSave)
|
||||
{
|
||||
res = [_osd loadStateFromFileAtPath:fileName error:&err];
|
||||
}
|
||||
else
|
||||
{
|
||||
err = [NSError errorWithDomain:OEGameCoreErrorDomain code:OEGameCoreCouldNotSaveStateError userInfo:@{
|
||||
NSLocalizedDescriptionKey : [NSString stringWithFormat:@"Game \"%@\" does not not support save states.", _osd.driverFullName],
|
||||
}];
|
||||
}
|
||||
|
||||
block(res, err);
|
||||
}
|
||||
|
||||
- (BOOL)supportsRewinding
|
||||
{
|
||||
return _supportsRewinding;
|
||||
}
|
||||
|
||||
- (NSData *)serializeStateWithError:(NSError *__autoreleasing *)outError
|
||||
{
|
||||
return [_osd serializeState];
|
||||
}
|
||||
|
||||
- (BOOL)deserializeState:(NSData *)state withError:(NSError *__autoreleasing *)outError
|
||||
{
|
||||
return [_osd deserializeState:state];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation MAMEAuditResult
|
||||
{
|
||||
NSString *_driver;
|
||||
AuditRecord *_record;
|
||||
}
|
||||
|
||||
- (instancetype)initWithDriver:(NSString *)driver auditRecord:(AuditRecord *)record
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
_driver = driver;
|
||||
_record = record;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSString *)identifier
|
||||
{
|
||||
if (_record.mediaType == AuditMediaTypeDisk)
|
||||
{
|
||||
// a CHD
|
||||
return _record.name;
|
||||
}
|
||||
|
||||
Device *parent = _record.sharedDevice;
|
||||
if (parent)
|
||||
{
|
||||
return parent.shortName;
|
||||
}
|
||||
|
||||
return _driver;
|
||||
}
|
||||
|
||||
- (NSArray<NSString *> *)extensions
|
||||
{
|
||||
if (_record.mediaType == AuditMediaTypeDisk)
|
||||
{
|
||||
return @[@".chd"];
|
||||
}
|
||||
|
||||
return @[@".zip", @".7z"];
|
||||
}
|
||||
|
||||
- (BOOL)isEqual:(id)object
|
||||
{
|
||||
if (object == nil || ![object isKindOfClass:self.class])
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
MAMEAuditResult *other = (MAMEAuditResult *)object;
|
||||
return self.identifier == other.identifier;
|
||||
}
|
||||
|
||||
- (NSComparisonResult)compare:(MAMEAuditResult *)other
|
||||
{
|
||||
return [self.identifier compare:other.identifier];
|
||||
}
|
||||
|
||||
/*! Returns the first valid file name for this result
|
||||
*/
|
||||
- (NSString *)fileName
|
||||
{
|
||||
return [self.identifier stringByAppendingString:[[self extensions] firstObject]];
|
||||
}
|
||||
|
||||
/*! Determines if the ROM set exists
|
||||
*/
|
||||
- (BOOL)checkSetExistsInDir:(NSURL *)dir
|
||||
{
|
||||
for (NSString *ext in [self extensions])
|
||||
{
|
||||
NSURL *missingFileURL = [dir URLByAppendingPathComponent:[self.identifier stringByAppendingString:ext]];
|
||||
|
||||
if([missingFileURL checkResourceIsReachableAndReturnError:nil])
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (NSUInteger)hash
|
||||
{
|
||||
return self.identifier.hash;
|
||||
}
|
||||
|
||||
@end
|
||||
-586
@@ -1,586 +0,0 @@
|
||||
/*
|
||||
Copyright (c) 2013, OpenEmu Team
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the OpenEmu Team nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY OpenEmu Team ''AS IS'' AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL OpenEmu Team BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#import "MAMEGameCore.h"
|
||||
|
||||
#import <OpenEmuBase/OERingBuffer.h>
|
||||
#import <OpenGL/gl.h>
|
||||
|
||||
#include "emu.h"
|
||||
#include "render.h"
|
||||
#include "emuopts.h"
|
||||
#include "audit.h"
|
||||
#include "mame.h"
|
||||
|
||||
#include "osx_osd_interface.h"
|
||||
|
||||
@interface MAMEGameCore () <OEArcadeSystemResponderClient>
|
||||
{
|
||||
running_machine *_machine;
|
||||
render_target *_target;
|
||||
INT32 _buttons[8][OEArcadeButtonCount];
|
||||
INT32 _axes[8][INPUT_MAX_AXIS];
|
||||
|
||||
dispatch_semaphore_t _renderEvent;
|
||||
dispatch_semaphore_t _exitEvent;
|
||||
|
||||
GLuint _texture;
|
||||
GLuint _textureWidth;
|
||||
GLuint _textureHeight;
|
||||
uint32_t *_buffer;
|
||||
|
||||
NSString *_romDir;
|
||||
NSString *_driverName;
|
||||
NSString *_stateDir;
|
||||
NSString *_stateFile;
|
||||
NSFileManager *_fileManager;
|
||||
|
||||
NSTimeInterval _frameInterval;
|
||||
OEIntSize _bufferSize;
|
||||
|
||||
BOOL _initializing;
|
||||
}
|
||||
|
||||
- (void)waitForSaveOrLoad;
|
||||
|
||||
@end
|
||||
|
||||
static void error_callback(const running_machine &machine, const char *string)
|
||||
{
|
||||
// NSLog(@"MAME: %s", string);
|
||||
}
|
||||
|
||||
static INT32 joystick_get_state(void *device_internal, void *item_internal)
|
||||
{
|
||||
return *(INT32 *)item_internal;
|
||||
}
|
||||
|
||||
@implementation MAMEGameCore
|
||||
|
||||
#pragma mark - Lifecycle
|
||||
|
||||
- (id)init
|
||||
{
|
||||
self = [super init];
|
||||
if(!self)
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
_initializing = YES;
|
||||
|
||||
_renderEvent = dispatch_semaphore_create(0);
|
||||
_exitEvent = dispatch_semaphore_create(0);
|
||||
|
||||
// Sensible defaults
|
||||
_bufferSize = OEIntSizeMake(640, 480);
|
||||
_frameInterval = 60;
|
||||
_fileManager = [NSFileManager new];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
_renderEvent = nil;
|
||||
_exitEvent = nil;
|
||||
|
||||
if(_buffer)
|
||||
{
|
||||
free(_buffer);
|
||||
_buffer = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)osd_init:(running_machine *)machine
|
||||
{
|
||||
_machine = machine;
|
||||
|
||||
_stateDir = [NSString pathWithComponents:@[NSTemporaryDirectory(), @"openemu", @"mame"]];
|
||||
NSString *basename = [NSString stringWithCString:_machine->basename() encoding:NSASCIIStringEncoding];
|
||||
_stateFile = [NSString pathWithComponents:@[_stateDir, basename, @"gamestate.sta"]];
|
||||
[_fileManager createDirectoryAtPath:[_stateFile stringByDeletingLastPathComponent]
|
||||
withIntermediateDirectories:YES
|
||||
attributes:nil
|
||||
error:nil];
|
||||
|
||||
std::string err;
|
||||
_machine->options().set_value(OPTION_STATE_DIRECTORY, [_stateDir UTF8String], OPTION_PRIORITY_HIGH, err);
|
||||
|
||||
_machine->add_logerror_callback(error_callback);
|
||||
_target = _machine->render().target_alloc();
|
||||
|
||||
_frameInterval = (NSTimeInterval) ATTOSECONDS_PER_SECOND / _machine->first_screen()->refresh_attoseconds();
|
||||
NSLog(@"Refresh rate set to %f Hz", _frameInterval);
|
||||
|
||||
INT32 width = 0, height = 0;
|
||||
_target->compute_minimum_size(width, height);
|
||||
if(width > 0 && height > 0) _bufferSize = OEIntSizeMake(width, height);
|
||||
_target->set_bounds(_bufferSize.width, _bufferSize.height);
|
||||
|
||||
// Add devices for 8 players
|
||||
for (int i = 0; i < 8; i++) {
|
||||
input_device *input = _machine->input().device_class(DEVICE_CLASS_JOYSTICK).add_device([[NSString stringWithFormat:@"OpenEmu Device %d", i] UTF8String], NULL);
|
||||
input->add_item("X Axis", ITEM_ID_XAXIS, joystick_get_state, &_axes[i][0]);
|
||||
input->add_item("Y Axis", ITEM_ID_YAXIS, joystick_get_state, &_axes[i][1]);
|
||||
input->add_item("Start", ITEM_ID_START, joystick_get_state, &_buttons[i][OEArcadeButtonP1Start]);
|
||||
input->add_item("Select", ITEM_ID_SELECT, joystick_get_state, &_buttons[i][OEArcadeButtonInsertCoin]);
|
||||
input->add_item("Button 1", ITEM_ID_BUTTON1, joystick_get_state, &_buttons[i][OEArcadeButton1]);
|
||||
input->add_item("Button 2", ITEM_ID_BUTTON2, joystick_get_state, &_buttons[i][OEArcadeButton2]);
|
||||
input->add_item("Button 3", ITEM_ID_BUTTON3, joystick_get_state, &_buttons[i][OEArcadeButton3]);
|
||||
input->add_item("Button 4", ITEM_ID_BUTTON4, joystick_get_state, &_buttons[i][OEArcadeButton4]);
|
||||
input->add_item("Button 5", ITEM_ID_BUTTON5, joystick_get_state, &_buttons[i][OEArcadeButton5]);
|
||||
input->add_item("Button 6", ITEM_ID_BUTTON6, joystick_get_state, &_buttons[i][OEArcadeButton6]);
|
||||
}
|
||||
|
||||
// Special keys
|
||||
input_device *inputKeys = _machine->input().device_class(DEVICE_CLASS_KEYBOARD).add_device("OpenEmu Keys", NULL);
|
||||
inputKeys->add_item("Service", ITEM_ID_F2, joystick_get_state, &_buttons[0][OEArcadeButtonService]);
|
||||
|
||||
_initializing = NO;
|
||||
}
|
||||
|
||||
- (void)osd_exit:(running_machine *)machine
|
||||
{
|
||||
NSParameterAssert(_machine == machine);
|
||||
|
||||
_machine->render().target_free(_target);
|
||||
_target = NULL;
|
||||
|
||||
_machine = NULL;
|
||||
|
||||
dispatch_semaphore_signal(_exitEvent);
|
||||
}
|
||||
|
||||
#pragma mark - Execution
|
||||
|
||||
- (BOOL)loadFileAtPath:(NSString *)path error:(NSError **)error
|
||||
{
|
||||
_romDir = [path stringByDeletingLastPathComponent];
|
||||
if(!_romDir) return NO;
|
||||
|
||||
// Need a better way to identify the ROM driver from the archive path
|
||||
|
||||
// The code below works by hashing the individual files and checking each
|
||||
// but takes *forever* and does not scale at O(n)
|
||||
//media_identifier ident(options);
|
||||
//ident.identify([path cStringUsingEncoding:NSUTF8StringEncoding]);
|
||||
//NSLog(@"I found this many matches: %i", ident.matches());
|
||||
|
||||
// The temporary solution is to take the file basename
|
||||
// Easily broken by misnamed ROM archives
|
||||
_driverName = [[path lastPathComponent] stringByDeletingPathExtension];
|
||||
|
||||
std::string err;
|
||||
emu_options options = emu_options();
|
||||
options.set_value(OPTION_MEDIAPATH, [_romDir UTF8String], OPTION_PRIORITY_HIGH, err);
|
||||
|
||||
game_driver driver;
|
||||
driver_enumerator drivlist(options, [_driverName UTF8String]);
|
||||
media_auditor auditor(drivlist);
|
||||
|
||||
BOOL verified = NO;
|
||||
while(drivlist.next() && !verified)
|
||||
{
|
||||
media_auditor::summary summary = auditor.audit_media(AUDIT_VALIDATE_FAST);
|
||||
if(summary == media_auditor::CORRECT || summary == media_auditor::BEST_AVAILABLE)
|
||||
{
|
||||
driver = drivlist.driver();
|
||||
verified = YES;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string *output = new std::string();
|
||||
auditor.summarize(drivlist.driver().name, output);
|
||||
NSString *message = [NSString stringWithCString:output->c_str() encoding:NSASCIIStringEncoding];
|
||||
delete output;
|
||||
NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: message };
|
||||
*error = [NSError errorWithDomain:OEGameCoreErrorDomain code:-1 userInfo:userInfo];
|
||||
}
|
||||
}
|
||||
|
||||
return verified;
|
||||
}
|
||||
|
||||
- (void)startEmulation
|
||||
{
|
||||
[super startEmulation];
|
||||
[NSThread detachNewThreadSelector:@selector(mameEmuThread) toTarget:self withObject:nil];
|
||||
}
|
||||
|
||||
- (void)stopEmulation
|
||||
{
|
||||
if(_machine != NULL) _machine->schedule_exit();
|
||||
|
||||
// Wait for MAME to shut down correctly
|
||||
dispatch_semaphore_wait(_exitEvent, dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC));
|
||||
|
||||
if(_texture)
|
||||
{
|
||||
glDeleteTextures(1, &_texture);
|
||||
_texture = 0;
|
||||
}
|
||||
|
||||
[super stopEmulation];
|
||||
}
|
||||
|
||||
- (void)setPauseEmulation:(BOOL)pauseEmulation
|
||||
{
|
||||
if(_machine != NULL)
|
||||
{
|
||||
if(pauseEmulation) _machine->pause();
|
||||
else _machine->resume();
|
||||
}
|
||||
|
||||
[super setPauseEmulation:pauseEmulation];
|
||||
}
|
||||
|
||||
- (void)resetEmulation
|
||||
{
|
||||
if(_machine != NULL) _machine->schedule_hard_reset();
|
||||
}
|
||||
|
||||
- (void)mameEmuThread
|
||||
{
|
||||
std::string err;
|
||||
|
||||
osd_options options = osd_options();
|
||||
options.set_value(OPTION_MEDIAPATH, [_romDir UTF8String], OPTION_PRIORITY_HIGH, err);
|
||||
options.set_value(OPTION_SAMPLEPATH,
|
||||
[[[self supportDirectoryPath] stringByAppendingPathComponent:@"samples"] UTF8String],
|
||||
OPTION_PRIORITY_HIGH, err);
|
||||
options.set_value(OPTION_CFG_DIRECTORY,
|
||||
[[[self supportDirectoryPath] stringByAppendingPathComponent:@"cfg"] UTF8String],
|
||||
OPTION_PRIORITY_HIGH, err);
|
||||
options.set_value(OPTION_NVRAM_DIRECTORY,
|
||||
[[[self supportDirectoryPath] stringByAppendingPathComponent:@"nvram"]UTF8String],
|
||||
OPTION_PRIORITY_HIGH, err);
|
||||
options.set_value(OPTION_INPUT_DIRECTORY,
|
||||
[[[self supportDirectoryPath] stringByAppendingPathComponent:@"inp"] UTF8String],
|
||||
OPTION_PRIORITY_HIGH, err);
|
||||
options.set_value(OPTION_DIFF_DIRECTORY,
|
||||
[[[self supportDirectoryPath] stringByAppendingPathComponent:@"diff"] UTF8String],
|
||||
OPTION_PRIORITY_HIGH, err);
|
||||
options.set_value(OPTION_COMMENT_DIRECTORY,
|
||||
[[[self supportDirectoryPath] stringByAppendingPathComponent:@"comments"] UTF8String],
|
||||
OPTION_PRIORITY_HIGH, err);
|
||||
|
||||
options.set_value(OPTION_SYSTEMNAME, [_driverName UTF8String], OPTION_PRIORITY_HIGH, err);
|
||||
options.set_value(OPTION_SAMPLERATE, (int)[self audioSampleRate], OPTION_PRIORITY_HIGH, err);
|
||||
options.set_value(OPTION_SKIP_GAMEINFO, true, OPTION_PRIORITY_HIGH, err);
|
||||
|
||||
#if 0
|
||||
options.set_value(OPTION_VERBOSE, true, OPTION_PRIORITY_HIGH, err);
|
||||
options.set_value(OPTION_LOG, true, OPTION_PRIORITY_HIGH, err);
|
||||
#endif
|
||||
|
||||
osx_osd_interface osd = osx_osd_interface(self, options);
|
||||
osd.register_options();
|
||||
|
||||
DLog(@"MAME: Starting game execution thread");
|
||||
|
||||
machine_manager *manager = machine_manager::instance(options, osd);
|
||||
manager->execute();
|
||||
global_free(manager);
|
||||
|
||||
DLog(@"MAME: Game execution thread exiting");
|
||||
}
|
||||
|
||||
#pragma mark - Video
|
||||
|
||||
- (OEGameCoreRendering)gameCoreRendering
|
||||
{
|
||||
return OEGameCoreRenderingOpenGL2Video;
|
||||
}
|
||||
|
||||
- (OEIntSize)bufferSize
|
||||
{
|
||||
return _bufferSize;
|
||||
}
|
||||
|
||||
- (OEIntSize)aspectSize
|
||||
{
|
||||
if(_machine != NULL)
|
||||
{
|
||||
switch(_machine->system().flags & ORIENTATION_MASK)
|
||||
{
|
||||
case ROT0:
|
||||
case ROT180:
|
||||
return OEIntSizeMake(4, 3);
|
||||
break;
|
||||
|
||||
case ROT90:
|
||||
case ROT270:
|
||||
return OEIntSizeMake(3, 4);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return OEIntSizeMake(4, 3);
|
||||
}
|
||||
|
||||
- (void)osd_update:(bool)skip_redraw
|
||||
{
|
||||
if (!skip_redraw && !_machine->save_or_load_pending())
|
||||
{
|
||||
dispatch_semaphore_wait(_renderEvent, dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC));
|
||||
}
|
||||
}
|
||||
|
||||
- (void)executeFrame
|
||||
{
|
||||
if(self.shouldSkipFrame || _target == NULL) return;
|
||||
|
||||
if(!_texture)
|
||||
{
|
||||
glEnable(GL_TEXTURE_RECTANGLE_EXT);
|
||||
glGenTextures(1, &_texture);
|
||||
}
|
||||
|
||||
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
glViewport(0.0, 0.0, (GLsizei)_bufferSize.width, (GLsizei)_bufferSize.height);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glOrtho(0.0, (GLdouble)_bufferSize.width, (GLdouble)_bufferSize.height, 0.0, 0.0, -1.0);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
|
||||
glEnableClientState(GL_VERTEX_ARRAY);
|
||||
|
||||
render_primitive_list &primitives = _target->get_primitives();
|
||||
primitives.acquire_lock();
|
||||
for(render_primitive *prim = primitives.first(); prim != NULL; prim = prim->next())
|
||||
{
|
||||
GLfloat color[4];
|
||||
color[0] = prim->color.r;
|
||||
color[1] = prim->color.g;
|
||||
color[2] = prim->color.b;
|
||||
color[3] = prim->color.a;
|
||||
|
||||
switch(PRIMFLAG_GET_BLENDMODE(prim->flags))
|
||||
{
|
||||
case BLENDMODE_NONE:
|
||||
glDisable(GL_BLEND);
|
||||
break;
|
||||
case BLENDMODE_ALPHA:
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
break;
|
||||
case BLENDMODE_RGB_MULTIPLY:
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_DST_COLOR, GL_ZERO);
|
||||
break;
|
||||
case BLENDMODE_ADD:
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if(prim->type == render_primitive::LINE)
|
||||
{
|
||||
GLfloat vertices[] = { prim->bounds.x0, prim->bounds.y0, prim->bounds.x1, prim->bounds.y1 };
|
||||
|
||||
glColor4fv(color);
|
||||
BOOL line = ((prim->bounds.x1 != prim->bounds.x0) || (prim->bounds.y1 != prim->bounds.y0));
|
||||
if(line) glLineWidth(prim->width);
|
||||
else glPointSize(prim->width);
|
||||
|
||||
glVertexPointer(2, GL_FLOAT, 0, vertices);
|
||||
if(line) glDrawArrays(GL_LINES, 0, 2);
|
||||
else glDrawArrays(GL_POINTS, 0, 1);
|
||||
}
|
||||
else if(prim->type == render_primitive::QUAD)
|
||||
{
|
||||
GLfloat vertices[] = { prim->bounds.x0, prim->bounds.y1,
|
||||
prim->bounds.x0, prim->bounds.y0,
|
||||
prim->bounds.x1, prim->bounds.y1,
|
||||
prim->bounds.x1, prim->bounds.y0 };
|
||||
glVertexPointer(2, GL_FLOAT, 0, vertices);
|
||||
|
||||
if(prim->texture.base == NULL)
|
||||
{
|
||||
glColor4fv(color);
|
||||
glLineWidth(1.0f);
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
}
|
||||
else
|
||||
{
|
||||
render_texinfo texinfo = prim->texture;
|
||||
unsigned int width = texinfo.width, height = texinfo.height, rowpixels = texinfo.rowpixels;
|
||||
|
||||
if(_buffer) { free(_buffer); _buffer = NULL; }
|
||||
|
||||
int texformat = PRIMFLAG_GET_TEXFORMAT(prim->flags);
|
||||
if(texformat == TEXFORMAT_PALETTE16 || texformat == TEXFORMAT_PALETTEA16)
|
||||
{
|
||||
uint32_t *bufferPointer = _buffer = (uint32_t *) malloc(width * height * sizeof(uint32_t));
|
||||
uint16_t *base = (uint16_t *)texinfo.base;
|
||||
for(int y = 0; y < height; ++y)
|
||||
{
|
||||
for(int x = 0; x < width; ++x)
|
||||
*bufferPointer++ = texinfo.palette[*base++];
|
||||
base += rowpixels - width;
|
||||
}
|
||||
|
||||
rowpixels = width;
|
||||
}
|
||||
|
||||
glEnable(GL_TEXTURE_RECTANGLE_EXT);
|
||||
glBindTexture(GL_TEXTURE_RECTANGLE_EXT, _texture);
|
||||
// Resize if the texture isn't big enough
|
||||
if(rowpixels > _textureWidth || height > _textureHeight)
|
||||
{
|
||||
_textureWidth = MAX(rowpixels, _textureWidth);
|
||||
_textureHeight = MAX(height, _textureHeight);
|
||||
|
||||
glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA8, _textureWidth, _textureHeight, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, _buffer ?: texinfo.base);
|
||||
}
|
||||
else
|
||||
glTexSubImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, _buffer ? width : rowpixels, height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, _buffer ?: texinfo.base);
|
||||
|
||||
GLfloat texCoords[] = { width * prim->texcoords.bl.u, height * prim->texcoords.bl.v,
|
||||
width * prim->texcoords.tl.u, height * prim->texcoords.tl.v,
|
||||
width * prim->texcoords.br.u, height * prim->texcoords.br.v,
|
||||
width * prim->texcoords.tr.u, height * prim->texcoords.tr.v };
|
||||
|
||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||
|
||||
glDisable(GL_TEXTURE_RECTANGLE_EXT);
|
||||
}
|
||||
}
|
||||
}
|
||||
glFlushRenderAPPLE();
|
||||
|
||||
primitives.release_lock();
|
||||
dispatch_semaphore_signal(_renderEvent);
|
||||
}
|
||||
|
||||
- (NSTimeInterval)frameInterval
|
||||
{
|
||||
return _frameInterval;
|
||||
}
|
||||
|
||||
#pragma mark - Audio
|
||||
|
||||
- (void)osd_update_audio_stream:(const INT16 *)buffer samples:(int)samples_this_frame
|
||||
{
|
||||
OERingBuffer *ringBuffer = [self ringBufferAtIndex:0];
|
||||
NSUInteger bytesPerSample = (self.audioBitDepth * self.channelCount) / 8;
|
||||
NSUInteger bytesToWrite = samples_this_frame * bytesPerSample;
|
||||
NSUInteger bytesAvailableToWrite = ringBuffer.availableBytes;
|
||||
|
||||
if(bytesToWrite > bytesAvailableToWrite)
|
||||
{
|
||||
NSLog(@"MAME: Audio buffer overflow");
|
||||
bytesToWrite = bytesAvailableToWrite;
|
||||
}
|
||||
|
||||
[ringBuffer write:buffer maxLength:bytesToWrite];
|
||||
}
|
||||
|
||||
- (double)audioSampleRate
|
||||
{
|
||||
return 48000;
|
||||
}
|
||||
|
||||
- (NSUInteger)channelCount
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
#pragma mark - Input
|
||||
|
||||
- (void)setState:(BOOL)pressed ofButton:(OEArcadeButton)button forPlayer:(NSUInteger)player
|
||||
{
|
||||
_buttons[player-1][button] = pressed ? 1 : 0;
|
||||
_axes[player-1][0] = _buttons[player-1][OEArcadeButtonLeft] ? INPUT_ABSOLUTE_MIN : (_buttons[player-1][OEArcadeButtonRight] ? INPUT_ABSOLUTE_MAX : 0);
|
||||
_axes[player-1][1] = _buttons[player-1][OEArcadeButtonUp] ? INPUT_ABSOLUTE_MIN : (_buttons[player-1][OEArcadeButtonDown] ? INPUT_ABSOLUTE_MAX : 0);
|
||||
}
|
||||
|
||||
- (oneway void)didPushArcadeButton:(OEArcadeButton)button forPlayer:(NSUInteger)player
|
||||
{
|
||||
[self setState:YES ofButton:button forPlayer:player];
|
||||
}
|
||||
|
||||
- (oneway void)didReleaseArcadeButton:(OEArcadeButton)button forPlayer:(NSUInteger)player
|
||||
{
|
||||
[self setState:NO ofButton:button forPlayer:player];
|
||||
}
|
||||
|
||||
#pragma mark - Save State
|
||||
|
||||
- (void)waitForSaveOrLoad {
|
||||
while (_machine->save_or_load_pending())
|
||||
{
|
||||
usleep(50 * 1000);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)saveStateToFileAtPath:(NSString *)fileName completionHandler:(void (^)(BOOL, NSError *))block
|
||||
{
|
||||
BOOL saved = NO;
|
||||
if(_machine != NULL && _machine->system().flags & MACHINE_SUPPORTS_SAVE)
|
||||
{
|
||||
_machine->schedule_save("gamestate");
|
||||
[self waitForSaveOrLoad];
|
||||
[_fileManager moveItemAtPath:_stateFile toPath:fileName error:nil];
|
||||
|
||||
saved = YES;
|
||||
}
|
||||
|
||||
block(saved, nil);
|
||||
}
|
||||
|
||||
- (void)loadStateFromFileAtPath:(NSString *)fileName completionHandler:(void (^)(BOOL, NSError *))block
|
||||
{
|
||||
// Wait until machine is initialized and ready to load a save state
|
||||
while(_initializing) usleep(100);
|
||||
|
||||
BOOL loaded = NO;
|
||||
if(_machine != NULL && _machine->system().flags & MACHINE_SUPPORTS_SAVE)
|
||||
{
|
||||
[_fileManager removeItemAtPath:_stateFile error:nil];
|
||||
[_fileManager copyItemAtPath:fileName toPath:_stateFile error:nil];
|
||||
_machine->schedule_load("gamestate");
|
||||
[self waitForSaveOrLoad];
|
||||
loaded = YES;
|
||||
}
|
||||
|
||||
block(loaded, nil);
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -6,22 +6,14 @@ OpenEmu Core plugin for UME
|
||||
Building
|
||||
--------
|
||||
|
||||
You must build the `libmame_x64.a` static library before building the MAME Game core, outlined in the following steps.
|
||||
You must build the `mamearcade_headless.dylib` dynamic library before building the MAME Game core:
|
||||
|
||||
**Step 1: Apply patch**
|
||||
```sh
|
||||
$ cd deps/mame
|
||||
$ make macosx_x64_clang OSD="headless" verbose=1 TARGETOS="macosx" CONFIG="headless-rel" TARGET=mame SUBTARGET=arcade -j8
|
||||
```
|
||||
|
||||
cd mame
|
||||
git apply ../lib/mame.patch
|
||||
Depending on your hardware, this could take a _long_ time, but if successful, you will have a file named `mamearcade_headless.dylib` in the current directory.
|
||||
|
||||
**Step 2: Build mame**
|
||||
|
||||
The following commands will build all the MAME object files. Ignore the final link error, which is only to build the executable – we don't use the midi support.
|
||||
|
||||
cd mame
|
||||
make -j 4 macosx_x64_clang SUBTARGET=arcade NOWERROR=1
|
||||
|
||||
**Step 3: Build libmame_x64.a**
|
||||
|
||||
cd ../lib
|
||||
make SUBTARGET=arcade
|
||||
Build the UME project, which will link and embed this binary and update the loader path automatically.
|
||||
|
||||
|
||||
+1
Submodule deps/mame added at 822ae8c825
@@ -1,60 +0,0 @@
|
||||
# makefile to build libmame.a and copy any public header files
|
||||
|
||||
TARGET := mame
|
||||
MAMEPATH := ../mame
|
||||
CONFIG := Release
|
||||
|
||||
ifndef SUBTARGET
|
||||
SUBTARGET := tiny
|
||||
endif
|
||||
|
||||
ifndef ARCHITECTURE
|
||||
ARCHITECTURE := x64
|
||||
endif
|
||||
|
||||
OUTPUT := libmame.a
|
||||
|
||||
OBJDIR := $(MAMEPATH)/build/osx_clang/obj/$(ARCHITECTURE)/$(CONFIG)
|
||||
OBJECTS := \
|
||||
$(OBJDIR)/src/mame/mame.o \
|
||||
$(OBJDIR)/src/version.o \
|
||||
$(OBJDIR)/generated/$(TARGET)/$(SUBTARGET)/drivlist.o
|
||||
|
||||
LIBDIR := $(MAMEPATH)/build/osx_clang/bin/$(ARCHITECTURE)/$(CONFIG)
|
||||
LIBS := \
|
||||
$(LIBDIR)/lib7z.a \
|
||||
$(LIBDIR)/libbgfx.a \
|
||||
$(LIBDIR)/libexpat.a \
|
||||
$(LIBDIR)/libflac.a \
|
||||
$(LIBDIR)/libformats.a \
|
||||
$(LIBDIR)/libgtest.a \
|
||||
$(LIBDIR)/libjpeg.a \
|
||||
$(LIBDIR)/liblsqlite3.a \
|
||||
$(LIBDIR)/liblua.a \
|
||||
$(LIBDIR)/libnetlist.a \
|
||||
$(LIBDIR)/libosd_osdmini.a \
|
||||
$(LIBDIR)/libportaudio.a \
|
||||
$(LIBDIR)/libportmidi.a \
|
||||
$(LIBDIR)/libqtdbg_osdmini.a \
|
||||
$(LIBDIR)/libsoftfloat.a \
|
||||
$(LIBDIR)/libsqllite3.a \
|
||||
$(LIBDIR)/libutils.a \
|
||||
$(LIBDIR)/libzlib.a \
|
||||
$(wildcard $(LIBDIR)/$(TARGET)_$(SUBTARGET)/*.a) \
|
||||
|
||||
$(info Generating $(OUTPUT) $(TARGET)_$(SUBTARGET)-$(ARCHITECTURE) using $(CONFIG) build)
|
||||
|
||||
libmame: libmame_$(ARCHITECTURE).a
|
||||
|
||||
libmame_$(ARCHITECTURE).a: libmain.a libocore_osdmimi_x.a $(LIBS)
|
||||
libtool -s -static -o libmame_$(ARCHITECTURE).a $?
|
||||
|
||||
libmain.a: $(OBJECTS)
|
||||
ar -rcs libmain.a $(OBJECTS)
|
||||
|
||||
libocore_osdmimi_x.a: $(LIBDIR)/libocore_osdmini.a
|
||||
ar -x $?
|
||||
rm minidir.o
|
||||
ar -rcs libocore_osdmimi_x.a *.o
|
||||
rm *.o "__.SYMDEF SORTED"
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
diff --git a/src/emu/ui/ui.cpp b/src/emu/ui/ui.cpp
|
||||
index 39eeb6e..f9f5711 100644
|
||||
--- a/src/emu/ui/ui.cpp
|
||||
+++ b/src/emu/ui/ui.cpp
|
||||
@@ -321,10 +321,10 @@ void ui_manager::display_startup_screens(bool first_time, bool show_disclaimer)
|
||||
if (!first_time || (str > 0 && str < 60*5) || &machine().system() == &GAME_NAME(___empty) || (machine().debug_flags & DEBUG_FLAG_ENABLED) != 0)
|
||||
show_gameinfo = show_warnings = show_disclaimer = show_mandatory_fileman = FALSE;
|
||||
|
||||
- #if defined(EMSCRIPTEN)
|
||||
+ //#if defined(EMSCRIPTEN)
|
||||
// also disable for the JavaScript port since the startup screens do not run asynchronously
|
||||
show_gameinfo = show_warnings = show_disclaimer = FALSE;
|
||||
- #endif
|
||||
+ //#endif
|
||||
|
||||
// loop over states
|
||||
set_handler(handler_ingame, 0);
|
||||
-1
Submodule mame deleted from 048fd105db
@@ -1,59 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Aaron Giles
|
||||
//============================================================
|
||||
//
|
||||
// minidir.c - Minimal core directory access functions
|
||||
//
|
||||
//============================================================
|
||||
|
||||
#include "osdcore.h"
|
||||
|
||||
|
||||
//============================================================
|
||||
// osd_opendir
|
||||
//============================================================
|
||||
|
||||
osd_directory *osd_opendir(const char *dirname)
|
||||
{
|
||||
// since there are no standard C library routines for walking directories,
|
||||
// we always return an error here
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
//============================================================
|
||||
// osd_readdir
|
||||
//============================================================
|
||||
|
||||
const osd_directory_entry *osd_readdir(osd_directory *dir)
|
||||
{
|
||||
// since there are no standard C library routines for walking directories,
|
||||
// we always return an error here
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
//============================================================
|
||||
// osd_closedir
|
||||
//============================================================
|
||||
|
||||
void osd_closedir(osd_directory *dir)
|
||||
{
|
||||
// since there are no standard C library routines for walking directories,
|
||||
// we do nothing
|
||||
}
|
||||
|
||||
int osd_is_absolute_path(const char *path)
|
||||
{
|
||||
int result;
|
||||
|
||||
if (path[0] == '/')
|
||||
result = TRUE;
|
||||
else if (path[0] == '.')
|
||||
result = TRUE;
|
||||
else
|
||||
result = FALSE;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
Copyright (c) 2013, OpenEmu Team
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the OpenEmu Team nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY OpenEmu Team ''AS IS'' AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL OpenEmu Team BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "osdobj_common.h"
|
||||
|
||||
@class MAMEGameCore;
|
||||
|
||||
class osx_osd_interface : public osd_common_t
|
||||
{
|
||||
public:
|
||||
osx_osd_interface(MAMEGameCore *, osd_options &options);
|
||||
MAMEGameCore *core() const { return m_core; }
|
||||
void init(running_machine &machine);
|
||||
void update(bool skip_redraw);
|
||||
void update_audio_stream(const INT16 *buffer, int samples_this_frame);
|
||||
void osd_exit();
|
||||
private:
|
||||
MAMEGameCore *m_core;
|
||||
};
|
||||
@@ -1,59 +0,0 @@
|
||||
/*
|
||||
Copyright (c) 2013, 2016 OpenEmu Team
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the OpenEmu Team nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY OpenEmu Team ''AS IS'' AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL OpenEmu Team BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#import "MAMEGameCore.h"
|
||||
|
||||
#include "osx_osd_interface.h"
|
||||
|
||||
osx_osd_interface::osx_osd_interface(MAMEGameCore *core, osd_options &options)
|
||||
:osd_common_t(options), m_core(core)
|
||||
{
|
||||
}
|
||||
|
||||
void osx_osd_interface::init(running_machine &machine)
|
||||
{
|
||||
osd_common_t::init(machine);
|
||||
osd_common_t::init_subsystems();
|
||||
[m_core osd_init:&machine];
|
||||
|
||||
}
|
||||
|
||||
void osx_osd_interface::update(bool skip_redraw)
|
||||
{
|
||||
[m_core osd_update:skip_redraw];
|
||||
}
|
||||
|
||||
void osx_osd_interface::update_audio_stream(const INT16 *buffer, int samples_this_frame)
|
||||
{
|
||||
[m_core osd_update_audio_stream:buffer samples:samples_this_frame];
|
||||
}
|
||||
|
||||
void osx_osd_interface::osd_exit()
|
||||
{
|
||||
[m_core osd_exit:&machine()];
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user