mirror of
https://github.com/danog/libtgvoip.git
synced 2024-12-11 16:49:52 +01:00
5caaaafa42
I'm now using the entire audio processing module from WebRTC as opposed to individual DSP algorithms pulled from there before. Seems to work better this way.
108 lines
2.5 KiB
C++
108 lines
2.5 KiB
C++
//
|
|
// libtgvoip is free and unencumbered public domain software.
|
|
// For more information, see http://unlicense.org or the UNLICENSE file
|
|
// you should have received with this source code distribution.
|
|
//
|
|
|
|
#include "AudioOutputAndroid.h"
|
|
#include <stdio.h>
|
|
#include "../../logging.h"
|
|
|
|
extern JavaVM* sharedJVM;
|
|
|
|
using namespace tgvoip;
|
|
using namespace tgvoip::audio;
|
|
|
|
jmethodID AudioOutputAndroid::initMethod=NULL;
|
|
jmethodID AudioOutputAndroid::releaseMethod=NULL;
|
|
jmethodID AudioOutputAndroid::startMethod=NULL;
|
|
jmethodID AudioOutputAndroid::stopMethod=NULL;
|
|
jclass AudioOutputAndroid::jniClass=NULL;
|
|
|
|
AudioOutputAndroid::AudioOutputAndroid(){
|
|
JNIEnv* env=NULL;
|
|
bool didAttach=false;
|
|
sharedJVM->GetEnv((void**) &env, JNI_VERSION_1_6);
|
|
if(!env){
|
|
sharedJVM->AttachCurrentThread(&env, NULL);
|
|
didAttach=true;
|
|
}
|
|
|
|
jmethodID ctor=env->GetMethodID(jniClass, "<init>", "(J)V");
|
|
jobject obj=env->NewObject(jniClass, ctor, (jlong)(intptr_t)this);
|
|
javaObject=env->NewGlobalRef(obj);
|
|
|
|
env->CallVoidMethod(javaObject, initMethod, 48000, 16, 1, 960*2);
|
|
|
|
if(didAttach){
|
|
sharedJVM->DetachCurrentThread();
|
|
}
|
|
running=false;
|
|
}
|
|
|
|
AudioOutputAndroid::~AudioOutputAndroid(){
|
|
JNIEnv* env=NULL;
|
|
bool didAttach=false;
|
|
sharedJVM->GetEnv((void**) &env, JNI_VERSION_1_6);
|
|
if(!env){
|
|
sharedJVM->AttachCurrentThread(&env, NULL);
|
|
didAttach=true;
|
|
}
|
|
|
|
env->CallVoidMethod(javaObject, releaseMethod);
|
|
env->DeleteGlobalRef(javaObject);
|
|
javaObject=NULL;
|
|
|
|
if(didAttach){
|
|
sharedJVM->DetachCurrentThread();
|
|
}
|
|
}
|
|
|
|
void AudioOutputAndroid::Start(){
|
|
JNIEnv* env=NULL;
|
|
bool didAttach=false;
|
|
sharedJVM->GetEnv((void**) &env, JNI_VERSION_1_6);
|
|
if(!env){
|
|
sharedJVM->AttachCurrentThread(&env, NULL);
|
|
didAttach=true;
|
|
}
|
|
|
|
env->CallVoidMethod(javaObject, startMethod);
|
|
|
|
if(didAttach){
|
|
sharedJVM->DetachCurrentThread();
|
|
}
|
|
running=true;
|
|
}
|
|
|
|
void AudioOutputAndroid::Stop(){
|
|
running=false;
|
|
JNIEnv* env=NULL;
|
|
bool didAttach=false;
|
|
sharedJVM->GetEnv((void**) &env, JNI_VERSION_1_6);
|
|
if(!env){
|
|
sharedJVM->AttachCurrentThread(&env, NULL);
|
|
didAttach=true;
|
|
}
|
|
|
|
env->CallVoidMethod(javaObject, stopMethod);
|
|
|
|
if(didAttach){
|
|
sharedJVM->DetachCurrentThread();
|
|
}
|
|
}
|
|
|
|
void AudioOutputAndroid::HandleCallback(JNIEnv* env, jbyteArray buffer){
|
|
if(!running)
|
|
return;
|
|
unsigned char* buf=(unsigned char*) env->GetByteArrayElements(buffer, NULL);
|
|
size_t len=(size_t) env->GetArrayLength(buffer);
|
|
InvokeCallback(buf, len);
|
|
env->ReleaseByteArrayElements(buffer, (jbyte *) buf, 0);
|
|
}
|
|
|
|
|
|
bool AudioOutputAndroid::IsPlaying(){
|
|
return running;
|
|
}
|