Android: FM sound support

This commit is contained in:
kichikuou
2020-11-29 18:27:46 +09:00
parent 07da17a00e
commit 04206abb77
3 changed files with 62 additions and 2 deletions
+2
View File
@@ -7,6 +7,8 @@ jobs:
steps:
- uses: actions/checkout@v2
with:
submodules: true
- name: Install Deps
run: sudo apt install ninja-build
+4 -1
View File
@@ -10,13 +10,16 @@ if (MSYS)
endif ()
if (ANDROID)
add_subdirectory(../deps/fmgen fmgen)
add_library(system3 SHARED)
target_sources(system3 PRIVATE
android/nact_android.cpp
android/mako.cpp
fm/makofm.cpp
fm/mako_fmgen.cpp
)
target_link_libraries(system3 PRIVATE SDL2 SDL2_ttf)
target_link_libraries(system3 PRIVATE SDL2 SDL2_ttf fmgen)
elseif (EMSCRIPTEN)
add_subdirectory(../deps/fmgen fmgen)
+56 -1
View File
@@ -2,10 +2,26 @@
#include <SDL.h>
#include <android/log.h>
#include "jnihelper.h"
#include "dri.h"
#include "mako.h"
#include "mako_midi.h"
#include "fm/mako_fmgen.h"
namespace {
SDL_mutex* fm_mutex;
std::unique_ptr<MakoFMgen> fm;
void audio_callback(void*, Uint8* stream, int len) {
SDL_LockMutex(fm_mutex);
fm->Process(reinterpret_cast<int16*>(stream), len/ 4);
SDL_UnlockMutex(fm_mutex);
}
} // namespace
MAKO::MAKO(NACT* parent, const MAKOConfig& config) :
use_fm(true), // TODO: make it switchable
current_music(0),
next_loop(0),
nact(parent)
@@ -13,9 +29,35 @@ MAKO::MAKO(NACT* parent, const MAKOConfig& config) :
strcpy(amus, "AMUS.DAT");
for (int i = 1; i <= 99; i++)
cd_track[i] = 0;
if (use_fm) {
SDL_InitSubSystem(SDL_INIT_AUDIO);
SDL_AudioSpec fmt;
SDL_zero(fmt);
fmt.freq = 44100;
fmt.format = AUDIO_S16;
fmt.channels = 2;
fmt.samples = 4096;
fmt.callback = &audio_callback;
if (SDL_OpenAudio(&fmt, NULL) < 0) {
WARNING("SDL_OpenAudio: %s", SDL_GetError());
SDL_QuitSubSystem(SDL_INIT_AUDIO);
use_fm = false;
return;
}
fm_mutex = SDL_CreateMutex();
}
}
MAKO::~MAKO() {}
MAKO::~MAKO() {
if (fm_mutex) {
SDL_LockMutex(fm_mutex);
SDL_PauseAudio(1);
SDL_UnlockMutex(fm_mutex);
SDL_DestroyMutex(fm_mutex);
fm_mutex = nullptr;
SDL_QuitSubSystem(SDL_INIT_AUDIO);
}
}
void MAKO::play_music(int page)
{
@@ -30,6 +72,17 @@ void MAKO::play_music(int page)
if (track) {
jmethodID mid = jni.GetMethodID("cddaStart", "(IZ)V");
jni.env()->CallVoidMethod(jni.context(), mid, track + 1, next_loop ? 0 : 1);
} else if (use_fm) {
DRI dri;
int size;
uint8* data = dri.load(amus, page, &size);
if (!data)
return;
SDL_LockMutex(fm_mutex);
fm = std::make_unique<MakoFMgen>(data, true);
SDL_UnlockMutex(fm_mutex);
SDL_PauseAudio(0);
} else {
auto midi = std::make_unique<MAKOMidi>(nact, amus);
if (!midi->load_mml(page)) {
@@ -79,6 +132,8 @@ void MAKO::stop_music()
jni.env()->CallVoidMethod(jni.context(), mid);
}
if (use_fm)
SDL_PauseAudio(1);
current_music = 0;
}