diff --git a/app/src/main/cpp/MelonDSAndroidJNI.cpp b/app/src/main/cpp/MelonDSAndroidJNI.cpp index 5e35426b..3d9aee9c 100644 --- a/app/src/main/cpp/MelonDSAndroidJNI.cpp +++ b/app/src/main/cpp/MelonDSAndroidJNI.cpp @@ -451,6 +451,17 @@ Java_me_magnum_melonds_MelonEmulator_setFastForwardEnabled(JNIEnv* env, jobject } } +JNIEXPORT void JNICALL +Java_me_magnum_melonds_MelonEmulator_setMicrophoneEnabled(JNIEnv* env, jobject thiz, jboolean enabled) +{ + if(enabled) + { + MelonDSAndroid::enableMic(); + } else { + MelonDSAndroid::disableMic(); + } +} + JNIEXPORT void JNICALL Java_me_magnum_melonds_MelonEmulator_updateEmulatorConfiguration(JNIEnv* env, jobject thiz, jobject emulatorConfiguration, jobject frameBuffer) { diff --git a/app/src/main/java/me/magnum/melonds/MelonEmulator.kt b/app/src/main/java/me/magnum/melonds/MelonEmulator.kt index afa6ccef..02c0147c 100644 --- a/app/src/main/java/me/magnum/melonds/MelonEmulator.kt +++ b/app/src/main/java/me/magnum/melonds/MelonEmulator.kt @@ -113,5 +113,7 @@ object MelonEmulator { external fun setFastForwardEnabled(enabled: Boolean) + external fun setMicrophoneEnabled(enabled: Boolean) + external fun updateEmulatorConfiguration(emulatorConfiguration: EmulatorConfiguration, frameBuffer: ByteBuffer) } \ No newline at end of file diff --git a/app/src/main/java/me/magnum/melonds/domain/model/ControllerConfiguration.kt b/app/src/main/java/me/magnum/melonds/domain/model/ControllerConfiguration.kt index 05c06b9a..427de066 100644 --- a/app/src/main/java/me/magnum/melonds/domain/model/ControllerConfiguration.kt +++ b/app/src/main/java/me/magnum/melonds/domain/model/ControllerConfiguration.kt @@ -20,6 +20,7 @@ class ControllerConfiguration(configList: List) { Input.HINGE, Input.PAUSE, Input.FAST_FORWARD, + Input.MICROPHONE, Input.RESET, Input.SWAP_SCREENS, Input.QUICK_SAVE, diff --git a/app/src/main/java/me/magnum/melonds/domain/model/Input.kt b/app/src/main/java/me/magnum/melonds/domain/model/Input.kt index f5bd2fad..afcca92f 100644 --- a/app/src/main/java/me/magnum/melonds/domain/model/Input.kt +++ b/app/src/main/java/me/magnum/melonds/domain/model/Input.kt @@ -26,6 +26,7 @@ enum class Input(val keyCode: Int) { HINGE(16 + 7), PAUSE(-1), FAST_FORWARD(-1), + MICROPHONE(-1), RESET(-1), TOGGLE_SOFT_INPUT(-1), SWAP_SCREENS(-1), diff --git a/app/src/main/java/me/magnum/melonds/domain/model/LayoutComponent.kt b/app/src/main/java/me/magnum/melonds/domain/model/LayoutComponent.kt index 4f9227bb..7040863e 100644 --- a/app/src/main/java/me/magnum/melonds/domain/model/LayoutComponent.kt +++ b/app/src/main/java/me/magnum/melonds/domain/model/LayoutComponent.kt @@ -17,7 +17,8 @@ enum class LayoutComponent { BUTTON_SWAP_SCREENS, BUTTON_QUICK_SAVE, BUTTON_QUICK_LOAD, - BUTTON_REWIND; + BUTTON_REWIND, + BUTTON_MICROPHONE_TOGGLE; fun isScreen(): Boolean { return this == TOP_SCREEN || this == BOTTOM_SCREEN diff --git a/app/src/main/java/me/magnum/melonds/impl/DefaultLayoutProvider.kt b/app/src/main/java/me/magnum/melonds/impl/DefaultLayoutProvider.kt index 48ea6b86..b2e5b722 100644 --- a/app/src/main/java/me/magnum/melonds/impl/DefaultLayoutProvider.kt +++ b/app/src/main/java/me/magnum/melonds/impl/DefaultLayoutProvider.kt @@ -60,9 +60,10 @@ class DefaultLayoutProvider(private val context: Context, private val screenUnit PositionedLayoutComponent(Rect(width - lrButtonsSize, screenHeight, lrButtonsSize, lrButtonsSize), LayoutComponent.BUTTON_R), PositionedLayoutComponent(Rect(width / 2 - smallButtonsSize - spacing4dp / 2, height - smallButtonsSize, smallButtonsSize, smallButtonsSize), LayoutComponent.BUTTON_SELECT), PositionedLayoutComponent(Rect(width / 2 + spacing4dp / 2, height - smallButtonsSize, smallButtonsSize, smallButtonsSize), LayoutComponent.BUTTON_START), - PositionedLayoutComponent(Rect(width / 2 - (smallButtonsSize * 1.5).toInt() - spacing4dp * 2, screenHeight, smallButtonsSize, smallButtonsSize), LayoutComponent.BUTTON_HINGE), - PositionedLayoutComponent(Rect(width / 2 - (smallButtonsSize * 0.5).toInt(), screenHeight, smallButtonsSize, smallButtonsSize), LayoutComponent.BUTTON_TOGGLE_SOFT_INPUT), - PositionedLayoutComponent(Rect(width / 2 + (smallButtonsSize * 0.5).toInt() + spacing4dp * 2, screenHeight, smallButtonsSize, smallButtonsSize), LayoutComponent.BUTTON_FAST_FORWARD_TOGGLE), + PositionedLayoutComponent(Rect(width / 2 - (smallButtonsSize * 2.0).toInt() - spacing4dp * 2, screenHeight, smallButtonsSize, smallButtonsSize), LayoutComponent.BUTTON_HINGE), + PositionedLayoutComponent(Rect(width / 2 - smallButtonsSize, screenHeight, smallButtonsSize, smallButtonsSize), LayoutComponent.BUTTON_TOGGLE_SOFT_INPUT), + PositionedLayoutComponent(Rect(width / 2 + spacing4dp * 2, screenHeight, smallButtonsSize, smallButtonsSize), LayoutComponent.BUTTON_FAST_FORWARD_TOGGLE), + PositionedLayoutComponent(Rect(width / 2 + smallButtonsSize + spacing4dp * 4, screenHeight, smallButtonsSize, smallButtonsSize), LayoutComponent.BUTTON_MICROPHONE_TOGGLE), ) ) } @@ -97,9 +98,10 @@ class DefaultLayoutProvider(private val context: Context, private val screenUnit PositionedLayoutComponent(Rect(width - lrButtonsSize, 0, lrButtonsSize, lrButtonsSize), LayoutComponent.BUTTON_R), PositionedLayoutComponent(Rect((width - spacing4dp) / 2 - smallButtonsSize, height - smallButtonsSize, smallButtonsSize, smallButtonsSize), LayoutComponent.BUTTON_SELECT), PositionedLayoutComponent(Rect((width + spacing4dp) / 2, height - smallButtonsSize, smallButtonsSize, smallButtonsSize), LayoutComponent.BUTTON_START), - PositionedLayoutComponent(Rect(width / 2 - (smallButtonsSize * 1.5).toInt() - spacing4dp * 2, 0, smallButtonsSize, smallButtonsSize), LayoutComponent.BUTTON_HINGE), - PositionedLayoutComponent(Rect(width / 2 - (smallButtonsSize * 0.5).toInt(), 0, smallButtonsSize, smallButtonsSize), LayoutComponent.BUTTON_TOGGLE_SOFT_INPUT), - PositionedLayoutComponent(Rect(width / 2 + (smallButtonsSize * 0.5).toInt() + spacing4dp * 2, 0, smallButtonsSize, smallButtonsSize), LayoutComponent.BUTTON_FAST_FORWARD_TOGGLE), + PositionedLayoutComponent(Rect(width / 2 - (smallButtonsSize * 2.0).toInt() - spacing4dp * 2, 0, smallButtonsSize, smallButtonsSize), LayoutComponent.BUTTON_HINGE), + PositionedLayoutComponent(Rect(width / 2 - smallButtonsSize, 0, smallButtonsSize, smallButtonsSize), LayoutComponent.BUTTON_TOGGLE_SOFT_INPUT), + PositionedLayoutComponent(Rect(width / 2 + spacing4dp * 2, 0, smallButtonsSize, smallButtonsSize), LayoutComponent.BUTTON_FAST_FORWARD_TOGGLE), + PositionedLayoutComponent(Rect(width / 2 + smallButtonsSize + spacing4dp * 4, 0, smallButtonsSize, smallButtonsSize), LayoutComponent.BUTTON_MICROPHONE_TOGGLE), ) ) } diff --git a/app/src/main/java/me/magnum/melonds/ui/common/componentbuilders/SingleButtonLayoutComponentViewBuilder.kt b/app/src/main/java/me/magnum/melonds/ui/common/componentbuilders/SingleButtonLayoutComponentViewBuilder.kt index 0bc1736b..e694e47d 100644 --- a/app/src/main/java/me/magnum/melonds/ui/common/componentbuilders/SingleButtonLayoutComponentViewBuilder.kt +++ b/app/src/main/java/me/magnum/melonds/ui/common/componentbuilders/SingleButtonLayoutComponentViewBuilder.kt @@ -31,6 +31,7 @@ class SingleButtonLayoutComponentViewBuilder(private val layoutComponent: Layout LayoutComponent.BUTTON_QUICK_SAVE -> R.drawable.button_quick_save LayoutComponent.BUTTON_QUICK_LOAD -> R.drawable.button_quick_load LayoutComponent.BUTTON_REWIND -> R.drawable.button_rewind + LayoutComponent.BUTTON_MICROPHONE_TOGGLE -> R.drawable.button_microphone else -> -1 } } diff --git a/app/src/main/java/me/magnum/melonds/ui/emulator/EmulatorActivity.kt b/app/src/main/java/me/magnum/melonds/ui/emulator/EmulatorActivity.kt index ce14c6a7..93e5bb27 100644 --- a/app/src/main/java/me/magnum/melonds/ui/emulator/EmulatorActivity.kt +++ b/app/src/main/java/me/magnum/melonds/ui/emulator/EmulatorActivity.kt @@ -149,6 +149,7 @@ class EmulatorActivity : AppCompatActivity() { private lateinit var nativeInputListener: INativeInputListener private val frontendInputHandler = object : FrontendInputHandler() { private var fastForwardEnabled = false + private var microphoneEnabled = true override fun onSoftInputTogglePressed() { binding.viewLayoutControls.toggleSoftInputVisibility() @@ -163,6 +164,11 @@ class EmulatorActivity : AppCompatActivity() { MelonEmulator.setFastForwardEnabled(fastForwardEnabled) } + override fun onMicrophonePressed() { + microphoneEnabled = !microphoneEnabled + MelonEmulator.setMicrophoneEnabled(microphoneEnabled) + } + override fun onResetPressed() { viewModel.resetEmulator() } diff --git a/app/src/main/java/me/magnum/melonds/ui/emulator/RuntimeLayoutView.kt b/app/src/main/java/me/magnum/melonds/ui/emulator/RuntimeLayoutView.kt index 46613e66..58624f7b 100644 --- a/app/src/main/java/me/magnum/melonds/ui/emulator/RuntimeLayoutView.kt +++ b/app/src/main/java/me/magnum/melonds/ui/emulator/RuntimeLayoutView.kt @@ -82,6 +82,7 @@ class RuntimeLayoutView(context: Context, attrs: AttributeSet?) : LayoutView(con getLayoutComponentView(LayoutComponent.BUTTON_RESET)?.view?.setOnTouchListener(SingleButtonInputHandler(it, Input.RESET, enableHapticFeedback, touchVibrator)) getLayoutComponentView(LayoutComponent.BUTTON_PAUSE)?.view?.setOnTouchListener(SingleButtonInputHandler(it, Input.PAUSE, enableHapticFeedback, touchVibrator)) getLayoutComponentView(LayoutComponent.BUTTON_FAST_FORWARD_TOGGLE)?.view?.setOnTouchListener(SingleButtonInputHandler(it, Input.FAST_FORWARD, enableHapticFeedback, touchVibrator)) + getLayoutComponentView(LayoutComponent.BUTTON_MICROPHONE_TOGGLE)?.view?.setOnTouchListener(SingleButtonInputHandler(it, Input.MICROPHONE, enableHapticFeedback, touchVibrator)) getLayoutComponentView(LayoutComponent.BUTTON_TOGGLE_SOFT_INPUT)?.view?.setOnTouchListener(SingleButtonInputHandler(it, Input.TOGGLE_SOFT_INPUT, enableHapticFeedback, touchVibrator)) getLayoutComponentView(LayoutComponent.BUTTON_SWAP_SCREENS)?.view?.setOnTouchListener(SingleButtonInputHandler(it, Input.SWAP_SCREENS, enableHapticFeedback, touchVibrator)) getLayoutComponentView(LayoutComponent.BUTTON_QUICK_SAVE)?.view?.setOnTouchListener(SingleButtonInputHandler(it, Input.QUICK_SAVE, enableHapticFeedback, touchVibrator)) diff --git a/app/src/main/java/me/magnum/melonds/ui/emulator/input/FrontendInputHandler.kt b/app/src/main/java/me/magnum/melonds/ui/emulator/input/FrontendInputHandler.kt index d13900c4..3b6229e2 100644 --- a/app/src/main/java/me/magnum/melonds/ui/emulator/input/FrontendInputHandler.kt +++ b/app/src/main/java/me/magnum/melonds/ui/emulator/input/FrontendInputHandler.kt @@ -8,6 +8,7 @@ abstract class FrontendInputHandler : IInputListener { when (key) { Input.PAUSE -> onPausePressed() Input.FAST_FORWARD -> onFastForwardPressed() + Input.MICROPHONE -> onMicrophonePressed() Input.TOGGLE_SOFT_INPUT -> onSoftInputTogglePressed() Input.RESET -> onResetPressed() Input.SWAP_SCREENS -> onSwapScreens() @@ -26,6 +27,7 @@ abstract class FrontendInputHandler : IInputListener { abstract fun onPausePressed() abstract fun onFastForwardPressed() + abstract fun onMicrophonePressed() abstract fun onSoftInputTogglePressed() abstract fun onResetPressed() abstract fun onSwapScreens() diff --git a/app/src/main/java/me/magnum/melonds/ui/inputsetup/InputSetupActivity.kt b/app/src/main/java/me/magnum/melonds/ui/inputsetup/InputSetupActivity.kt index e44e336e..94a2fe5d 100644 --- a/app/src/main/java/me/magnum/melonds/ui/inputsetup/InputSetupActivity.kt +++ b/app/src/main/java/me/magnum/melonds/ui/inputsetup/InputSetupActivity.kt @@ -38,6 +38,7 @@ class InputSetupActivity : AppCompatActivity() { Input.HINGE -> R.string.input_lid Input.PAUSE -> R.string.input_pause Input.FAST_FORWARD -> R.string.input_fast_forward + Input.MICROPHONE -> R.string.input_microphone Input.RESET -> R.string.input_reset Input.SWAP_SCREENS -> R.string.input_swap_screens Input.QUICK_SAVE -> R.string.input_quick_save diff --git a/app/src/main/java/me/magnum/melonds/utils/InputUtils.kt b/app/src/main/java/me/magnum/melonds/utils/InputUtils.kt index 0eef9693..bf010402 100644 --- a/app/src/main/java/me/magnum/melonds/utils/InputUtils.kt +++ b/app/src/main/java/me/magnum/melonds/utils/InputUtils.kt @@ -16,6 +16,7 @@ fun getLayoutComponentName(layoutComponent: LayoutComponent): Int { LayoutComponent.BUTTON_HINGE -> R.string.input_lid LayoutComponent.BUTTON_PAUSE -> R.string.input_pause LayoutComponent.BUTTON_FAST_FORWARD_TOGGLE -> R.string.input_fast_forward + LayoutComponent.BUTTON_MICROPHONE_TOGGLE -> R.string.input_microphone LayoutComponent.BUTTON_TOGGLE_SOFT_INPUT -> R.string.input_toggle_soft_input LayoutComponent.BUTTON_RESET -> R.string.reset LayoutComponent.BUTTON_SWAP_SCREENS -> R.string.input_swap_screens diff --git a/app/src/main/res/drawable/button_microphone.png b/app/src/main/res/drawable/button_microphone.png new file mode 100644 index 00000000..e642bd26 Binary files /dev/null and b/app/src/main/res/drawable/button_microphone.png differ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 56530f1b..1a06d95b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -281,6 +281,7 @@ Toggle Lid Pause Fast Forward (Toggle) + Toggle Microphone Toggle Soft Input @string/reset DPAD diff --git a/melonDS-android-lib b/melonDS-android-lib index 3960f469..5da5466b 160000 --- a/melonDS-android-lib +++ b/melonDS-android-lib @@ -1 +1 @@ -Subproject commit 3960f4699bd1030ba129ab9c79cd6235a7a1ddb1 +Subproject commit 5da5466b1012170e2f35feb2daf4703d4c3fc4c4