AudioInputAndroid.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. //
  2. // libtgvoip is free and unencumbered public domain software.
  3. // For more information, see http://unlicense.org or the UNLICENSE file
  4. // you should have received with this source code distribution.
  5. //
  6. #include "AudioInputAndroid.h"
  7. #include <stdio.h>
  8. #include "../../logging.h"
  9. #include "JNIUtilities.h"
  10. extern JavaVM* sharedJVM;
  11. using namespace tgvoip;
  12. using namespace tgvoip::audio;
  13. jmethodID AudioInputAndroid::initMethod=NULL;
  14. jmethodID AudioInputAndroid::releaseMethod=NULL;
  15. jmethodID AudioInputAndroid::startMethod=NULL;
  16. jmethodID AudioInputAndroid::stopMethod=NULL;
  17. jmethodID AudioInputAndroid::getEnabledEffectsMaskMethod=NULL;
  18. jclass AudioInputAndroid::jniClass=NULL;
  19. AudioInputAndroid::AudioInputAndroid(){
  20. jni::DoWithJNI([this](JNIEnv* env){
  21. jmethodID ctor=env->GetMethodID(jniClass, "<init>", "(J)V");
  22. jobject obj=env->NewObject(jniClass, ctor, (jlong)(intptr_t)this);
  23. javaObject=env->NewGlobalRef(obj);
  24. env->CallVoidMethod(javaObject, initMethod, 48000, 16, 1, 960*2);
  25. enabledEffects=(unsigned int)env->CallIntMethod(javaObject, getEnabledEffectsMaskMethod);
  26. });
  27. running=false;
  28. }
  29. AudioInputAndroid::~AudioInputAndroid(){
  30. {
  31. MutexGuard guard(mutex);
  32. jni::DoWithJNI([this](JNIEnv* env){
  33. env->CallVoidMethod(javaObject, releaseMethod);
  34. env->DeleteGlobalRef(javaObject);
  35. javaObject=NULL;
  36. });
  37. }
  38. }
  39. void AudioInputAndroid::Start(){
  40. MutexGuard guard(mutex);
  41. jni::DoWithJNI([this](JNIEnv* env){
  42. failed=!env->CallBooleanMethod(javaObject, startMethod);
  43. });
  44. running=true;
  45. }
  46. void AudioInputAndroid::Stop(){
  47. MutexGuard guard(mutex);
  48. running=false;
  49. jni::DoWithJNI([this](JNIEnv* env){
  50. env->CallVoidMethod(javaObject, stopMethod);
  51. });
  52. }
  53. void AudioInputAndroid::HandleCallback(JNIEnv* env, jobject buffer){
  54. if(!running)
  55. return;
  56. unsigned char* buf=(unsigned char*) env->GetDirectBufferAddress(buffer);
  57. size_t len=(size_t) env->GetDirectBufferCapacity(buffer);
  58. InvokeCallback(buf, len);
  59. }
  60. unsigned int AudioInputAndroid::GetEnabledEffects(){
  61. return enabledEffects;
  62. }