AudioOutputAndroid.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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 "AudioOutputAndroid.h"
  7. #include <stdio.h>
  8. #include "../../logging.h"
  9. extern JavaVM* sharedJVM;
  10. using namespace tgvoip;
  11. using namespace tgvoip::audio;
  12. jmethodID AudioOutputAndroid::initMethod=NULL;
  13. jmethodID AudioOutputAndroid::releaseMethod=NULL;
  14. jmethodID AudioOutputAndroid::startMethod=NULL;
  15. jmethodID AudioOutputAndroid::stopMethod=NULL;
  16. jclass AudioOutputAndroid::jniClass=NULL;
  17. AudioOutputAndroid::AudioOutputAndroid(){
  18. JNIEnv* env=NULL;
  19. bool didAttach=false;
  20. sharedJVM->GetEnv((void**) &env, JNI_VERSION_1_6);
  21. if(!env){
  22. sharedJVM->AttachCurrentThread(&env, NULL);
  23. didAttach=true;
  24. }
  25. jmethodID ctor=env->GetMethodID(jniClass, "<init>", "(J)V");
  26. jobject obj=env->NewObject(jniClass, ctor, (jlong)(intptr_t)this);
  27. javaObject=env->NewGlobalRef(obj);
  28. env->CallVoidMethod(javaObject, initMethod, 48000, 16, 1, 960*2);
  29. if(didAttach){
  30. sharedJVM->DetachCurrentThread();
  31. }
  32. running=false;
  33. }
  34. AudioOutputAndroid::~AudioOutputAndroid(){
  35. JNIEnv* env=NULL;
  36. bool didAttach=false;
  37. sharedJVM->GetEnv((void**) &env, JNI_VERSION_1_6);
  38. if(!env){
  39. sharedJVM->AttachCurrentThread(&env, NULL);
  40. didAttach=true;
  41. }
  42. env->CallVoidMethod(javaObject, releaseMethod);
  43. env->DeleteGlobalRef(javaObject);
  44. javaObject=NULL;
  45. if(didAttach){
  46. sharedJVM->DetachCurrentThread();
  47. }
  48. }
  49. void AudioOutputAndroid::Start(){
  50. JNIEnv* env=NULL;
  51. bool didAttach=false;
  52. sharedJVM->GetEnv((void**) &env, JNI_VERSION_1_6);
  53. if(!env){
  54. sharedJVM->AttachCurrentThread(&env, NULL);
  55. didAttach=true;
  56. }
  57. env->CallVoidMethod(javaObject, startMethod);
  58. if(didAttach){
  59. sharedJVM->DetachCurrentThread();
  60. }
  61. running=true;
  62. }
  63. void AudioOutputAndroid::Stop(){
  64. running=false;
  65. JNIEnv* env=NULL;
  66. bool didAttach=false;
  67. sharedJVM->GetEnv((void**) &env, JNI_VERSION_1_6);
  68. if(!env){
  69. sharedJVM->AttachCurrentThread(&env, NULL);
  70. didAttach=true;
  71. }
  72. env->CallVoidMethod(javaObject, stopMethod);
  73. if(didAttach){
  74. sharedJVM->DetachCurrentThread();
  75. }
  76. }
  77. void AudioOutputAndroid::HandleCallback(JNIEnv* env, jbyteArray buffer){
  78. if(!running)
  79. return;
  80. unsigned char* buf=(unsigned char*) env->GetByteArrayElements(buffer, NULL);
  81. size_t len=(size_t) env->GetArrayLength(buffer);
  82. InvokeCallback(buf, len);
  83. env->ReleaseByteArrayElements(buffer, (jbyte *) buf, 0);
  84. }
  85. bool AudioOutputAndroid::IsPlaying(){
  86. return running;
  87. }