1 // Copyright © 2021-present 650 Industries, Inc. (aka Expo) 2 3 #include "JPlayerData.h" 4 5 #include <jni.h> 6 #include <fbjni/fbjni.h> 7 8 #include <memory> 9 #include <string> 10 11 namespace expo { 12 namespace av { 13 14 namespace jni = facebook::jni; 15 16 jni::local_ref<JPlayerData::jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis)17 JPlayerData::initHybrid(jni::alias_ref<jhybridobject> jThis) { 18 return makeCxxInstance(jThis); 19 } 20 registerNatives()21 void JPlayerData::registerNatives() { 22 registerHybrid({ 23 makeNativeMethod("initHybrid", JPlayerData::initHybrid), 24 makeNativeMethod("sampleBufferCallback", JPlayerData::sampleBufferCallback), 25 }); 26 } 27 sampleBufferCallback(jni::alias_ref<jni::JArrayByte> sampleBuffer,jdouble positionSeconds)28 void JPlayerData::sampleBufferCallback(jni::alias_ref<jni::JArrayByte> sampleBuffer, 29 jdouble positionSeconds) { 30 if (sampleBufferCallback_ == nullptr) { 31 __android_log_write(ANDROID_LOG_WARN, TAG, "Sample Buffer Callback is null!"); 32 setEnableSampleBufferCallback(false); 33 return; 34 } 35 36 auto sampleBufferStrong = make_local(sampleBuffer); 37 try { 38 sampleBufferCallback_(sampleBufferStrong, positionSeconds); 39 } catch (const std::exception &exception) { 40 auto message = "Sample Buffer Callback threw an error! " + std::string(exception.what()); 41 __android_log_write(ANDROID_LOG_ERROR, TAG, message.c_str()); 42 } 43 } 44 setEnableSampleBufferCallback(bool enable)45 void JPlayerData::setEnableSampleBufferCallback(bool enable) { 46 if (enable) { 47 __android_log_write(ANDROID_LOG_INFO, TAG, "Enabling Sample Buffer Callback..."); 48 } else { 49 __android_log_write(ANDROID_LOG_INFO, TAG, "Disabling Sample Buffer Callback..."); 50 } 51 static const auto javaMethod = javaPart_->getClass()->getMethod<void(bool)>( 52 "setEnableSampleBufferCallback"); 53 javaMethod(javaPart_.get(), enable); 54 } 55 setSampleBufferCallback(const SampleBufferCallback && sampleBufferCallback)56 void JPlayerData::setSampleBufferCallback(const SampleBufferCallback &&sampleBufferCallback) { 57 sampleBufferCallback_ = sampleBufferCallback; 58 setEnableSampleBufferCallback(true); 59 } 60 unsetSampleBufferCallback()61 void JPlayerData::unsetSampleBufferCallback() { 62 sampleBufferCallback_ = nullptr; 63 setEnableSampleBufferCallback(false); 64 } 65 66 } // namespace av 67 } // namespace expo 68