Android: Add support for PCM sound

Now android/mako.cpp depends on SDL_mixer, and CD-DA is also played with
SDL_mixer.
This commit is contained in:
kichikuou
2023-03-18 13:49:36 +09:00
parent 236eb0b581
commit 431be235d6
7 changed files with 166 additions and 138 deletions
@@ -44,7 +44,6 @@ class GameActivity : SDLActivity() {
}
private lateinit var gameRoot: File
private lateinit var cdda: CddaPlayer
private lateinit var prefs: SharedPreferences
private val midi = MidiPlayer()
private var useFM = true
@@ -52,7 +51,6 @@ class GameActivity : SDLActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
gameRoot = File(intent.getStringExtra(EXTRA_GAME_ROOT)!!)
cdda = CddaPlayer(File(gameRoot, Launcher.PLAYLIST_FILE))
prefs = getSharedPreferences("system3", Context.MODE_PRIVATE)
useFM = prefs.getBoolean(PREF_USE_FM, useFM)
registerForContextMenu(mLayout)
@@ -60,13 +58,11 @@ class GameActivity : SDLActivity() {
override fun onStop() {
super.onStop()
cdda.onActivityStop()
midi.onActivityStop()
}
override fun onResume() {
super.onResume()
cdda.onActivityResume()
midi.onActivityResume()
}
@@ -77,7 +73,8 @@ class GameActivity : SDLActivity() {
override fun getArguments(): Array<String> {
val args = arrayListOf(
"-gamedir", intent.getStringExtra(EXTRA_GAME_ROOT)!!,
"-savedir", intent.getStringExtra(EXTRA_SAVE_DIR)!! + "/@")
"-savedir", intent.getStringExtra(EXTRA_SAVE_DIR)!! + "/@",
"-playlist", Launcher.PLAYLIST_FILE)
if (useFM)
args.add("-fm")
return args.toTypedArray()
@@ -157,9 +154,6 @@ class GameActivity : SDLActivity() {
private external fun selectSynthesizer(use_fm: Boolean)
// The functions below are called in the SDL thread by JNI.
@Suppress("unused") fun cddaStart(track: Int, loop: Boolean) = cdda.start(track, loop)
@Suppress("unused") fun cddaStop() = cdda.stop()
@Suppress("unused") fun cddaCurrentPosition() = cdda.currentPosition()
@Suppress("unused") fun midiStart(path: String, loop: Boolean) = midi.start(path, loop)
@Suppress("unused") fun midiStop() = midi.stop()
@Suppress("unused") fun midiCurrentPosition() = midi.currentPosition()
@@ -183,73 +177,6 @@ class GameActivity : SDLActivity() {
}
}
private class CddaPlayer(private val playlistPath: File) {
private val playlist =
try {
playlistPath.readLines()
} catch (e: IOException) {
Log.e("loadPlaylist", "Cannot load $playlistPath", e)
emptyList()
}
private var currentTrack = 0
private val player = MediaPlayer()
private var playerPaused = false
init {
player.setOnCompletionListener { currentTrack = 0 }
}
fun start(track: Int, loop: Boolean) {
val f = playlist.elementAtOrNull(track - 1)
if (f.isNullOrEmpty()) {
Log.w("cddaStart", "No playlist entry for track $track")
return
}
Log.v("cddaStart", "$f Loop:$loop")
try {
player.apply {
reset()
setDataSource(File(playlistPath.parent, f).path)
isLooping = loop
prepare()
start()
}
currentTrack = track
} catch (e: IOException) {
Log.e("cddaStart", "Cannot play $f", e)
player.reset()
}
}
fun stop() {
if (currentTrack > 0 && player.isPlaying) {
player.stop()
currentTrack = 0
}
}
fun currentPosition(): Int {
if (currentTrack == 0)
return 0
val frames = player.currentPosition * 75 / 1000
return currentTrack or (frames shl 8)
}
fun onActivityStop() {
if (currentTrack > 0 && player.isPlaying) {
player.pause()
playerPaused = true
}
}
fun onActivityResume() {
if (playerPaused) {
player.start()
playerPaused = false
}
}
}
private class MidiPlayer {
private val player = MediaPlayer()
private var playing = false
@@ -12,6 +12,7 @@ class LicensesMenuActivity : Activity() {
Entry("system3-sdl2", "system3", "https://github.com/kichikuou/system3-sdl2"),
Entry("SDL", "SDL", "https://www.libsdl.org/"),
Entry("SDL_ttf", "SDL_ttf", "https://github.com/libsdl-org/SDL_ttf"),
Entry("SDL_mixer", "SDL_mixer", "https://github.com/libsdl-org/SDL_mixer"),
Entry("FreeType", "freetype", "https://freetype.org/"),
Entry("HarfBuzz", "harfbuzz", "https://harfbuzz.github.io/"),
Entry("ymfm", "ymfm", "https://github.com/aaronsgiles/ymfm"),