xref: /aosp_15_r20/cts/apps/CtsVerifier/jni/megaaudio/player/OboePlayer.cpp (revision b7c941bb3fa97aba169d73cee0bed2de8ac964bf)
1*b7c941bbSAndroid Build Coastguard Worker /*
2*b7c941bbSAndroid Build Coastguard Worker  * Copyright 2020 The Android Open Source Project
3*b7c941bbSAndroid Build Coastguard Worker  *
4*b7c941bbSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*b7c941bbSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*b7c941bbSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*b7c941bbSAndroid Build Coastguard Worker  *
8*b7c941bbSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*b7c941bbSAndroid Build Coastguard Worker  *
10*b7c941bbSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*b7c941bbSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*b7c941bbSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*b7c941bbSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*b7c941bbSAndroid Build Coastguard Worker  * limitations under the License.
15*b7c941bbSAndroid Build Coastguard Worker  */
16*b7c941bbSAndroid Build Coastguard Worker #include <android/log.h>
17*b7c941bbSAndroid Build Coastguard Worker 
18*b7c941bbSAndroid Build Coastguard Worker #include "OboePlayer.h"
19*b7c941bbSAndroid Build Coastguard Worker 
20*b7c941bbSAndroid Build Coastguard Worker #include "WaveTableSource.h"
21*b7c941bbSAndroid Build Coastguard Worker 
22*b7c941bbSAndroid Build Coastguard Worker #include "AudioSource.h"
23*b7c941bbSAndroid Build Coastguard Worker 
24*b7c941bbSAndroid Build Coastguard Worker static const char * const TAG = "OboePlayer(native)";
25*b7c941bbSAndroid Build Coastguard Worker 
26*b7c941bbSAndroid Build Coastguard Worker using namespace oboe;
27*b7c941bbSAndroid Build Coastguard Worker 
28*b7c941bbSAndroid Build Coastguard Worker constexpr int32_t kBufferSizeInBursts = 2; // Use 2 bursts as the buffer size (double buffer)
29*b7c941bbSAndroid Build Coastguard Worker 
javaChannelMaskToOboeChannelMask(int32_t javaMask)30*b7c941bbSAndroid Build Coastguard Worker ChannelMask OboePlayer::javaChannelMaskToOboeChannelMask(int32_t javaMask) {
31*b7c941bbSAndroid Build Coastguard Worker     return (ChannelMask) (javaMask >> 2);
32*b7c941bbSAndroid Build Coastguard Worker }
33*b7c941bbSAndroid Build Coastguard Worker 
javaChannelMaskToChannelCount(int32_t javaMask)34*b7c941bbSAndroid Build Coastguard Worker int32_t OboePlayer::javaChannelMaskToChannelCount(int32_t javaMask) {
35*b7c941bbSAndroid Build Coastguard Worker     // return the count of 1 bits
36*b7c941bbSAndroid Build Coastguard Worker     return __builtin_popcount(static_cast<uint32_t>(javaMask));
37*b7c941bbSAndroid Build Coastguard Worker }
38*b7c941bbSAndroid Build Coastguard Worker 
OboePlayer(JNIEnv * env,AudioSource * source,int subtype)39*b7c941bbSAndroid Build Coastguard Worker OboePlayer::OboePlayer(JNIEnv *env, AudioSource* source, int subtype)
40*b7c941bbSAndroid Build Coastguard Worker  : Player(source, subtype)
41*b7c941bbSAndroid Build Coastguard Worker {
42*b7c941bbSAndroid Build Coastguard Worker     env->GetJavaVM(&mJvm);
43*b7c941bbSAndroid Build Coastguard Worker 
44*b7c941bbSAndroid Build Coastguard Worker     jclass clsAudioTimestamp = env->FindClass("android/media/AudioTimestamp");
45*b7c941bbSAndroid Build Coastguard Worker 
46*b7c941bbSAndroid Build Coastguard Worker     mFidFramePosition = env->GetFieldID(clsAudioTimestamp, "framePosition", "J");
47*b7c941bbSAndroid Build Coastguard Worker     mFidNanoTime = env->GetFieldID(clsAudioTimestamp, "nanoTime", "J");
48*b7c941bbSAndroid Build Coastguard Worker }
49*b7c941bbSAndroid Build Coastguard Worker 
onAudioReady(AudioStream * oboeStream,void * audioData,int32_t numFrames)50*b7c941bbSAndroid Build Coastguard Worker DataCallbackResult OboePlayer::onAudioReady(AudioStream *oboeStream, void *audioData,
51*b7c941bbSAndroid Build Coastguard Worker                                             int32_t numFrames) {
52*b7c941bbSAndroid Build Coastguard Worker     StreamState streamState = oboeStream->getState();
53*b7c941bbSAndroid Build Coastguard Worker     if (streamState != StreamState::Open && streamState != StreamState::Started) {
54*b7c941bbSAndroid Build Coastguard Worker         __android_log_print(ANDROID_LOG_ERROR, TAG, "  streamState:%d",
55*b7c941bbSAndroid Build Coastguard Worker                 static_cast<int>(streamState));
56*b7c941bbSAndroid Build Coastguard Worker     }
57*b7c941bbSAndroid Build Coastguard Worker     if (streamState == StreamState::Disconnected) {
58*b7c941bbSAndroid Build Coastguard Worker         __android_log_print(ANDROID_LOG_ERROR, TAG, "  streamState::Disconnected");
59*b7c941bbSAndroid Build Coastguard Worker     }
60*b7c941bbSAndroid Build Coastguard Worker 
61*b7c941bbSAndroid Build Coastguard Worker     // Pull the data here!
62*b7c941bbSAndroid Build Coastguard Worker     int numFramesRead = mAudioSource->pull((float*)audioData, numFrames, mNumExchangeChannels);
63*b7c941bbSAndroid Build Coastguard Worker     // may need to handle 0-filling if numFramesRead < numFrames
64*b7c941bbSAndroid Build Coastguard Worker 
65*b7c941bbSAndroid Build Coastguard Worker     return numFramesRead != 0 ? DataCallbackResult::Continue : DataCallbackResult::Stop;
66*b7c941bbSAndroid Build Coastguard Worker }
67*b7c941bbSAndroid Build Coastguard Worker 
onErrorAfterClose(AudioStream * oboeStream,oboe::Result error)68*b7c941bbSAndroid Build Coastguard Worker void OboePlayer::onErrorAfterClose(AudioStream *oboeStream, oboe::Result error) {
69*b7c941bbSAndroid Build Coastguard Worker }
70*b7c941bbSAndroid Build Coastguard Worker 
onErrorBeforeClose(AudioStream *,oboe::Result error)71*b7c941bbSAndroid Build Coastguard Worker void OboePlayer::onErrorBeforeClose(AudioStream *, oboe::Result error) {
72*b7c941bbSAndroid Build Coastguard Worker }
73*b7c941bbSAndroid Build Coastguard Worker 
setupStream(int32_t channelCount,int32_t channelMask,int32_t sampleRate,int32_t performanceMode,int32_t sharingMode,int32_t routeDeviceId)74*b7c941bbSAndroid Build Coastguard Worker StreamBase::Result OboePlayer::setupStream(int32_t channelCount, int32_t channelMask,
75*b7c941bbSAndroid Build Coastguard Worker                     int32_t sampleRate, int32_t performanceMode, int32_t sharingMode,
76*b7c941bbSAndroid Build Coastguard Worker                     int32_t routeDeviceId) {
77*b7c941bbSAndroid Build Coastguard Worker 
78*b7c941bbSAndroid Build Coastguard Worker     oboe::Result result = oboe::Result::ErrorInternal;
79*b7c941bbSAndroid Build Coastguard Worker     if (mAudioStream != nullptr) {
80*b7c941bbSAndroid Build Coastguard Worker         __android_log_print(ANDROID_LOG_ERROR, TAG,
81*b7c941bbSAndroid Build Coastguard Worker                             "ERROR_INVALID_STATE - Stream Already Open.");
82*b7c941bbSAndroid Build Coastguard Worker         return ERROR_INVALID_STATE;
83*b7c941bbSAndroid Build Coastguard Worker     } else {
84*b7c941bbSAndroid Build Coastguard Worker         std::lock_guard<std::mutex> lock(mStreamLock);
85*b7c941bbSAndroid Build Coastguard Worker 
86*b7c941bbSAndroid Build Coastguard Worker         mChannelCount = channelCount;
87*b7c941bbSAndroid Build Coastguard Worker         mChannelMask = channelMask;
88*b7c941bbSAndroid Build Coastguard Worker 
89*b7c941bbSAndroid Build Coastguard Worker         mSampleRate = sampleRate;
90*b7c941bbSAndroid Build Coastguard Worker         mRouteDeviceId = routeDeviceId;
91*b7c941bbSAndroid Build Coastguard Worker 
92*b7c941bbSAndroid Build Coastguard Worker         // Create an audio stream
93*b7c941bbSAndroid Build Coastguard Worker         AudioStreamBuilder builder;
94*b7c941bbSAndroid Build Coastguard Worker         if (mChannelCount != 0) {
95*b7c941bbSAndroid Build Coastguard Worker             builder.setChannelCount(mChannelCount);
96*b7c941bbSAndroid Build Coastguard Worker             mNumExchangeChannels = mChannelCount;
97*b7c941bbSAndroid Build Coastguard Worker         } else {
98*b7c941bbSAndroid Build Coastguard Worker             builder.setChannelMask(javaChannelMaskToOboeChannelMask(mChannelMask));
99*b7c941bbSAndroid Build Coastguard Worker             mNumExchangeChannels = javaChannelMaskToChannelCount(mChannelMask);
100*b7c941bbSAndroid Build Coastguard Worker         }
101*b7c941bbSAndroid Build Coastguard Worker         builder.setSampleRate(mSampleRate);
102*b7c941bbSAndroid Build Coastguard Worker         builder.setCallback(this);
103*b7c941bbSAndroid Build Coastguard Worker 
104*b7c941bbSAndroid Build Coastguard Worker         builder.setSampleRateConversionQuality(SampleRateConversionQuality::None);
105*b7c941bbSAndroid Build Coastguard Worker         builder.setDirection(Direction::Output);
106*b7c941bbSAndroid Build Coastguard Worker         switch (mSubtype) {
107*b7c941bbSAndroid Build Coastguard Worker         case SUB_TYPE_OBOE_AAUDIO:
108*b7c941bbSAndroid Build Coastguard Worker             builder.setAudioApi(AudioApi::AAudio);
109*b7c941bbSAndroid Build Coastguard Worker             break;
110*b7c941bbSAndroid Build Coastguard Worker 
111*b7c941bbSAndroid Build Coastguard Worker         case SUB_TYPE_OBOE_OPENSL_ES:
112*b7c941bbSAndroid Build Coastguard Worker             builder.setAudioApi(AudioApi::OpenSLES);
113*b7c941bbSAndroid Build Coastguard Worker             break;
114*b7c941bbSAndroid Build Coastguard Worker         }
115*b7c941bbSAndroid Build Coastguard Worker 
116*b7c941bbSAndroid Build Coastguard Worker         builder.setPerformanceMode((PerformanceMode) performanceMode);
117*b7c941bbSAndroid Build Coastguard Worker         builder.setSharingMode((SharingMode) sharingMode);
118*b7c941bbSAndroid Build Coastguard Worker 
119*b7c941bbSAndroid Build Coastguard Worker         if (mRouteDeviceId != ROUTING_DEVICE_NONE) {
120*b7c941bbSAndroid Build Coastguard Worker             builder.setDeviceId(mRouteDeviceId);
121*b7c941bbSAndroid Build Coastguard Worker         }
122*b7c941bbSAndroid Build Coastguard Worker 
123*b7c941bbSAndroid Build Coastguard Worker         result = builder.openStream(mAudioStream);
124*b7c941bbSAndroid Build Coastguard Worker         if (result != oboe::Result::OK){
125*b7c941bbSAndroid Build Coastguard Worker             __android_log_print(
126*b7c941bbSAndroid Build Coastguard Worker                     ANDROID_LOG_ERROR,
127*b7c941bbSAndroid Build Coastguard Worker                     TAG,
128*b7c941bbSAndroid Build Coastguard Worker                     "openStream failed. Error: %s", convertToText(result));
129*b7c941bbSAndroid Build Coastguard Worker         } else {
130*b7c941bbSAndroid Build Coastguard Worker             // Reduce stream latency by setting the buffer size to a multiple of the burst size
131*b7c941bbSAndroid Build Coastguard Worker             // Note: this will fail with ErrorUnimplemented if we are using a callback with
132*b7c941bbSAndroid Build Coastguard Worker             //  OpenSL ES. See oboe::AudioStreamBuffered::setBufferSizeInFrames
133*b7c941bbSAndroid Build Coastguard Worker             // This doesn't affect the success of opening the stream.
134*b7c941bbSAndroid Build Coastguard Worker             int32_t desiredSize = mAudioStream->getFramesPerBurst() * kBufferSizeInBursts;
135*b7c941bbSAndroid Build Coastguard Worker             mAudioStream->setBufferSizeInFrames(desiredSize);
136*b7c941bbSAndroid Build Coastguard Worker 
137*b7c941bbSAndroid Build Coastguard Worker             mAudioSource->init(desiredSize , mNumExchangeChannels);
138*b7c941bbSAndroid Build Coastguard Worker         }
139*b7c941bbSAndroid Build Coastguard Worker     }
140*b7c941bbSAndroid Build Coastguard Worker     __android_log_print(ANDROID_LOG_INFO, TAG, " Done - error:%d", static_cast<int>(result));
141*b7c941bbSAndroid Build Coastguard Worker     return OboeErrorToMegaAudioError(result);
142*b7c941bbSAndroid Build Coastguard Worker }
143*b7c941bbSAndroid Build Coastguard Worker 
startStream()144*b7c941bbSAndroid Build Coastguard Worker StreamBase::Result OboePlayer::startStream() {
145*b7c941bbSAndroid Build Coastguard Worker     StreamBase::Result result = Player::startStream();
146*b7c941bbSAndroid Build Coastguard Worker 
147*b7c941bbSAndroid Build Coastguard Worker     return result;
148*b7c941bbSAndroid Build Coastguard Worker }
149*b7c941bbSAndroid Build Coastguard Worker 
getJavaTimestamp(jobject timestampObj)150*b7c941bbSAndroid Build Coastguard Worker bool OboePlayer::getJavaTimestamp(jobject timestampObj) {
151*b7c941bbSAndroid Build Coastguard Worker     oboe::FrameTimestamp nativeStamp;
152*b7c941bbSAndroid Build Coastguard Worker     StreamBase::Result result = Player::getTimeStamp(&nativeStamp);
153*b7c941bbSAndroid Build Coastguard Worker     if (result == OK) {
154*b7c941bbSAndroid Build Coastguard Worker         JNIEnv* env;
155*b7c941bbSAndroid Build Coastguard Worker         mJvm->AttachCurrentThread(&env, NULL);
156*b7c941bbSAndroid Build Coastguard Worker 
157*b7c941bbSAndroid Build Coastguard Worker         env->SetLongField(timestampObj, mFidFramePosition, nativeStamp.position);
158*b7c941bbSAndroid Build Coastguard Worker         env->SetLongField(timestampObj, mFidNanoTime, nativeStamp.timestamp);
159*b7c941bbSAndroid Build Coastguard Worker     }
160*b7c941bbSAndroid Build Coastguard Worker 
161*b7c941bbSAndroid Build Coastguard Worker     return result == OK;
162*b7c941bbSAndroid Build Coastguard Worker }
163*b7c941bbSAndroid Build Coastguard Worker 
getLastErrorCallbackResult()164*b7c941bbSAndroid Build Coastguard Worker int OboePlayer::getLastErrorCallbackResult() {
165*b7c941bbSAndroid Build Coastguard Worker     return (int)(mAudioStream->getLastErrorCallbackResult());
166*b7c941bbSAndroid Build Coastguard Worker }
167*b7c941bbSAndroid Build Coastguard Worker 
168*b7c941bbSAndroid Build Coastguard Worker //
169*b7c941bbSAndroid Build Coastguard Worker // JNI functions
170*b7c941bbSAndroid Build Coastguard Worker //
171*b7c941bbSAndroid Build Coastguard Worker #include <jni.h>
172*b7c941bbSAndroid Build Coastguard Worker 
173*b7c941bbSAndroid Build Coastguard Worker extern "C" {
174*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT JNICALL jlong
Java_org_hyphonate_megaaudio_player_OboePlayer_allocNativePlayer(JNIEnv * env,jobject thiz,jlong native_audio_source,jint playerSubtype)175*b7c941bbSAndroid Build Coastguard Worker Java_org_hyphonate_megaaudio_player_OboePlayer_allocNativePlayer(
176*b7c941bbSAndroid Build Coastguard Worker     JNIEnv *env, jobject thiz, jlong native_audio_source, jint playerSubtype) {
177*b7c941bbSAndroid Build Coastguard Worker 
178*b7c941bbSAndroid Build Coastguard Worker     return (jlong)new OboePlayer(env, (AudioSource*)native_audio_source, playerSubtype);
179*b7c941bbSAndroid Build Coastguard Worker }
180*b7c941bbSAndroid Build Coastguard Worker 
Java_org_hyphonate_megaaudio_player_OboePlayer_setupStreamN(JNIEnv * env,jobject thiz,jlong native_player,jint channel_count,jint channel_mask,jint sample_rate,jint performanceMode,jint sharingMode,jint routeDeviceId)181*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jint JNICALL Java_org_hyphonate_megaaudio_player_OboePlayer_setupStreamN(
182*b7c941bbSAndroid Build Coastguard Worker         JNIEnv *env, jobject thiz, jlong native_player,
183*b7c941bbSAndroid Build Coastguard Worker         jint channel_count, jint channel_mask, jint sample_rate, jint performanceMode,
184*b7c941bbSAndroid Build Coastguard Worker         jint sharingMode, jint routeDeviceId) {
185*b7c941bbSAndroid Build Coastguard Worker 
186*b7c941bbSAndroid Build Coastguard Worker     OboePlayer* player = (OboePlayer*)native_player;
187*b7c941bbSAndroid Build Coastguard Worker     return player->setupStream(channel_count, channel_mask, sample_rate, performanceMode,
188*b7c941bbSAndroid Build Coastguard Worker                                 sharingMode, routeDeviceId);
189*b7c941bbSAndroid Build Coastguard Worker }
190*b7c941bbSAndroid Build Coastguard Worker 
Java_org_hyphonate_megaaudio_player_OboePlayer_teardownStreamN(JNIEnv * env,jobject thiz,jlong native_player)191*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT int JNICALL Java_org_hyphonate_megaaudio_player_OboePlayer_teardownStreamN(
192*b7c941bbSAndroid Build Coastguard Worker         JNIEnv *env, jobject thiz, jlong native_player) {
193*b7c941bbSAndroid Build Coastguard Worker 
194*b7c941bbSAndroid Build Coastguard Worker     OboePlayer* player = (OboePlayer*)native_player;
195*b7c941bbSAndroid Build Coastguard Worker     return player->teardownStream();
196*b7c941bbSAndroid Build Coastguard Worker }
197*b7c941bbSAndroid Build Coastguard Worker 
Java_org_hyphonate_megaaudio_player_OboePlayer_startStreamN(JNIEnv * env,jobject thiz,jlong native_player,jint playerSubtype)198*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT JNICALL jint Java_org_hyphonate_megaaudio_player_OboePlayer_startStreamN(
199*b7c941bbSAndroid Build Coastguard Worker         JNIEnv *env, jobject thiz, jlong native_player, jint playerSubtype) {
200*b7c941bbSAndroid Build Coastguard Worker 
201*b7c941bbSAndroid Build Coastguard Worker     return ((OboePlayer*)(native_player))->startStream();
202*b7c941bbSAndroid Build Coastguard Worker }
203*b7c941bbSAndroid Build Coastguard Worker 
204*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT JNICALL jint
Java_org_hyphonate_megaaudio_player_OboePlayer_stopN(JNIEnv * env,jobject thiz,jlong native_player)205*b7c941bbSAndroid Build Coastguard Worker Java_org_hyphonate_megaaudio_player_OboePlayer_stopN(JNIEnv *env, jobject thiz,
206*b7c941bbSAndroid Build Coastguard Worker             jlong native_player) {
207*b7c941bbSAndroid Build Coastguard Worker 
208*b7c941bbSAndroid Build Coastguard Worker    return ((OboePlayer*)(native_player))->stopStream();
209*b7c941bbSAndroid Build Coastguard Worker }
210*b7c941bbSAndroid Build Coastguard Worker 
211*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jint JNICALL
Java_org_hyphonate_megaaudio_player_OboePlayer_getBufferFrameCountN(JNIEnv * env,jobject thiz,jlong native_player)212*b7c941bbSAndroid Build Coastguard Worker Java_org_hyphonate_megaaudio_player_OboePlayer_getBufferFrameCountN(JNIEnv *env, jobject thiz,
213*b7c941bbSAndroid Build Coastguard Worker             jlong native_player) {
214*b7c941bbSAndroid Build Coastguard Worker     return ((OboePlayer*)(native_player))->getNumBufferFrames();
215*b7c941bbSAndroid Build Coastguard Worker }
216*b7c941bbSAndroid Build Coastguard Worker 
Java_org_hyphonate_megaaudio_player_OboePlayer_getRoutedDeviceIdN(JNIEnv * env,jobject thiz,jlong native_player)217*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jint JNICALL Java_org_hyphonate_megaaudio_player_OboePlayer_getRoutedDeviceIdN(
218*b7c941bbSAndroid Build Coastguard Worker             JNIEnv *env, jobject thiz, jlong native_player) {
219*b7c941bbSAndroid Build Coastguard Worker     return ((OboePlayer*)(native_player))->getRoutedDeviceId();
220*b7c941bbSAndroid Build Coastguard Worker }
221*b7c941bbSAndroid Build Coastguard Worker 
Java_org_hyphonate_megaaudio_player_OboePlayer_getSharingModeN(JNIEnv * env,jobject thiz,jlong native_player)222*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jint JNICALL Java_org_hyphonate_megaaudio_player_OboePlayer_getSharingModeN(
223*b7c941bbSAndroid Build Coastguard Worker             JNIEnv *env, jobject thiz, jlong native_player) {
224*b7c941bbSAndroid Build Coastguard Worker     return ((OboePlayer*)(native_player))->getSharingMode();
225*b7c941bbSAndroid Build Coastguard Worker }
226*b7c941bbSAndroid Build Coastguard Worker 
Java_org_hyphonate_megaaudio_player_OboePlayer_getChannelCountN(JNIEnv * env,jobject thiz,jlong native_player)227*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jint JNICALL Java_org_hyphonate_megaaudio_player_OboePlayer_getChannelCountN(
228*b7c941bbSAndroid Build Coastguard Worker             JNIEnv *env, jobject thiz, jlong native_player) {
229*b7c941bbSAndroid Build Coastguard Worker     return ((OboePlayer*)(native_player))->getChannelCount();
230*b7c941bbSAndroid Build Coastguard Worker }
231*b7c941bbSAndroid Build Coastguard Worker 
Java_org_hyphonate_megaaudio_player_OboePlayer_isMMapN(JNIEnv * env,jobject thiz,jlong native_player)232*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jboolean JNICALL Java_org_hyphonate_megaaudio_player_OboePlayer_isMMapN(
233*b7c941bbSAndroid Build Coastguard Worker             JNIEnv *env, jobject thiz, jlong native_player) {
234*b7c941bbSAndroid Build Coastguard Worker     return ((OboePlayer*)(native_player))->isMMap();
235*b7c941bbSAndroid Build Coastguard Worker }
236*b7c941bbSAndroid Build Coastguard Worker 
Java_org_hyphonate_megaaudio_player_OboePlayer_getTimestampN(JNIEnv * env,jobject thiz,jlong native_player,jobject timestamp)237*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jboolean JNICALL Java_org_hyphonate_megaaudio_player_OboePlayer_getTimestampN(
238*b7c941bbSAndroid Build Coastguard Worker             JNIEnv *env, jobject thiz, jlong native_player, jobject timestamp) {
239*b7c941bbSAndroid Build Coastguard Worker     return ((OboePlayer*)native_player)->getJavaTimestamp(timestamp);
240*b7c941bbSAndroid Build Coastguard Worker }
241*b7c941bbSAndroid Build Coastguard Worker 
Java_org_hyphonate_megaaudio_player_OboePlayer_getStreamStateN(JNIEnv * env,jobject thiz,jlong native_player)242*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jint JNICALL Java_org_hyphonate_megaaudio_player_OboePlayer_getStreamStateN(
243*b7c941bbSAndroid Build Coastguard Worker             JNIEnv *env, jobject thiz, jlong native_player) {
244*b7c941bbSAndroid Build Coastguard Worker     return (int)((OboePlayer*)(native_player))->getState();
245*b7c941bbSAndroid Build Coastguard Worker }
246*b7c941bbSAndroid Build Coastguard Worker 
Java_org_hyphonate_megaaudio_player_OboePlayer_getLastErrorCallbackResultN(JNIEnv * env,jobject thiz,jlong native_player)247*b7c941bbSAndroid Build Coastguard Worker JNIEXPORT jint JNICALL Java_org_hyphonate_megaaudio_player_OboePlayer_getLastErrorCallbackResultN(
248*b7c941bbSAndroid Build Coastguard Worker             JNIEnv *env, jobject thiz, jlong native_player) {
249*b7c941bbSAndroid Build Coastguard Worker     return (int)((OboePlayer*)(native_player))->getLastErrorCallbackResult();
250*b7c941bbSAndroid Build Coastguard Worker }
251*b7c941bbSAndroid Build Coastguard Worker 
252*b7c941bbSAndroid Build Coastguard Worker } // extern "C"
253