1 // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
2 
3 #pragma once
4 
5 #include <jni.h>
6 #include <fbjni/fbjni.h>
7 
8 #include <memory>
9 
10 namespace expo {
11   namespace av {
12 
13     namespace jni = facebook::jni;
14 
15     using SampleBufferCallback = std::function<void(jni::local_ref<jni::JArrayByte>, double)>;
16 
17     class JPlayerData : public jni::HybridClass<JPlayerData> {
18     public:
19       static auto constexpr kJavaDescriptor = "Lexpo/modules/av/player/PlayerData;";
20       static auto constexpr TAG = "JPlayerData";
21 
22       static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis);
23 
24       static void registerNatives();
25 
26       void setSampleBufferCallback(const SampleBufferCallback &&sampleBufferCallback);
27 
28       void unsetSampleBufferCallback();
29 
30     private:
31       friend HybridBase;
32       jni::global_ref<JPlayerData::javaobject> javaPart_;
33       SampleBufferCallback sampleBufferCallback_;
34 
35       void
36       sampleBufferCallback(jni::alias_ref<jni::JArrayByte> sampleBuffer, jdouble positionSeconds);
37 
38       void setEnableSampleBufferCallback(bool enable);
39 
JPlayerData(jni::alias_ref<jhybridobject> jThis)40       explicit JPlayerData(jni::alias_ref<jhybridobject> jThis) :
41         javaPart_(jni::make_global(jThis)),
42         sampleBufferCallback_(nullptr) {}
43     };
44 
45   } // namespace av
46 } // namespace expo
47