Fixed audio recording

This commit is contained in:
Sergii Pylypenko
2013-03-15 19:12:56 +02:00
parent cf011043a9
commit 2393edc06c
4 changed files with 46 additions and 25 deletions

View File

@@ -164,7 +164,7 @@ class AudioThread
private AudioRecord mRecorder = null;
private int mRecorderBufferSize = 0;
private int startRecording(int rate, int channels, int encoding, int bufsize)
private byte[] startRecording(int rate, int channels, int encoding, int bufsize)
{
if( mRecordThread == null )
{
@@ -174,7 +174,7 @@ class AudioThread
if( !mRecordThread.isStopped() )
{
System.out.println("SDL: error: application already opened audio recording device");
return 0;
return null;
}
mRecordThread.init(bufsize);
@@ -200,7 +200,7 @@ class AudioThread
mRecorderBufferSize = minBufferSize;
} catch (IllegalArgumentException e) {
System.out.println("SDL: error: failed to open recording device!");
return 0;
return null;
}
}
else
@@ -208,7 +208,7 @@ class AudioThread
System.out.println("SDL: reusing old recording device");
}
mRecordThread.startRecording();
return minBufferSize;
return mRecordThread.mRecordBuffer;
}
private void stopRecording()
@@ -225,7 +225,7 @@ class AudioThread
private class RecordingThread extends Thread
{
private boolean stopped = true;
private byte[] mRecordBuffer;
byte[] mRecordBuffer;
private Semaphore waitStarted = new Semaphore(0);
private boolean sleep = false;
@@ -258,7 +258,7 @@ class AudioThread
// TODO: record in a loop?
}
//System.out.println("SDL: nativeAudioRecordCallback with len " + mRecordBuffer.length);
nativeAudioRecordCallback(mRecordBuffer);
nativeAudioRecordCallback();
//System.out.println("SDL: nativeAudioRecordCallback returned");
}
@@ -298,5 +298,5 @@ class AudioThread
}
}
private native void nativeAudioRecordCallback(byte[] buffer);
private native void nativeAudioRecordCallback();
}

View File

@@ -43,8 +43,8 @@ HiddenMenuOptions='OptionalDownloadConfig DisplaySizeConfig'
FirstStartMenuOptions=''
MultiABI=y
AppMinimumRAM=300
AppVersionCode=08821
AppVersionName="0.8.8.21"
AppVersionCode=08822
AppVersionName="0.8.8.22"
ResetSdlConfigForThisVersion=n
DeleteFilesOnUpgrade="libsdl-DownloadFinished-10.flag"
CompiledLibraries="sdl_mixer sdl_image freetype curl vorbis ogg"

View File

