mirror of
https://github.com/tildearrow/furnace.git
synced 2024-11-15 01:05:06 +00:00
Merge branch 'master' of https://github.com/tildearrow/furnace into vgsound_emu_2_1_4
This commit is contained in:
commit
08b949529f
237 changed files with 2322 additions and 1868 deletions
1
.gitmodules
vendored
1
.gitmodules
vendored
|
@ -4,7 +4,6 @@
|
||||||
[submodule "extern/SDL"]
|
[submodule "extern/SDL"]
|
||||||
path = extern/SDL
|
path = extern/SDL
|
||||||
url = https://github.com/libsdl-org/SDL.git
|
url = https://github.com/libsdl-org/SDL.git
|
||||||
branch = 2.0.22
|
|
||||||
[submodule "extern/libsndfile"]
|
[submodule "extern/libsndfile"]
|
||||||
path = extern/libsndfile
|
path = extern/libsndfile
|
||||||
url = https://github.com/libsndfile/libsndfile.git
|
url = https://github.com/libsndfile/libsndfile.git
|
||||||
|
|
|
@ -526,6 +526,7 @@ src/engine/platform/zxbeeper.cpp
|
||||||
src/engine/platform/bubsyswsg.cpp
|
src/engine/platform/bubsyswsg.cpp
|
||||||
src/engine/platform/n163.cpp
|
src/engine/platform/n163.cpp
|
||||||
src/engine/platform/pet.cpp
|
src/engine/platform/pet.cpp
|
||||||
|
src/engine/platform/pokemini.cpp
|
||||||
src/engine/platform/pong.cpp
|
src/engine/platform/pong.cpp
|
||||||
src/engine/platform/vic20.cpp
|
src/engine/platform/vic20.cpp
|
||||||
src/engine/platform/vrc6.cpp
|
src/engine/platform/vrc6.cpp
|
||||||
|
@ -534,6 +535,7 @@ src/engine/platform/ymz280b.cpp
|
||||||
src/engine/platform/namcowsg.cpp
|
src/engine/platform/namcowsg.cpp
|
||||||
src/engine/platform/rf5c68.cpp
|
src/engine/platform/rf5c68.cpp
|
||||||
src/engine/platform/snes.cpp
|
src/engine/platform/snes.cpp
|
||||||
|
src/engine/platform/k007232.cpp
|
||||||
src/engine/platform/pcmdac.cpp
|
src/engine/platform/pcmdac.cpp
|
||||||
src/engine/platform/dummy.cpp
|
src/engine/platform/dummy.cpp
|
||||||
)
|
)
|
||||||
|
|
4
TODO.md
4
TODO.md
|
@ -2,7 +2,9 @@
|
||||||
|
|
||||||
- POKEY
|
- POKEY
|
||||||
- Pokémon Mini
|
- Pokémon Mini
|
||||||
|
- register layout
|
||||||
|
- confirm emulation
|
||||||
- (maybe) YM2612 CSM (no DualPCM)
|
- (maybe) YM2612 CSM (no DualPCM)
|
||||||
- port presets to new format
|
- port op macro code to all other OPN chips
|
||||||
- bug fixes
|
- bug fixes
|
||||||
- (maybe) advanced linear arpeggio? (run arp+slide simultaneously)
|
- (maybe) advanced linear arpeggio? (run arp+slide simultaneously)
|
||||||
|
|
|
@ -248,7 +248,9 @@ public class HIDDeviceManager {
|
||||||
0x1689, // Razer Onza
|
0x1689, // Razer Onza
|
||||||
0x1949, // Lab126, Inc.
|
0x1949, // Lab126, Inc.
|
||||||
0x1bad, // Harmonix
|
0x1bad, // Harmonix
|
||||||
|
0x20d6, // PowerA
|
||||||
0x24c6, // PowerA
|
0x24c6, // PowerA
|
||||||
|
0x2c22, // Qanba
|
||||||
};
|
};
|
||||||
|
|
||||||
if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_VENDOR_SPEC &&
|
if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_VENDOR_SPEC &&
|
||||||
|
@ -274,7 +276,9 @@ public class HIDDeviceManager {
|
||||||
0x0e6f, // PDP
|
0x0e6f, // PDP
|
||||||
0x0f0d, // Hori
|
0x0f0d, // Hori
|
||||||
0x1532, // Razer Wildcat
|
0x1532, // Razer Wildcat
|
||||||
|
0x20d6, // PowerA
|
||||||
0x24c6, // PowerA
|
0x24c6, // PowerA
|
||||||
|
0x2dc8, /* 8BitDo */
|
||||||
0x2e24, // Hyperkin
|
0x2e24, // Hyperkin
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,9 @@ import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
|
import android.text.Editable;
|
||||||
import android.text.InputType;
|
import android.text.InputType;
|
||||||
|
import android.text.Selection;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
|
@ -63,6 +65,112 @@ import java.util.Locale;
|
||||||
*/
|
*/
|
||||||
public class SDLActivity extends Activity implements View.OnSystemUiVisibilityChangeListener {
|
public class SDLActivity extends Activity implements View.OnSystemUiVisibilityChangeListener {
|
||||||
private static final String TAG = "SDL";
|
private static final String TAG = "SDL";
|
||||||
|
/*
|
||||||
|
// Display InputType.SOURCE/CLASS of events and devices
|
||||||
|
//
|
||||||
|
// SDLActivity.debugSource(device.getSources(), "device[" + device.getName() + "]");
|
||||||
|
// SDLActivity.debugSource(event.getSource(), "event");
|
||||||
|
public static void debugSource(int sources, String prefix) {
|
||||||
|
int s = sources;
|
||||||
|
int s_copy = sources;
|
||||||
|
String cls = "";
|
||||||
|
String src = "";
|
||||||
|
int tst = 0;
|
||||||
|
int FLAG_TAINTED = 0x80000000;
|
||||||
|
|
||||||
|
if ((s & InputDevice.SOURCE_CLASS_BUTTON) != 0) cls += " BUTTON";
|
||||||
|
if ((s & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) cls += " JOYSTICK";
|
||||||
|
if ((s & InputDevice.SOURCE_CLASS_POINTER) != 0) cls += " POINTER";
|
||||||
|
if ((s & InputDevice.SOURCE_CLASS_POSITION) != 0) cls += " POSITION";
|
||||||
|
if ((s & InputDevice.SOURCE_CLASS_TRACKBALL) != 0) cls += " TRACKBALL";
|
||||||
|
|
||||||
|
|
||||||
|
int s2 = s_copy & ~InputDevice.SOURCE_ANY; // keep class bits
|
||||||
|
s2 &= ~( InputDevice.SOURCE_CLASS_BUTTON
|
||||||
|
| InputDevice.SOURCE_CLASS_JOYSTICK
|
||||||
|
| InputDevice.SOURCE_CLASS_POINTER
|
||||||
|
| InputDevice.SOURCE_CLASS_POSITION
|
||||||
|
| InputDevice.SOURCE_CLASS_TRACKBALL);
|
||||||
|
|
||||||
|
if (s2 != 0) cls += "Some_Unkown";
|
||||||
|
|
||||||
|
s2 = s_copy & InputDevice.SOURCE_ANY; // keep source only, no class;
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
|
tst = InputDevice.SOURCE_BLUETOOTH_STYLUS;
|
||||||
|
if ((s & tst) == tst) src += " BLUETOOTH_STYLUS";
|
||||||
|
s2 &= ~tst;
|
||||||
|
}
|
||||||
|
|
||||||
|
tst = InputDevice.SOURCE_DPAD;
|
||||||
|
if ((s & tst) == tst) src += " DPAD";
|
||||||
|
s2 &= ~tst;
|
||||||
|
|
||||||
|
tst = InputDevice.SOURCE_GAMEPAD;
|
||||||
|
if ((s & tst) == tst) src += " GAMEPAD";
|
||||||
|
s2 &= ~tst;
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
|
tst = InputDevice.SOURCE_HDMI;
|
||||||
|
if ((s & tst) == tst) src += " HDMI";
|
||||||
|
s2 &= ~tst;
|
||||||
|
}
|
||||||
|
|
||||||
|
tst = InputDevice.SOURCE_JOYSTICK;
|
||||||
|
if ((s & tst) == tst) src += " JOYSTICK";
|
||||||
|
s2 &= ~tst;
|
||||||
|
|
||||||
|
tst = InputDevice.SOURCE_KEYBOARD;
|
||||||
|
if ((s & tst) == tst) src += " KEYBOARD";
|
||||||
|
s2 &= ~tst;
|
||||||
|
|
||||||
|
tst = InputDevice.SOURCE_MOUSE;
|
||||||
|
if ((s & tst) == tst) src += " MOUSE";
|
||||||
|
s2 &= ~tst;
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= 26) {
|
||||||
|
tst = InputDevice.SOURCE_MOUSE_RELATIVE;
|
||||||
|
if ((s & tst) == tst) src += " MOUSE_RELATIVE";
|
||||||
|
s2 &= ~tst;
|
||||||
|
|
||||||
|
tst = InputDevice.SOURCE_ROTARY_ENCODER;
|
||||||
|
if ((s & tst) == tst) src += " ROTARY_ENCODER";
|
||||||
|
s2 &= ~tst;
|
||||||
|
}
|
||||||
|
tst = InputDevice.SOURCE_STYLUS;
|
||||||
|
if ((s & tst) == tst) src += " STYLUS";
|
||||||
|
s2 &= ~tst;
|
||||||
|
|
||||||
|
tst = InputDevice.SOURCE_TOUCHPAD;
|
||||||
|
if ((s & tst) == tst) src += " TOUCHPAD";
|
||||||
|
s2 &= ~tst;
|
||||||
|
|
||||||
|
tst = InputDevice.SOURCE_TOUCHSCREEN;
|
||||||
|
if ((s & tst) == tst) src += " TOUCHSCREEN";
|
||||||
|
s2 &= ~tst;
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
|
||||||
|
tst = InputDevice.SOURCE_TOUCH_NAVIGATION;
|
||||||
|
if ((s & tst) == tst) src += " TOUCH_NAVIGATION";
|
||||||
|
s2 &= ~tst;
|
||||||
|
}
|
||||||
|
|
||||||
|
tst = InputDevice.SOURCE_TRACKBALL;
|
||||||
|
if ((s & tst) == tst) src += " TRACKBALL";
|
||||||
|
s2 &= ~tst;
|
||||||
|
|
||||||
|
tst = InputDevice.SOURCE_ANY;
|
||||||
|
if ((s & tst) == tst) src += " ANY";
|
||||||
|
s2 &= ~tst;
|
||||||
|
|
||||||
|
if (s == FLAG_TAINTED) src += " FLAG_TAINTED";
|
||||||
|
s2 &= ~FLAG_TAINTED;
|
||||||
|
|
||||||
|
if (s2 != 0) src += " Some_Unkown";
|
||||||
|
|
||||||
|
Log.v(TAG, prefix + "int=" + s_copy + " CLASS={" + cls + " } source(s):" + src);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
public static boolean mIsResumedCalled, mHasFocus;
|
public static boolean mIsResumedCalled, mHasFocus;
|
||||||
public static final boolean mHasMultiWindow = (Build.VERSION.SDK_INT >= 24);
|
public static final boolean mHasMultiWindow = (Build.VERSION.SDK_INT >= 24);
|
||||||
|
@ -1204,8 +1312,21 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
||||||
|
|
||||||
for (int id : ids) {
|
for (int id : ids) {
|
||||||
InputDevice device = InputDevice.getDevice(id);
|
InputDevice device = InputDevice.getDevice(id);
|
||||||
if (device != null && (device.getSources() & InputDevice.SOURCE_TOUCHSCREEN) == InputDevice.SOURCE_TOUCHSCREEN) {
|
/* Allow SOURCE_TOUCHSCREEN and also Virtual InputDevices because they can send TOUCHSCREEN events */
|
||||||
nativeAddTouch(device.getId(), device.getName());
|
if (device != null && ((device.getSources() & InputDevice.SOURCE_TOUCHSCREEN) == InputDevice.SOURCE_TOUCHSCREEN
|
||||||
|
|| device.isVirtual())) {
|
||||||
|
|
||||||
|
int touchDevId = device.getId();
|
||||||
|
/*
|
||||||
|
* Prevent id to be -1, since it's used in SDL internal for synthetic events
|
||||||
|
* Appears when using Android emulator, eg:
|
||||||
|
* adb shell input mouse tap 100 100
|
||||||
|
* adb shell input touchscreen tap 100 100
|
||||||
|
*/
|
||||||
|
if (touchDevId < 0) {
|
||||||
|
touchDevId -= 1;
|
||||||
|
}
|
||||||
|
nativeAddTouch(touchDevId, device.getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1895,7 +2016,7 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((source & InputDevice.SOURCE_KEYBOARD) != 0) {
|
if ((source & InputDevice.SOURCE_KEYBOARD) == InputDevice.SOURCE_KEYBOARD) {
|
||||||
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
||||||
if (SDLActivity.isTextInputEvent(event)) {
|
if (SDLActivity.isTextInputEvent(event)) {
|
||||||
SDLInputConnection.nativeCommitText(String.valueOf((char) event.getUnicodeChar()), 1);
|
SDLInputConnection.nativeCommitText(String.valueOf((char) event.getUnicodeChar()), 1);
|
||||||
|
@ -1908,7 +2029,7 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((source & InputDevice.SOURCE_MOUSE) != 0) {
|
if ((source & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) {
|
||||||
// on some devices key events are sent for mouse BUTTON_BACK/FORWARD presses
|
// on some devices key events are sent for mouse BUTTON_BACK/FORWARD presses
|
||||||
// they are ignored here because sending them as mouse input to SDL is messy
|
// they are ignored here because sending them as mouse input to SDL is messy
|
||||||
if ((keyCode == KeyEvent.KEYCODE_BACK) || (keyCode == KeyEvent.KEYCODE_FORWARD)) {
|
if ((keyCode == KeyEvent.KEYCODE_BACK) || (keyCode == KeyEvent.KEYCODE_FORWARD)) {
|
||||||
|
@ -2195,7 +2316,7 @@ class DummyEdit extends View implements View.OnKeyListener {
|
||||||
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
|
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
|
||||||
ic = new SDLInputConnection(this, true);
|
ic = new SDLInputConnection(this, true);
|
||||||
|
|
||||||
outAttrs.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
|
outAttrs.inputType = InputType.TYPE_CLASS_TEXT;
|
||||||
outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI
|
outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI
|
||||||
| EditorInfo.IME_FLAG_NO_FULLSCREEN /* API 11 */;
|
| EditorInfo.IME_FLAG_NO_FULLSCREEN /* API 11 */;
|
||||||
|
|
||||||
|
@ -2237,6 +2358,29 @@ class SDLInputConnection extends BaseInputConnection {
|
||||||
@Override
|
@Override
|
||||||
public boolean commitText(CharSequence text, int newCursorPosition) {
|
public boolean commitText(CharSequence text, int newCursorPosition) {
|
||||||
|
|
||||||
|
/* Generate backspaces for the text we're going to replace */
|
||||||
|
final Editable content = getEditable();
|
||||||
|
if (content != null) {
|
||||||
|
int a = getComposingSpanStart(content);
|
||||||
|
int b = getComposingSpanEnd(content);
|
||||||
|
if (a == -1 || b == -1) {
|
||||||
|
a = Selection.getSelectionStart(content);
|
||||||
|
b = Selection.getSelectionEnd(content);
|
||||||
|
}
|
||||||
|
if (a < 0) a = 0;
|
||||||
|
if (b < 0) b = 0;
|
||||||
|
if (b < a) {
|
||||||
|
int tmp = a;
|
||||||
|
a = b;
|
||||||
|
b = tmp;
|
||||||
|
}
|
||||||
|
int backspaces = (b - a);
|
||||||
|
|
||||||
|
for (int i = 0; i < backspaces; i++) {
|
||||||
|
nativeGenerateScancodeForUnichar('\b');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < text.length(); i++) {
|
for (int i = 0; i < text.length(); i++) {
|
||||||
char c = text.charAt(i);
|
char c = text.charAt(i);
|
||||||
if (c == '\n') {
|
if (c == '\n') {
|
||||||
|
@ -2271,14 +2415,11 @@ class SDLInputConnection extends BaseInputConnection {
|
||||||
// Workaround to capture backspace key. Ref: http://stackoverflow.com/questions/14560344/android-backspace-in-webview-baseinputconnection
|
// Workaround to capture backspace key. Ref: http://stackoverflow.com/questions/14560344/android-backspace-in-webview-baseinputconnection
|
||||||
// and https://bugzilla.libsdl.org/show_bug.cgi?id=2265
|
// and https://bugzilla.libsdl.org/show_bug.cgi?id=2265
|
||||||
if (beforeLength > 0 && afterLength == 0) {
|
if (beforeLength > 0 && afterLength == 0) {
|
||||||
boolean ret = true;
|
|
||||||
// backspace(s)
|
// backspace(s)
|
||||||
while (beforeLength-- > 0) {
|
while (beforeLength-- > 0) {
|
||||||
boolean ret_key = sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))
|
nativeGenerateScancodeForUnichar('\b');
|
||||||
&& sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));
|
|
||||||
ret = ret && ret_key;
|
|
||||||
}
|
}
|
||||||
return ret;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.deleteSurroundingText(beforeLength, afterLength);
|
return super.deleteSurroundingText(beforeLength, afterLength);
|
||||||
|
|
|
@ -255,7 +255,6 @@ class SDLJoystickHandler_API16 extends SDLJoystickHandler {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean handleMotionEvent(MotionEvent event) {
|
public boolean handleMotionEvent(MotionEvent event) {
|
||||||
if ((event.getSource() & InputDevice.SOURCE_JOYSTICK) != 0) {
|
|
||||||
int actionPointerIndex = event.getActionIndex();
|
int actionPointerIndex = event.getActionIndex();
|
||||||
int action = event.getActionMasked();
|
int action = event.getActionMasked();
|
||||||
if (action == MotionEvent.ACTION_MOVE) {
|
if (action == MotionEvent.ACTION_MOVE) {
|
||||||
|
@ -274,7 +273,6 @@ class SDLJoystickHandler_API16 extends SDLJoystickHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -562,8 +560,6 @@ class SDLGenericMotionListener_API12 implements View.OnGenericMotionListener {
|
||||||
|
|
||||||
switch ( event.getSource() ) {
|
switch ( event.getSource() ) {
|
||||||
case InputDevice.SOURCE_JOYSTICK:
|
case InputDevice.SOURCE_JOYSTICK:
|
||||||
case InputDevice.SOURCE_GAMEPAD:
|
|
||||||
case InputDevice.SOURCE_DPAD:
|
|
||||||
return SDLControllerManager.handleJoystickMotionEvent(event);
|
return SDLControllerManager.handleJoystickMotionEvent(event);
|
||||||
|
|
||||||
case InputDevice.SOURCE_MOUSE:
|
case InputDevice.SOURCE_MOUSE:
|
||||||
|
@ -693,8 +689,6 @@ class SDLGenericMotionListener_API26 extends SDLGenericMotionListener_API24 {
|
||||||
|
|
||||||
switch ( event.getSource() ) {
|
switch ( event.getSource() ) {
|
||||||
case InputDevice.SOURCE_JOYSTICK:
|
case InputDevice.SOURCE_JOYSTICK:
|
||||||
case InputDevice.SOURCE_GAMEPAD:
|
|
||||||
case InputDevice.SOURCE_DPAD:
|
|
||||||
return SDLControllerManager.handleJoystickMotionEvent(event);
|
return SDLControllerManager.handleJoystickMotionEvent(event);
|
||||||
|
|
||||||
case InputDevice.SOURCE_MOUSE:
|
case InputDevice.SOURCE_MOUSE:
|
||||||
|
|
|
@ -12,6 +12,8 @@ contact me or send a pull request if you want your song to be added to this coll
|
||||||
- big label music covers also are discouraged
|
- big label music covers also are discouraged
|
||||||
- low effort compositions/covers may not be accepted at all.
|
- low effort compositions/covers may not be accepted at all.
|
||||||
|
|
||||||
|
make sure to put your demo song under the respective category.
|
||||||
|
|
||||||
tildearrow also accepts demo songs in the .dmf format as well as the .fur format.
|
tildearrow also accepts demo songs in the .dmf format as well as the .fur format.
|
||||||
|
|
||||||
thank you for contributing!
|
thank you for contributing!
|
||||||
|
|
0
demos/snowdin.fur → demos/gameboy/snowdin.fur
Executable file → Normal file
0
demos/snowdin.fur → demos/gameboy/snowdin.fur
Executable file → Normal file
BIN
demos/misc/Dreamliner_FMTowns.fur
Normal file
BIN
demos/misc/Dreamliner_FMTowns.fur
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue