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