forked from CCBlueX/java-cef
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathaudio_handler.cpp
More file actions
118 lines (92 loc) · 3.83 KB
/
audio_handler.cpp
File metadata and controls
118 lines (92 loc) · 3.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// Copyright (c) 2014 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
#include "audio_handler.h"
#include "jni_util.h"
//#include <iostream>
AudioHandler::AudioHandler(JNIEnv* env, jobject handler)
: handle_(env, handler) {}
jobject jniParams(ScopedJNIEnv env, jclass clsProps, const CefAudioParameters& params) {
jclass cls = env->FindClass("org/cef/misc/CefChannelLayout");
if (cls == nullptr) {
// std::cout << "Could not find class 0";
return nullptr;
}
jmethodID getLayout = env->GetStaticMethodID(cls, "forId", "(I)Lorg/cef/misc/CefChannelLayout;");
if (getLayout == 0) {
// std::cout << "Could not find method 0";
return nullptr;
}
jobject layout = env->CallStaticObjectMethod(cls, getLayout, (int) params.channel_layout);
cls = clsProps;
if (cls == nullptr) {
// std::cout << "Could not find class 1";
return nullptr;
}
jmethodID constructor = env->GetMethodID(cls, "<init>", "(Lorg/cef/misc/CefChannelLayout;II)V");
if (constructor == 0) {
// std::cout << "Could not find constructor 1";
return nullptr;
}
jobject parameters = env->NewObject(cls, constructor, layout, params.sample_rate, params.frames_per_buffer);
return parameters;
}
jobject jniParams(ScopedJNIEnv env, const CefAudioParameters& params) {
jclass cls = env->FindClass("org/cef/misc/CefAudioParameters");
return jniParams(env, cls, params);
}
bool AudioHandler::GetAudioParameters(CefRefPtr<CefBrowser> browser,
CefAudioParameters& params) {
ScopedJNIEnv env;
if (!env)
return true;
ScopedJNIBrowser jbrowser(env, browser);
jboolean jreturn = JNI_FALSE;
jclass cls = env->FindClass("org/cef/misc/CefAudioParameters");
jobject paramsJni = jniParams(env, cls, params);
JNI_CALL_METHOD(env, handle_, "getAudioParameters",
"(Lorg/cef/browser/CefBrowser;Lorg/cef/misc/CefAudioParameters;)Z", Boolean,
jreturn, jbrowser.get(), paramsJni);
return (jreturn != JNI_FALSE);
}
void AudioHandler::OnAudioStreamStarted(CefRefPtr<CefBrowser> browser,
const CefAudioParameters& params, int channels) {
ScopedJNIEnv env;
if (!env)
return;
ScopedJNIBrowser jbrowser(env, browser);
JNI_CALL_VOID_METHOD(env, handle_, "onAudioStreamStarted",
"(Lorg/cef/browser/CefBrowser;Lorg/cef/misc/CefAudioParameters;I)V",
jbrowser.get(), nullptr, channels);
}
void AudioHandler::OnAudioStreamPacket(CefRefPtr<CefBrowser> browser, const float** data, int frames, int64_t pts) {
ScopedJNIEnv env;
if (!env)
return;
ScopedJNIBrowser jbrowser(env, browser);
ScopedJNIObjectLocal dataPtr(
env, NewJNIObject(env, "org/cef/misc/DataPointer", "(J)V", (jlong) data));
JNI_CALL_VOID_METHOD(env, handle_, "onAudioStreamPacket",
"(Lorg/cef/browser/CefBrowser;Lorg/cef/misc/DataPointer;IJ)V",
jbrowser.get(), dataPtr.get(), frames, (long long) pts);
}
void AudioHandler::OnAudioStreamStopped(CefRefPtr<CefBrowser> browser) {
ScopedJNIEnv env;
if (!env)
return;
ScopedJNIBrowser jbrowser(env, browser);
JNI_CALL_VOID_METHOD(env, handle_, "onAudioStreamStopped",
"(Lorg/cef/browser/CefBrowser;)V",
jbrowser.get());
}
void AudioHandler::OnAudioStreamError(CefRefPtr<CefBrowser> browser,
const CefString& text) {
ScopedJNIEnv env;
if (!env)
return;
ScopedJNIBrowser jbrowser(env, browser);
ScopedJNIString jtext(env, text);
JNI_CALL_VOID_METHOD(env, handle_, "onAudioStreamError",
"(Lorg/cef/browser/CefBrowser;Ljava/lang/String;)V",
jbrowser.get(), jtext.get());
}