@@ -151,6 +151,8 @@ static jmethodID JavaResumeAudioPlayback = NULL;
static SDL_AudioSpec recording;
static jmethodID JavaStartRecording = NULL;
static jmethodID JavaStopRecording = NULL;
static jbyteArray recordingBufferJNI = NULL;
static size_t recordingBufferSize = 0;
static Uint8 *ANDROIDAUD_GetAudioBuf(_THIS)
@@ -320,7 +322,7 @@ static void ANDROIDAUD_ThreadInit(_THIS)
SDL_memset(audioBuffer, this->spec.silence, this->spec.size);
// Audio recording
JavaStartRecording = (*jniEnvPlaying)->GetMethodID(jniEnvPlaying, JavaAudioThreadClass, "startRecording", "(IIII)I");
JavaStartRecording = (*jniEnvPlaying)->GetMethodID(jniEnvPlaying, JavaAudioThreadClass, "startRecording", "(IIII)[B");
JavaStopRecording = (*jniEnvPlaying)->GetMethodID(jniEnvPlaying, JavaAudioThreadClass, "stopRecording", "()V");
};
@@ -415,21 +417,26 @@ JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved)
// ----- Audio recording -----
JNIEXPORT void JNICALL JAVA_EXPORT_NAME(AudioThread_nativeAudioRecordCallback) (JNIEnv * jniEnv, jobject thiz, jbyteArray jbuffer)
JNIEXPORT void JNICALL JAVA_EXPORT_NAME(AudioThread_nativeAudioRecordCallback) (JNIEnv * jniEnv, jobject thiz)
{
int len = (*jniEnv)->GetArrayLength(jniEnv, jbuffer);
Uint8 *buffer = (Uint8 *) (*jniEnv)->GetByteArrayElements(jniEnv, jbuffer, NULL);
if( !buffer )
if( !recordingBufferJNI || !recordingBufferSize )
{
__android_log_print(ANDROID_LOG_ERROR, "libSDL", "AudioThread_nativeAudioRecordCallbacks() JNI::GetByteArrayElements() failed! we will crash now");
__android_log_print(ANDROID_LOG_ERROR, "libSDL", "AudioThread_nativeAudioRecordCallbacks(): error: recording buffer is NULL");
return;
}
__android_log_print(ANDROID_LOG_INFO, "libSDL", "AudioThread_nativeAudioRecordCallbacks(): got buffer %p len %d", buffer, len);
Uint8 *buffer = (Uint8 *) (*jniEnv)->GetByteArrayElements(jniEnv, recordingBufferJNI, NULL);
if( !buffer )
{
__android_log_print(ANDROID_LOG_ERROR, "libSDL", "AudioThread_nativeAudioRecordCallbacks(): error: JNI::GetByteArrayElements() failed!");
return;
}
recording.callback(recording.userdata, buffer, len);
//__android_log_print(ANDROID_LOG_INFO, "libSDL", "AudioThread_nativeAudioRecordCallbacks(): got buffer %p len %d", buffer, recordingBufferSize);
(*jniEnv)->ReleaseByteArrayElements(jniEnv, jbuffer, (jbyte *)buffer, 0);
recording.callback(recording.userdata, buffer, recordingBufferSize);
(*jniEnv)->ReleaseByteArrayElements(jniEnv, recordingBufferJNI, (jbyte *)buffer, 0);
}
extern DECLSPEC int SDLCALL SDL_ANDROID_OpenAudioRecording(SDL_AudioSpec *spec)
@@ -440,27 +447,41 @@ extern DECLSPEC int SDLCALL SDL_ANDROID_OpenAudioRecording(SDL_AudioSpec *spec)
if( ! (recording.format == AUDIO_S8 || recording.format == AUDIO_S16) )
{
__android_log_print(ANDROID_LOG_ERROR, "libSDL", "Application requested unsupported audio format - only S8 and S16 are supported");
__android_log_print(ANDROID_LOG_ERROR, "libSDL", "SDL_ANDROID_OpenAudioRecording(): Application requested unsupported audio format - only S8 and S16 are supported");
return 0;
}
if( ! recording.callback )
{
__android_log_print(ANDROID_LOG_ERROR, "libSDL", "Application did not provide callback");
__android_log_print(ANDROID_LOG_ERROR, "libSDL", "SDL_ANDROID_OpenAudioRecording(): Application did not provide callback");
return 0;
}
(*jniVM)->AttachCurrentThread(jniVM, &jniEnv, NULL);
(*jniVM)->AttachCurrentThread( jniVM, &jniEnv, NULL );
return (*jniEnv)->CallIntMethod( jniEnv, JavaAudioThread, JavaStartRecording, (jint)recording.freq, (jint)recording.channels,
(jint)(recording.format == AUDIO_S16 ? 1 : 0), (jint)recording.size );
recordingBufferJNI = (*jniEnv)->CallObjectMethod( jniEnv, JavaAudioThread, JavaStartRecording,
(jint)recording.freq, (jint)recording.channels,
(jint)(recording.format == AUDIO_S16 ? 1 : 0), (jint)recording.size );
if( !recordingBufferJNI )
{
__android_log_print(ANDROID_LOG_ERROR, "libSDL", "SDL_ANDROID_OpenAudioRecording(): Java did not return audio buffer");
return 0;
}
recordingBufferJNI = (*jniEnv)->NewGlobalRef( jniEnv, recordingBufferJNI );
recordingBufferSize = (*jniEnv)->GetArrayLength( jniEnv, recordingBufferJNI );
//__android_log_print(ANDROID_LOG_ERROR, "libSDL", "SDL_ANDROID_OpenAudioRecording(): JNI buffer %p len %d", recordingBufferJNI, recordingBufferSize);
return 1;
}
extern DECLSPEC void SDLCALL SDL_ANDROID_CloseAudioRecording(void)
{
JNIEnv * jniEnv = NULL;
(*jniVM)->AttachCurrentThread(jniVM, &jniEnv, NULL);
(*jniVM)->AttachCurrentThread( jniVM, &jniEnv, NULL );
(*jniEnv)->CallVoidMethod( jniEnv, JavaAudioThread, JavaStopRecording );
if( recordingBufferJNI )
(*jniEnv)->DeleteGlobalRef( jniEnv, recordingBufferJNI );
recordingBufferJNI = NULL;
recordingBufferSize = 0;
}