| Index: webrtc/voice_engine/test/android/android_test/jni/android_test.cc
|
| diff --git a/webrtc/voice_engine/test/android/android_test/jni/android_test.cc b/webrtc/voice_engine/test/android/android_test/jni/android_test.cc
|
| deleted file mode 100644
|
| index 766b9e7a8ec51437751fdb48b508f7d99d4c8c7d..0000000000000000000000000000000000000000
|
| --- a/webrtc/voice_engine/test/android/android_test/jni/android_test.cc
|
| +++ /dev/null
|
| @@ -1,1331 +0,0 @@
|
| -/*
|
| - * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license
|
| - * that can be found in the LICENSE file in the root of the source
|
| - * tree. An additional intellectual property rights grant can be found
|
| - * in the file PATENTS. All contributing project authors may
|
| - * be found in the AUTHORS file in the root of the source tree.
|
| - */
|
| -
|
| -#include <android/log.h>
|
| -#include <stdio.h>
|
| -#include <string.h>
|
| -#include <unistd.h>
|
| -
|
| -#include "webrtc/voice_engine/test/android/android_test/jni/org_webrtc_voiceengine_test_AndroidTest.h"
|
| -
|
| -#include "webrtc/base/platform_thread.h"
|
| -
|
| -#include "webrtc/voice_engine/include/voe_audio_processing.h"
|
| -#include "webrtc/voice_engine/include/voe_base.h"
|
| -#include "webrtc/voice_engine/include/voe_codec.h"
|
| -#include "webrtc/voice_engine/include/voe_file.h"
|
| -#include "webrtc/voice_engine/include/voe_hardware.h"
|
| -#include "webrtc/voice_engine/include/voe_network.h"
|
| -#include "webrtc/voice_engine/include/voe_rtp_rtcp.h"
|
| -#include "webrtc/voice_engine/include/voe_volume_control.h"
|
| -
|
| -#include "webrtc/voice_engine/test/auto_test/voe_test_interface.h"
|
| -
|
| -//#define INIT_FROM_THREAD
|
| -//#define START_CALL_FROM_THREAD
|
| -
|
| -#define WEBRTC_LOG_TAG "*WEBRTCN*" // As in WEBRTC Native...
|
| -#define VALIDATE_BASE_POINTER \
|
| - if (!veData1.base) \
|
| - { \
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG, \
|
| - "Base pointer doesn't exist"); \
|
| - return -1; \
|
| - }
|
| -#define VALIDATE_CODEC_POINTER \
|
| - if (!veData1.codec) \
|
| - { \
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG, \
|
| - "Codec pointer doesn't exist"); \
|
| - return -1; \
|
| - }
|
| -#define VALIDATE_FILE_POINTER \
|
| - if (!veData1.file) \
|
| - { \
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG, \
|
| - "File pointer doesn't exist"); \
|
| - return -1; \
|
| - }
|
| -#define VALIDATE_NETWORK_POINTER \
|
| - if (!veData1.netw) \
|
| - { \
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG, \
|
| - "Network pointer doesn't exist"); \
|
| - return -1; \
|
| - }
|
| -#define VALIDATE_APM_POINTER \
|
| - if (!veData1.codec) \
|
| - { \
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG, \
|
| - "Apm pointer doesn't exist"); \
|
| - return -1; \
|
| - }
|
| -#define VALIDATE_VOLUME_POINTER \
|
| - if (!veData1.volume) \
|
| - { \
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG, \
|
| - "Volume pointer doesn't exist"); \
|
| - return -1; \
|
| - }
|
| -#define VALIDATE_HARDWARE_POINTER \
|
| - if (!veData1.hardware) \
|
| - { \
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG, \
|
| - "Hardware pointer doesn't exist"); \
|
| - return -1; \
|
| - }
|
| -#define VALIDATE_RTP_RTCP_POINTER \
|
| - if (!veData1.rtp_rtcp) \
|
| - { \
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG, \
|
| - "RTP / RTCP pointer doesn't exist"); \
|
| - return -1; \
|
| - }
|
| -
|
| -// Register functions in JNI_OnLoad()
|
| -// How do we ensure that VoE is deleted? JNI_OnUnload?
|
| -// What happens if class is unloaded? When loaded again, NativeInit will be
|
| -// called again. Keep what we have?
|
| -// Should we do something in JNI_OnUnload?
|
| -// General design: create a class or keep global struct with "C" functions?
|
| -// Otherwise make sure symbols are as unique as possible.
|
| -
|
| -// TestType enumerator
|
| -enum TestType
|
| -{
|
| - Invalid = -1,
|
| - Standard = 0,
|
| - Extended = 1,
|
| - Stress = 2,
|
| - Unit = 3,
|
| - CPU = 4
|
| -};
|
| -
|
| -using namespace webrtc;
|
| -
|
| -class my_transportation;
|
| -
|
| -// VoiceEngine data struct
|
| -typedef struct
|
| -{
|
| - // VoiceEngine
|
| - VoiceEngine* ve;
|
| - // Sub-APIs
|
| - VoEBase* base;
|
| - VoECodec* codec;
|
| - VoEFile* file;
|
| - VoENetwork* netw;
|
| - VoEAudioProcessing* apm;
|
| - VoEVolumeControl* volume;
|
| - VoEHardware* hardware;
|
| - VoERTP_RTCP* rtp_rtcp;
|
| - // Other
|
| - my_transportation* extTrans;
|
| - JavaVM* jvm;
|
| -} VoiceEngineData;
|
| -
|
| -// my_transportation is used when useExtTrans is enabled
|
| -class my_transportation : public Transport
|
| -{
|
| - public:
|
| - my_transportation(VoENetwork * network) :
|
| - netw(network) {
|
| - }
|
| -
|
| - int SendPacket(int channel, const void* data, size_t len) override;
|
| - int SendRTCPPacket(int channel, const void* data, size_t len) override;
|
| -
|
| - private:
|
| - VoENetwork * netw;
|
| -};
|
| -
|
| -int my_transportation::SendPacket(int channel, const void *data, size_t len)
|
| -{
|
| - netw->ReceivedRTPPacket(channel, data, len);
|
| - return len;
|
| -}
|
| -
|
| -int my_transportation::SendRTCPPacket(int channel, const void *data, size_t len)
|
| -{
|
| - netw->ReceivedRTCPPacket(channel, data, len);
|
| - return len;
|
| -}
|
| -
|
| -//Global variables visible in this file
|
| -static VoiceEngineData veData1;
|
| -static VoiceEngineData veData2;
|
| -
|
| -// "Local" functions (i.e. not Java accessible)
|
| -static bool GetSubApis(VoiceEngineData &veData);
|
| -static bool ReleaseSubApis(VoiceEngineData &veData);
|
| -
|
| -class ThreadTest
|
| -{
|
| -public:
|
| - ThreadTest();
|
| - ~ThreadTest();
|
| - int RunTest();
|
| - int CloseTest();
|
| -private:
|
| - static bool Run(void* ptr);
|
| - bool Process();
|
| -private:
|
| - rtc::PlatformThread _thread;
|
| -};
|
| -
|
| -ThreadTest::~ThreadTest()
|
| -{
|
| - if (_thread)
|
| - _thread->Stop();
|
| -}
|
| -
|
| -ThreadTest::ThreadTest()
|
| -{
|
| - _thread(Run, this, "ThreadTest thread");
|
| -}
|
| -
|
| -bool ThreadTest::Run(void* ptr)
|
| -{
|
| - return static_cast<ThreadTest*> (ptr)->Process();
|
| -}
|
| -
|
| -bool ThreadTest::Process()
|
| -{
|
| - // Attach this thread to JVM
|
| - /*JNIEnv* env = NULL;
|
| - jint res = veData1.jvm->AttachCurrentThread(&env, NULL);
|
| - char msg[32];
|
| - sprintf(msg, "res=%d, env=%d", res, env);
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG, msg);*/
|
| -
|
| -#ifdef INIT_FROM_THREAD
|
| - VALIDATE_BASE_POINTER;
|
| - veData1.base->Init();
|
| -#endif
|
| -
|
| -#ifdef START_CALL_FROM_THREAD
|
| - // receiving instance
|
| - veData2.ve = VoiceEngine::Create();
|
| - GetSubApis(veData2);
|
| - veData2.base->Init();
|
| - veData2.base->CreateChannel();
|
| - if(veData2.base->SetLocalReceiver(0, 1234) < 0)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "set local receiver 2 failed");
|
| - }
|
| - veData2.volume->SetSpeakerVolume(204);
|
| - veData2.base->StartReceive(0);
|
| - if(veData2.base->StartPlayout(0) < 0)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "start playout failed");
|
| - }
|
| -
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "receiving instance started from thread");
|
| -
|
| - // sending instance
|
| - veData1.ve = VoiceEngine::Create();
|
| - GetSubApis(veData1);
|
| - veData1.base->Init();
|
| - if(veData1.base->CreateChannel() < 0)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "create channel failed");
|
| - }
|
| - if(veData1.base->SetLocalReceiver(0, 1256) < 0)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "set local receiver failed");
|
| - }
|
| - if(veData1.base->SetSendDestination(0, 1234, "127.0.0.1") < 0)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "set send destination failed");
|
| - }
|
| - if(veData1.base->StartSend(0) < 0)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "start send failed");
|
| - }
|
| -
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "sending instance started from thread");
|
| -#endif
|
| -
|
| - _thread->Stop();
|
| -
|
| - //res = veData1.jvm->DetachCurrentThread();
|
| -
|
| - return true;
|
| -}
|
| -
|
| -int ThreadTest::RunTest()
|
| -{
|
| - if (_thread)
|
| - {
|
| - _thread->Start();
|
| - }
|
| - return 0;
|
| -}
|
| -
|
| -int ThreadTest::CloseTest()
|
| -{
|
| - VALIDATE_BASE_POINTER
|
| -
|
| - veData1.base->DeleteChannel(0);
|
| - veData2.base->DeleteChannel(0);
|
| - veData1.base->Terminate();
|
| - veData2.base->Terminate();
|
| -
|
| - // Release sub-APIs
|
| - ReleaseSubApis(veData1);
|
| - ReleaseSubApis(veData2);
|
| -
|
| - // Delete
|
| - VoiceEngine::Delete(veData1.ve);
|
| - VoiceEngine::Delete(veData2.ve);
|
| - veData2.ve = NULL;
|
| - veData2.ve = NULL;
|
| -
|
| - return 0;
|
| -}
|
| -
|
| -ThreadTest threadTest;
|
| -
|
| -//////////////////////////////////////////////////////////////////
|
| -// General functions
|
| -//////////////////////////////////////////////////////////////////
|
| -
|
| -/////////////////////////////////////////////
|
| -// JNI_OnLoad
|
| -//
|
| -jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/)
|
| -{
|
| - if (!vm)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "JNI_OnLoad did not receive a valid VM pointer");
|
| - return -1;
|
| - }
|
| -
|
| - // Get JNI
|
| - JNIEnv* env;
|
| - if (JNI_OK != vm->GetEnv(reinterpret_cast<void**> (&env),
|
| - JNI_VERSION_1_4))
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "JNI_OnLoad could not get JNI env");
|
| - return -1;
|
| - }
|
| -
|
| - // Get class to register the native functions with
|
| - // jclass regClass = env->FindClass("webrtc/android/AndroidTest");
|
| - // if (!regClass) {
|
| - // return -1; // Exception thrown
|
| - // }
|
| -
|
| - // Register native functions
|
| - // JNINativeMethod methods[1];
|
| - // methods[0].name = NULL;
|
| - // methods[0].signature = NULL;
|
| - // methods[0].fnPtr = NULL;
|
| - // if (JNI_OK != env->RegisterNatives(regClass, methods, 1))
|
| - // {
|
| - // return -1;
|
| - // }
|
| -
|
| - // Init VoiceEngine data
|
| - memset(&veData1, 0, sizeof(veData1));
|
| - memset(&veData2, 0, sizeof(veData2));
|
| -
|
| - // Store the JVM
|
| - veData1.jvm = vm;
|
| - veData2.jvm = vm;
|
| -
|
| - return JNI_VERSION_1_4;
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// Native initialization
|
| -//
|
| -JNIEXPORT jboolean JNICALL
|
| -Java_org_webrtc_voiceengine_test_AndroidTest_NativeInit(
|
| - JNIEnv * env,
|
| - jclass)
|
| -{
|
| - // Look up and cache any interesting class, field and method IDs for
|
| - // any used java class here
|
| -
|
| - return true;
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// Run auto standard test
|
| -//
|
| -JNIEXPORT jint JNICALL Java_org_webrtc_voiceengine_test_AndroidTest_RunAutoTest(
|
| - JNIEnv *env,
|
| - jobject context,
|
| - jint testType,
|
| - jint extendedSel)
|
| -{
|
| - TestType tType(Invalid);
|
| -
|
| - switch (testType)
|
| - {
|
| - case 0:
|
| - return 0;
|
| - case 1:
|
| - tType = Standard;
|
| - break;
|
| - case 2:
|
| - tType = Extended;
|
| - break;
|
| - case 3:
|
| - tType = Stress;
|
| - break;
|
| - case 4:
|
| - tType = Unit;
|
| - break;
|
| - default:
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "RunAutoTest - Invalid TestType");
|
| - return -1;
|
| - }
|
| -
|
| - // Set instance independent Java objects
|
| - VoiceEngine::SetAndroidObjects(veData1.jvm, env, context);
|
| -
|
| - // Call voe test interface function
|
| - // TODO(leozwang) add autotest setAndroidObjects(veData1.jvm, context);
|
| - // jint retVal = runAutoTest(tType);
|
| -
|
| - // Clear instance independent Java objects
|
| - VoiceEngine::SetAndroidObjects(NULL, NULL, NULL);
|
| -
|
| - return 0;
|
| -}
|
| -
|
| -//////////////////////////////////////////////////////////////////
|
| -// VoiceEngine API wrapper functions
|
| -//////////////////////////////////////////////////////////////////
|
| -
|
| -/////////////////////////////////////////////
|
| -// Create VoiceEngine instance
|
| -//
|
| -JNIEXPORT jboolean JNICALL Java_org_webrtc_voiceengine_test_AndroidTest_Create(
|
| - JNIEnv *env,
|
| - jobject context)
|
| -{
|
| - // Check if already created
|
| - if (veData1.ve)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "VoE already created");
|
| - return false;
|
| - }
|
| -
|
| - // Set instance independent Java objects
|
| - VoiceEngine::SetAndroidObjects(veData1.jvm, env, context);
|
| -
|
| -#ifdef START_CALL_FROM_THREAD
|
| - threadTest.RunTest();
|
| -#else
|
| - // Create
|
| - veData1.ve = VoiceEngine::Create();
|
| - if (!veData1.ve)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Create VoE failed");
|
| - return false;
|
| - }
|
| -
|
| - // Get sub-APIs
|
| - if (!GetSubApis(veData1))
|
| - {
|
| - // If not OK, release all sub-APIs and delete VoE
|
| - ReleaseSubApis(veData1);
|
| - if (!VoiceEngine::Delete(veData1.ve))
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Delete VoE failed");
|
| - }
|
| - return false;
|
| - }
|
| -#endif
|
| -
|
| - return true;
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// Delete VoiceEngine instance
|
| -//
|
| -JNIEXPORT jboolean JNICALL Java_org_webrtc_voiceengine_test_AndroidTest_Delete(
|
| - JNIEnv *,
|
| - jobject)
|
| -{
|
| -#ifdef START_CALL_FROM_THREAD
|
| - threadTest.CloseTest();
|
| -#else
|
| - // Check if exists
|
| - if (!veData1.ve)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "VoE does not exist");
|
| - return false;
|
| - }
|
| -
|
| - // Release sub-APIs
|
| - ReleaseSubApis(veData1);
|
| -
|
| - // Delete
|
| - if (!VoiceEngine::Delete(veData1.ve))
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Delete VoE failed");
|
| - return false;
|
| - }
|
| -
|
| - veData1.ve = NULL;
|
| -#endif
|
| -
|
| - // Clear instance independent Java objects
|
| - VoiceEngine::SetAndroidObjects(NULL, NULL, NULL);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [Base] Initialize VoiceEngine
|
| -//
|
| -JNIEXPORT jint JNICALL Java_org_webrtc_voiceengine_test_AndroidTest_Init(
|
| - JNIEnv *,
|
| - jobject,
|
| - jboolean enableTrace,
|
| - jboolean useExtTrans)
|
| -{
|
| - VALIDATE_BASE_POINTER;
|
| -
|
| - if (enableTrace)
|
| - {
|
| - if (0 != VoiceEngine::SetTraceFile("/sdcard/trace.txt"))
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Could not enable trace");
|
| - }
|
| - if (0 != VoiceEngine::SetTraceFilter(kTraceAll))
|
| - {
|
| - __android_log_write(ANDROID_LOG_WARN, WEBRTC_LOG_TAG,
|
| - "Could not set trace filter");
|
| - }
|
| - }
|
| -
|
| - if (useExtTrans)
|
| - {
|
| - VALIDATE_NETWORK_POINTER;
|
| - veData1.extTrans = new my_transportation(veData1.netw);
|
| - }
|
| -
|
| - int retVal = 0;
|
| -#ifdef INIT_FROM_THREAD
|
| - threadTest.RunTest();
|
| - usleep(200000);
|
| -#else
|
| - retVal = veData1.base->Init();
|
| -#endif
|
| - return retVal;
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [Base] Terminate VoiceEngine
|
| -//
|
| -JNIEXPORT jint JNICALL Java_org_webrtc_voiceengine_test_AndroidTest_Terminate(
|
| - JNIEnv *,
|
| - jobject)
|
| -{
|
| - VALIDATE_BASE_POINTER;
|
| -
|
| - jint retVal = veData1.base->Terminate();
|
| -
|
| - delete veData1.extTrans;
|
| - veData1.extTrans = NULL;
|
| -
|
| - return retVal;
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [Base] Create channel
|
| -//
|
| -JNIEXPORT jint JNICALL
|
| -Java_org_webrtc_voiceengine_test_AndroidTest_CreateChannel(
|
| - JNIEnv *,
|
| - jobject)
|
| -{
|
| - VALIDATE_BASE_POINTER;
|
| - jint channel = veData1.base->CreateChannel();
|
| -
|
| - if (veData1.extTrans)
|
| - {
|
| - VALIDATE_NETWORK_POINTER;
|
| - __android_log_print(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
|
| - "Enabling external transport on channel %d",
|
| - channel);
|
| - if (veData1.netw->RegisterExternalTransport(channel, *veData1.extTrans)
|
| - < 0)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Could not set external transport");
|
| - return -1;
|
| - }
|
| - }
|
| -
|
| - return channel;
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [Base] Delete channel
|
| -//
|
| -JNIEXPORT jint JNICALL
|
| -Java_org_webrtc_voiceengine_test_AndroidTest_DeleteChannel(
|
| - JNIEnv *,
|
| - jobject,
|
| - jint channel)
|
| -{
|
| - VALIDATE_BASE_POINTER;
|
| - return veData1.base->DeleteChannel(channel);
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [Base] SetLocalReceiver
|
| -JNIEXPORT jint JNICALL
|
| -Java_org_webrtc_voiceengine_test_AndroidTest_SetLocalReceiver(
|
| - JNIEnv *,
|
| - jobject,
|
| - jint channel,
|
| - jint port)
|
| -{
|
| - VALIDATE_BASE_POINTER;
|
| - return veData1.base->SetLocalReceiver(channel, port);
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [Base] SetSendDestination
|
| -//
|
| -JNIEXPORT jint JNICALL
|
| -Java_org_webrtc_voiceengine_test_AndroidTest_SetSendDestination(
|
| - JNIEnv *env,
|
| - jobject,
|
| - jint channel,
|
| - jint port,
|
| - jstring ipaddr)
|
| -{
|
| - VALIDATE_BASE_POINTER;
|
| -
|
| - const char* ipaddrNative = env->GetStringUTFChars(ipaddr, NULL);
|
| - if (!ipaddrNative)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Could not get UTF string");
|
| - return -1;
|
| - }
|
| -
|
| - jint retVal = veData1.base->SetSendDestination(channel, port, ipaddrNative);
|
| -
|
| - env->ReleaseStringUTFChars(ipaddr, ipaddrNative);
|
| -
|
| - return retVal;
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [Base] StartListen
|
| -//
|
| -JNIEXPORT jint JNICALL Java_org_webrtc_voiceengine_test_AndroidTest_StartListen(
|
| - JNIEnv *,
|
| - jobject,
|
| - jint channel)
|
| -{
|
| - VALIDATE_BASE_POINTER;
|
| - int retVal = veData1.base->StartReceive(channel);
|
| -
|
| - return retVal;
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [Base] Start playout
|
| -//
|
| -JNIEXPORT jint JNICALL
|
| -Java_org_webrtc_voiceengine_test_AndroidTest_StartPlayout(
|
| - JNIEnv *,
|
| - jobject,
|
| - jint channel)
|
| -{
|
| - VALIDATE_BASE_POINTER;
|
| - int retVal = veData1.base->StartPlayout(channel);
|
| -
|
| - return retVal;
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [Base] Start send
|
| -//
|
| -JNIEXPORT jint JNICALL Java_org_webrtc_voiceengine_test_AndroidTest_StartSend(
|
| - JNIEnv *,
|
| - jobject,
|
| - jint channel)
|
| -{
|
| - /* int dscp(0), serviceType(-1), overrideDscp(0), res(0);
|
| - bool gqosEnabled(false), useSetSockOpt(false);
|
| -
|
| - if (veData1.netw->SetSendTOS(channel, 13, useSetSockOpt) != 0)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Failed to set TOS");
|
| - return -1;
|
| - }
|
| -
|
| - res = veData1.netw->GetSendTOS(channel, dscp, useSetSockOpt);
|
| - if (res != 0 || dscp != 13 || useSetSockOpt != true)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Failed to get TOS");
|
| - return -1;
|
| - } */
|
| -
|
| - /* if (veData1.rtp_rtcp->SetREDStatus(channel, 1) != 0)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Failed to enable RED");
|
| - return -1;
|
| - } */
|
| -
|
| - VALIDATE_BASE_POINTER;
|
| - int retVal = veData1.base->StartSend(channel);
|
| -
|
| - return retVal;
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [Base] Stop listen
|
| -//
|
| -JNIEXPORT jint JNICALL Java_org_webrtc_voiceengine_test_AndroidTest_StopListen(
|
| - JNIEnv *,
|
| - jobject,
|
| - jint channel)
|
| -{
|
| - VALIDATE_BASE_POINTER;
|
| - return veData1.base->StopReceive(channel);
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [Base] Stop playout
|
| -//
|
| -JNIEXPORT jint JNICALL Java_org_webrtc_voiceengine_test_AndroidTest_StopPlayout(
|
| - JNIEnv *,
|
| - jobject,
|
| - jint channel)
|
| -{
|
| - VALIDATE_BASE_POINTER;
|
| - return veData1.base->StopPlayout(channel);
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [Base] Stop send
|
| -//
|
| -JNIEXPORT jint JNICALL Java_org_webrtc_voiceengine_test_AndroidTest_StopSend(
|
| - JNIEnv *,
|
| - jobject,
|
| - jint channel)
|
| -{
|
| - /* if (veData1.rtp_rtcp->SetREDStatus(channel, 0) != 0)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Failed to disable RED");
|
| - return -1;
|
| - } */
|
| -
|
| - VALIDATE_BASE_POINTER;
|
| - return veData1.base->StopSend(channel);
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [codec] Number of codecs
|
| -//
|
| -JNIEXPORT jint JNICALL Java_org_webrtc_voiceengine_test_AndroidTest_NumOfCodecs(
|
| - JNIEnv *,
|
| - jobject)
|
| -{
|
| - VALIDATE_CODEC_POINTER;
|
| - return veData1.codec->NumOfCodecs();
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [codec] Set send codec
|
| -//
|
| -JNIEXPORT jint JNICALL
|
| -Java_org_webrtc_voiceengine_test_AndroidTest_SetSendCodec(
|
| - JNIEnv *,
|
| - jobject,
|
| - jint channel,
|
| - jint index)
|
| -{
|
| - VALIDATE_CODEC_POINTER;
|
| -
|
| - CodecInst codec;
|
| -
|
| - if (veData1.codec->GetCodec(index, codec) != 0)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Failed to get codec");
|
| - return -1;
|
| - }
|
| -
|
| - return veData1.codec->SetSendCodec(channel, codec);
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [codec] Set VAD status
|
| -//
|
| -JNIEXPORT jint JNICALL
|
| -Java_org_webrtc_voiceengine_test_AndroidTest_SetVADStatus(
|
| - JNIEnv *,
|
| - jobject,
|
| - jint channel,
|
| - jboolean enable,
|
| - jint mode)
|
| -{
|
| - VALIDATE_CODEC_POINTER;
|
| -
|
| - VadModes VADmode = kVadConventional;
|
| -
|
| - switch (mode)
|
| - {
|
| - case 0:
|
| - break; // already set
|
| - case 1:
|
| - VADmode = kVadAggressiveLow;
|
| - break;
|
| - case 2:
|
| - VADmode = kVadAggressiveMid;
|
| - break;
|
| - case 3:
|
| - VADmode = kVadAggressiveHigh;
|
| - break;
|
| - default:
|
| - VADmode = (VadModes) 17; // force error
|
| - break;
|
| - }
|
| -
|
| - return veData1.codec->SetVADStatus(channel, enable, VADmode);
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [apm] SetNSStatus
|
| -//
|
| -JNIEXPORT jint JNICALL Java_org_webrtc_voiceengine_test_AndroidTest_SetNSStatus(
|
| - JNIEnv *,
|
| - jobject,
|
| - jboolean enable,
|
| - jint mode)
|
| -{
|
| - VALIDATE_APM_POINTER;
|
| -
|
| - NsModes NSmode = kNsDefault;
|
| -
|
| - switch (mode)
|
| - {
|
| - case 0:
|
| - NSmode = kNsUnchanged;
|
| - break;
|
| - case 1:
|
| - break; // already set
|
| - case 2:
|
| - NSmode = kNsConference;
|
| - break;
|
| - case 3:
|
| - NSmode = kNsLowSuppression;
|
| - break;
|
| - case 4:
|
| - NSmode = kNsModerateSuppression;
|
| - break;
|
| - case 5:
|
| - NSmode = kNsHighSuppression;
|
| - break;
|
| - case 6:
|
| - NSmode = kNsVeryHighSuppression;
|
| - break;
|
| - default:
|
| - NSmode = (NsModes) 17; // force error
|
| - break;
|
| - }
|
| -
|
| - return veData1.apm->SetNsStatus(enable, NSmode);
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [apm] SetAGCStatus
|
| -//
|
| -JNIEXPORT jint JNICALL
|
| -Java_org_webrtc_voiceengine_test_AndroidTest_SetAGCStatus(
|
| - JNIEnv *,
|
| - jobject,
|
| - jboolean enable,
|
| - jint mode)
|
| -{
|
| - VALIDATE_APM_POINTER;
|
| -
|
| - AgcModes AGCmode = kAgcDefault;
|
| -
|
| - switch (mode)
|
| - {
|
| - case 0:
|
| - AGCmode = kAgcUnchanged;
|
| - break;
|
| - case 1:
|
| - break; // already set
|
| - case 2:
|
| - AGCmode = kAgcAdaptiveAnalog;
|
| - break;
|
| - case 3:
|
| - AGCmode = kAgcAdaptiveDigital;
|
| - break;
|
| - case 4:
|
| - AGCmode = kAgcFixedDigital;
|
| - break;
|
| - default:
|
| - AGCmode = (AgcModes) 17; // force error
|
| - break;
|
| - }
|
| -
|
| - /* AgcConfig agcConfig;
|
| - agcConfig.targetLeveldBOv = 3;
|
| - agcConfig.digitalCompressionGaindB = 50;
|
| - agcConfig.limiterEnable = 0;
|
| -
|
| - if (veData1.apm->SetAGCConfig(agcConfig) != 0)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Failed to set AGC config");
|
| - return -1;
|
| - } */
|
| -
|
| - return veData1.apm->SetAgcStatus(enable, AGCmode);
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [apm] SetECStatus
|
| -//
|
| -JNIEXPORT jint JNICALL Java_org_webrtc_voiceengine_test_AndroidTest_SetECStatus(
|
| - JNIEnv *,
|
| - jobject,
|
| - jboolean enable,
|
| - jint mode)
|
| -{
|
| - VALIDATE_APM_POINTER;
|
| -
|
| - EcModes ECmode = kEcDefault;
|
| -
|
| - switch (mode)
|
| - {
|
| - case 0:
|
| - ECmode = kEcDefault;
|
| - break;
|
| - case 1:
|
| - break; // already set
|
| - case 2:
|
| - ECmode = kEcConference;
|
| - break;
|
| - case 3:
|
| - ECmode = kEcAec;
|
| - break;
|
| - case 4:
|
| - ECmode = kEcAecm;
|
| - break;
|
| - default:
|
| - ECmode = (EcModes) 17; // force error
|
| - break;
|
| - }
|
| -
|
| - return veData1.apm->SetEcStatus(enable, ECmode);
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [File] Start play file locally
|
| -//
|
| -JNIEXPORT jint JNICALL
|
| -Java_org_webrtc_voiceengine_test_AndroidTest_StartPlayingFileLocally(
|
| - JNIEnv * env,
|
| - jobject,
|
| - jint channel,
|
| - jstring fileName,
|
| - jboolean loop)
|
| -{
|
| - VALIDATE_FILE_POINTER;
|
| -
|
| - const char* fileNameNative = env->GetStringUTFChars(fileName, NULL);
|
| - if (!fileNameNative)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Could not get UTF string");
|
| - return -1;
|
| - }
|
| -
|
| - jint retVal = veData1.file->StartPlayingFileLocally(channel,
|
| - fileNameNative, loop);
|
| -
|
| - env->ReleaseStringUTFChars(fileName, fileNameNative);
|
| -
|
| - return retVal;
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [File] Stop play file locally
|
| -//
|
| -JNIEXPORT jint JNICALL
|
| -Java_org_webrtc_voiceengine_test_AndroidTest_StopPlayingFileLocally(
|
| - JNIEnv *,
|
| - jobject,
|
| - jint channel)
|
| -{
|
| - VALIDATE_FILE_POINTER;
|
| - return veData1.file->StopPlayingFileLocally(channel);
|
| -}
|
| -
|
| -/*
|
| - * Class: org_webrtc_voiceengine_test_AndroidTest
|
| - * Method: StartRecordingPlayout
|
| - * Signature: (ILjava/lang/String;Z)I
|
| - */
|
| -JNIEXPORT jint JNICALL
|
| -Java_org_webrtc_voiceengine_test_AndroidTest_StartRecordingPlayout(
|
| - JNIEnv * env,
|
| - jobject,
|
| - jint channel,
|
| - jstring fileName,
|
| - jboolean)
|
| -{
|
| - VALIDATE_FILE_POINTER;
|
| -
|
| - const char* fileNameNative = env->GetStringUTFChars(fileName, NULL);
|
| - if (!fileNameNative)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Could not get UTF string");
|
| - return -1;
|
| - }
|
| -
|
| - jint retVal = veData1.file->StartRecordingPlayout(channel, fileNameNative,
|
| - 0);
|
| -
|
| - env->ReleaseStringUTFChars(fileName, fileNameNative);
|
| -
|
| - return retVal;
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [File] Stop Recording Playout
|
| -//
|
| -JNIEXPORT jint JNICALL
|
| -Java_org_webrtc_voiceengine_test_AndroidTest_StopRecordingPlayout(
|
| - JNIEnv *,
|
| - jobject,
|
| - jint channel)
|
| -{
|
| - VALIDATE_FILE_POINTER;
|
| - return veData1.file->StopRecordingPlayout(channel);
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [File] Start playing file as microphone
|
| -//
|
| -JNIEXPORT jint JNICALL
|
| -Java_org_webrtc_voiceengine_test_AndroidTest_StartPlayingFileAsMicrophone(
|
| - JNIEnv *env,
|
| - jobject,
|
| - jint channel,
|
| - jstring fileName,
|
| - jboolean loop)
|
| -{
|
| - VALIDATE_FILE_POINTER;
|
| -
|
| - const char* fileNameNative = env->GetStringUTFChars(fileName, NULL);
|
| - if (!fileNameNative)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Could not get UTF string");
|
| - return -1;
|
| - }
|
| -
|
| - jint retVal = veData1.file->StartPlayingFileAsMicrophone(channel,
|
| - fileNameNative,
|
| - loop);
|
| -
|
| - env->ReleaseStringUTFChars(fileName, fileNameNative);
|
| -
|
| - return retVal;
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [File] Stop playing file as microphone
|
| -//
|
| -JNIEXPORT jint JNICALL
|
| -Java_org_webrtc_voiceengine_test_AndroidTest_StopPlayingFileAsMicrophone(
|
| - JNIEnv *,
|
| - jobject,
|
| - jint channel)
|
| -{
|
| - VALIDATE_FILE_POINTER;
|
| - return veData1.file->StopPlayingFileAsMicrophone(channel);
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// [Volume] Set speaker volume
|
| -//
|
| -JNIEXPORT jint JNICALL
|
| -Java_org_webrtc_voiceengine_test_AndroidTest_SetSpeakerVolume(
|
| - JNIEnv *,
|
| - jobject,
|
| - jint level)
|
| -{
|
| - VALIDATE_VOLUME_POINTER;
|
| - if (veData1.volume->SetSpeakerVolume(level) != 0)
|
| - {
|
| - return -1;
|
| - }
|
| -
|
| - unsigned int storedVolume = 0;
|
| - if (veData1.volume->GetSpeakerVolume(storedVolume) != 0)
|
| - {
|
| - return -1;
|
| - }
|
| -
|
| - if (storedVolume != level)
|
| - {
|
| - return -1;
|
| - }
|
| -
|
| - return 0;
|
| -}
|
| -
|
| -//////////////////////////////////////////////////////////////////
|
| -// "Local" functions (i.e. not Java accessible)
|
| -//////////////////////////////////////////////////////////////////
|
| -
|
| -/////////////////////////////////////////////
|
| -// Get all sub-APIs
|
| -//
|
| -bool GetSubApis(VoiceEngineData &veData)
|
| -{
|
| - bool getOK = true;
|
| -
|
| - // Base
|
| - veData.base = VoEBase::GetInterface(veData.ve);
|
| - if (!veData.base)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Get base sub-API failed");
|
| - getOK = false;
|
| - }
|
| -
|
| - // Codec
|
| - veData.codec = VoECodec::GetInterface(veData.ve);
|
| - if (!veData.codec)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Get codec sub-API failed");
|
| - getOK = false;
|
| - }
|
| -
|
| - // File
|
| - veData.file = VoEFile::GetInterface(veData.ve);
|
| - if (!veData.file)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Get file sub-API failed");
|
| - getOK = false;
|
| - }
|
| -
|
| - // Network
|
| - veData.netw = VoENetwork::GetInterface(veData.ve);
|
| - if (!veData.netw)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Get network sub-API failed");
|
| - getOK = false;
|
| - }
|
| -
|
| - // AudioProcessing module
|
| - veData.apm = VoEAudioProcessing::GetInterface(veData.ve);
|
| - if (!veData.apm)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Get apm sub-API failed");
|
| - getOK = false;
|
| - }
|
| -
|
| - // Volume
|
| - veData.volume = VoEVolumeControl::GetInterface(veData.ve);
|
| - if (!veData.volume)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Get volume sub-API failed");
|
| - getOK = false;
|
| - }
|
| -
|
| - // Hardware
|
| - veData.hardware = VoEHardware::GetInterface(veData.ve);
|
| - if (!veData.hardware)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Get hardware sub-API failed");
|
| - getOK = false;
|
| - }
|
| -
|
| - // RTP / RTCP
|
| - veData.rtp_rtcp = VoERTP_RTCP::GetInterface(veData.ve);
|
| - if (!veData.rtp_rtcp)
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Get rtp_rtcp sub-API failed");
|
| - getOK = false;
|
| - }
|
| -
|
| - return getOK;
|
| -}
|
| -
|
| -/////////////////////////////////////////////
|
| -// Release all sub-APIs
|
| -//
|
| -bool ReleaseSubApis(VoiceEngineData &veData)
|
| -{
|
| - bool releaseOK = true;
|
| -
|
| - // Base
|
| - if (veData.base)
|
| - {
|
| - if (0 != veData.base->Release())
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Release base sub-API failed");
|
| - releaseOK = false;
|
| - }
|
| - else
|
| - {
|
| - veData.base = NULL;
|
| - }
|
| - }
|
| -
|
| - // Codec
|
| - if (veData.codec)
|
| - {
|
| - if (0 != veData.codec->Release())
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Release codec sub-API failed");
|
| - releaseOK = false;
|
| - }
|
| - else
|
| - {
|
| - veData.codec = NULL;
|
| - }
|
| - }
|
| -
|
| - // File
|
| - if (veData.file)
|
| - {
|
| - if (0 != veData.file->Release())
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Release file sub-API failed");
|
| - releaseOK = false;
|
| - }
|
| - else
|
| - {
|
| - veData.file = NULL;
|
| - }
|
| - }
|
| -
|
| - // Network
|
| - if (veData.netw)
|
| - {
|
| - if (0 != veData.netw->Release())
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Release network sub-API failed");
|
| - releaseOK = false;
|
| - }
|
| - else
|
| - {
|
| - veData.netw = NULL;
|
| - }
|
| - }
|
| -
|
| - // apm
|
| - if (veData.apm)
|
| - {
|
| - if (0 != veData.apm->Release())
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Release apm sub-API failed");
|
| - releaseOK = false;
|
| - }
|
| - else
|
| - {
|
| - veData.apm = NULL;
|
| - }
|
| - }
|
| -
|
| - // Volume
|
| - if (veData.volume)
|
| - {
|
| - if (0 != veData.volume->Release())
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Release volume sub-API failed");
|
| - releaseOK = false;
|
| - }
|
| - else
|
| - {
|
| - veData.volume = NULL;
|
| - }
|
| - }
|
| -
|
| - // Hardware
|
| - if (veData.hardware)
|
| - {
|
| - if (0 != veData.hardware->Release())
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Release hardware sub-API failed");
|
| - releaseOK = false;
|
| - }
|
| - else
|
| - {
|
| - veData.hardware = NULL;
|
| - }
|
| - }
|
| -
|
| - // RTP RTCP
|
| - if (veData.rtp_rtcp)
|
| - {
|
| - if (0 != veData.rtp_rtcp->Release())
|
| - {
|
| - __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
|
| - "Release rtp_rtcp sub-API failed");
|
| - releaseOK = false;
|
| - }
|
| - else
|
| - {
|
| - veData.rtp_rtcp = NULL;
|
| - }
|
| - }
|
| -
|
| - return releaseOK;
|
| -}
|
|
|