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>
17     JPlayerData::initHybrid(jni::alias_ref<jhybridobject> jThis) {
18       return makeCxxInstance(jThis);
19     }
20 
21     void JPlayerData::registerNatives() {
22       registerHybrid({
23                        makeNativeMethod("initHybrid", JPlayerData::initHybrid),
24                        makeNativeMethod("sampleBufferCallback", JPlayerData::sampleBufferCallback),
25                      });
26     }
27 
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 
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 
56     void JPlayerData::setSampleBufferCallback(const SampleBufferCallback &&sampleBufferCallback) {
57       sampleBufferCallback_ = sampleBufferCallback;
58       setEnableSampleBufferCallback(true);
59     }
60 
61     void JPlayerData::unsetSampleBufferCallback() {
62       sampleBufferCallback_ = nullptr;
63       setEnableSampleBufferCallback(false);
64     }
65 
66   } // namespace av
67 } // namespace expo
68