almost working
crashes - need to figure out jni thread crap
This commit is contained in:
parent
babaf41482
commit
18e5bd7c95
|
@ -5,6 +5,7 @@
|
|||
#include "maple_cfg.h"
|
||||
#include <time.h>
|
||||
#include <android/log.h>
|
||||
#include <jni.h>
|
||||
|
||||
#include "deps/zlib/zlib.h"
|
||||
|
||||
|
@ -664,6 +665,8 @@ struct maple_microphone: maple_base
|
|||
{
|
||||
case MDC_DeviceRequest:
|
||||
LOGD("maple_microphone::dma MDC_DeviceRequest");
|
||||
//this was copied from the controller case with just the id and name replaced!
|
||||
|
||||
//caps
|
||||
//4
|
||||
w32(MFID_4_Mic);
|
||||
|
@ -694,9 +697,10 @@ struct maple_microphone: maple_base
|
|||
|
||||
return MDRS_DeviceStatus;
|
||||
|
||||
//controller condition
|
||||
case MDCF_GetCondition:
|
||||
{
|
||||
//this was copied from the controller case with just the id replaced!
|
||||
|
||||
//PlainJoystickState pjs;
|
||||
//config->GetInput(&pjs);
|
||||
//caps
|
||||
|
@ -738,8 +742,8 @@ struct maple_microphone: maple_base
|
|||
{
|
||||
//MONEY
|
||||
u32 function=r32();
|
||||
LOGD("maple_microphone::dma MDCF_MICControl function (1st word) %#010x\n", function);
|
||||
LOGD("maple_microphone::dma MDCF_MICControl words: %d\n", dma_count_in);
|
||||
//LOGD("maple_microphone::dma MDCF_MICControl function (1st word) %#010x\n", function);
|
||||
//LOGD("maple_microphone::dma MDCF_MICControl words: %d\n", dma_count_in);
|
||||
|
||||
switch(function)
|
||||
{
|
||||
|
@ -759,25 +763,32 @@ struct maple_microphone: maple_base
|
|||
*
|
||||
*/
|
||||
u32 subcommand=r32();
|
||||
LOGD("maple_microphone::dma MDCF_MICControl subcommand (2nd word) %#010x\n", subcommand);
|
||||
//u32 cmd = (number >> (8*n)) & 0xff
|
||||
u32 cmd = subcommand & 0xFF;
|
||||
//LOGD("maple_microphone::dma MDCF_MICControl subcommand (2nd word) %#010x\n", subcommand);
|
||||
|
||||
LOGD("maple_microphone::dma MDCF_MICControl (3rd word) %#010x\n", r32());
|
||||
LOGD("maple_microphone::dma MDCF_MICControl (4th word) %#010x\n", r32());
|
||||
u32 cmd = subcommand & 0xFF; //just get last byte for now, deal with params later
|
||||
|
||||
//LOGD("maple_microphone::dma MDCF_MICControl (3rd word) %#010x\n", r32());
|
||||
//LOGD("maple_microphone::dma MDCF_MICControl (4th word) %#010x\n", r32());
|
||||
switch(cmd)
|
||||
{
|
||||
case 0x01:
|
||||
{
|
||||
LOGD("maple_microphone::dma MDCF_MICControl someone wants some data!");
|
||||
//maximum size of a Maple Bus packet is 256 words (1024 bytes)
|
||||
//maybe i should start with 512 (same as vmu)
|
||||
u8* micdata=(u8*)malloc(512);
|
||||
get_mic_data(micdata); //this is crashing (jni issue)
|
||||
wptr(micdata, 512);
|
||||
|
||||
return MDRS_DataTransfer;
|
||||
break;
|
||||
}
|
||||
case 0x02:
|
||||
LOGD("maple_microphone::dma MDCF_MICControl toggle recording!");
|
||||
//this is where i should start recording...
|
||||
|
||||
return MDRS_DeviceReply;
|
||||
break;
|
||||
case 0x03:
|
||||
return MDRS_DeviceReply;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -29,3 +29,4 @@ struct maple_device
|
|||
};
|
||||
|
||||
maple_device* maple_Create(MapleDeviceType type);
|
||||
void get_mic_data(u8* buffer);
|
||||
|
|
|
@ -10,9 +10,11 @@
|
|||
<uses-permission android:name="android.permission.VIBRATE" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
||||
|
||||
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
|
||||
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
|
||||
<uses-feature android:name="android.hardware.microphone" android:required="false"/>
|
||||
|
||||
<application
|
||||
android:hardwareAccelerated="true"
|
||||
|
|
|
@ -35,8 +35,13 @@ extern "C"
|
|||
//JNIEXPORT jint JNICALL Java_com_reicast_emulator_JNIdc_play(JNIEnv *env,jobject obj,jshortArray result,jint size);
|
||||
|
||||
JNIEXPORT void JNICALL Java_com_reicast_emulator_JNIdc_initControllers(JNIEnv *env, jobject obj, jbooleanArray controllers) __attribute__((visibility("default")));
|
||||
|
||||
JNIEXPORT void JNICALL Java_com_reicast_emulator_JNIdc_setupMic(JNIEnv *env,jobject obj,jobject sip) __attribute__((visibility("default")));
|
||||
};
|
||||
|
||||
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, "Android.cpp JNI wtf", __VA_ARGS__)
|
||||
|
||||
|
||||
void egl_stealcntx();
|
||||
void SetApplicationPath(wchar *path);
|
||||
int dc_init(int argc,wchar* argv[]);
|
||||
|
@ -191,6 +196,9 @@ jshortArray jsamples;
|
|||
jmethodID writemid;
|
||||
jobject track;
|
||||
|
||||
jobject sipemu;
|
||||
jmethodID getmicdata;
|
||||
|
||||
JNIEXPORT void JNICALL Java_com_reicast_emulator_JNIdc_run(JNIEnv *env,jobject obj,jobject trk)
|
||||
{
|
||||
install_prof_handler(0);
|
||||
|
@ -204,6 +212,13 @@ JNIEXPORT void JNICALL Java_com_reicast_emulator_JNIdc_run(JNIEnv *env,jobject o
|
|||
dc_run();
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_com_reicast_emulator_JNIdc_setupMic(JNIEnv *env,jobject obj,jobject sip)
|
||||
{
|
||||
sipemu = sip;
|
||||
getmicdata = env->GetMethodID(env->GetObjectClass(sipemu),"getData","()[B");
|
||||
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_com_reicast_emulator_JNIdc_stop(JNIEnv *env,jobject obj)
|
||||
{
|
||||
dc_term();
|
||||
|
@ -330,3 +345,12 @@ bool os_IsAudioBuffered()
|
|||
{
|
||||
return jenv->CallIntMethod(track,writemid,jsamples,-1)==0;
|
||||
}
|
||||
|
||||
void get_mic_data(u8* buffer)
|
||||
{
|
||||
LOGD("get_mic_data called");
|
||||
jbyteArray jdata = (jbyteArray)jenv->CallObjectMethod(sipemu,getmicdata);
|
||||
LOGD("CallObjectMethod happened");
|
||||
jenv->GetByteArrayRegion(jdata, 0, 512, (jbyte*)buffer);
|
||||
LOGD("GetByteArrayRegion happened");
|
||||
}
|
||||
|
|
|
@ -325,6 +325,13 @@ public class GL2JNIActivity extends Activity {
|
|||
|
||||
Toast.makeText(getApplicationContext(),
|
||||
"Press the back button for a menu", Toast.LENGTH_SHORT).show();
|
||||
|
||||
|
||||
//totally hijacking this to setup mic
|
||||
SipEmulator sip = new SipEmulator();
|
||||
sip.startRecording();
|
||||
JNIdc.setupMic(sip);
|
||||
|
||||
}
|
||||
|
||||
private void runCompatibilityMode() {
|
||||
|
|
|
@ -23,6 +23,8 @@ public class JNIdc
|
|||
|
||||
public static native void initControllers(boolean[] controllers);
|
||||
|
||||
public static native void setupMic(Object sip);
|
||||
|
||||
public static void show_osd() {
|
||||
JNIdc.vjoy(13, 1,0,0,0);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,107 @@
|
|||
package com.reicast.emulator;
|
||||
|
||||
import java.util.LinkedList;
|
||||
|
||||
import android.media.AudioFormat;
|
||||
import android.media.AudioRecord;
|
||||
import android.media.MediaRecorder;
|
||||
import android.util.Log;
|
||||
|
||||
public class SipEmulator extends Thread{
|
||||
|
||||
static final String TAG = "SipEmulator";
|
||||
|
||||
//one second of audio data in bytes
|
||||
static final int BUFFER_SIZE = 22050;
|
||||
//this needs to get set to the amount the mic normally sends per data request
|
||||
//--->target 512!
|
||||
static final int ONE_BLIP_SIZE = 512;
|
||||
static final long TIME_TO_WAIT_BETWEEN_POLLS = 1000 / 44; //poll every ~23 ms
|
||||
|
||||
private AudioRecord record;
|
||||
private LinkedList<byte[]> bytesReadBuffer;
|
||||
|
||||
private Thread recordThread;
|
||||
private boolean continueRecording;
|
||||
|
||||
/*
|
||||
16-bit PCM @ 11025 hz
|
||||
== 176.4 kbit/s
|
||||
== 22050 bytes/s
|
||||
*/
|
||||
|
||||
public SipEmulator(){
|
||||
|
||||
Log.d(TAG, "SipEmulator constructor called");
|
||||
|
||||
init();
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void init(){
|
||||
Log.d(TAG, "SipEmulator init called");
|
||||
|
||||
record = new AudioRecord(
|
||||
MediaRecorder.AudioSource.MIC,
|
||||
11025,
|
||||
AudioFormat.CHANNEL_IN_MONO,
|
||||
AudioFormat.ENCODING_PCM_16BIT,
|
||||
BUFFER_SIZE);
|
||||
|
||||
bytesReadBuffer = new LinkedList<byte[]>();
|
||||
|
||||
}
|
||||
|
||||
|
||||
public void startRecording(){
|
||||
if(continueRecording){
|
||||
return;
|
||||
}
|
||||
Log.d(TAG, "SipEmulator startRecording called");
|
||||
record.startRecording();
|
||||
continueRecording = true;
|
||||
this.start();
|
||||
}
|
||||
|
||||
public void stopRecording(){
|
||||
Log.d(TAG, "SipEmulator stopRecording called");
|
||||
record.stop();
|
||||
continueRecording = false;
|
||||
}
|
||||
|
||||
public byte[] getData(){
|
||||
//Log.d(TAG, "SipEmulator getData called");
|
||||
Log.d(TAG, "SipEmulator getData bytesReadBuffer size: "+bytesReadBuffer.size());
|
||||
return bytesReadBuffer.poll();
|
||||
}
|
||||
|
||||
public void configSomething(int what, int setting){
|
||||
Log.d(TAG, "SipEmulator configSomething called");
|
||||
|
||||
}
|
||||
|
||||
public void run() {
|
||||
Log.d(TAG, "recordThread starting");
|
||||
//sleep to let some data come in
|
||||
// try {
|
||||
// Thread.sleep(TIME_TO_WAIT_BETWEEN_POLLS);
|
||||
// } catch (InterruptedException e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
|
||||
while(continueRecording){
|
||||
byte[] freshData = new byte[ONE_BLIP_SIZE];
|
||||
int bytesRead = record.read(freshData, 0, ONE_BLIP_SIZE);
|
||||
//Log.d(TAG, "recordThread recorded: "+bytesRead);
|
||||
bytesReadBuffer.add(freshData);
|
||||
|
||||
try {
|
||||
Thread.sleep(TIME_TO_WAIT_BETWEEN_POLLS);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue