diff --git a/android/app/build.gradle b/android/app/build.gradle
index e58415d..c7a72e1 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -39,6 +39,11 @@ android {
}
}
+androidExtensions {
+ // for @Parcelize
+ experimental = true
+}
+
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 7a79c5c..01d8172 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -2,6 +2,9 @@
+
+
+
+
-
+
+
\ No newline at end of file
diff --git a/android/app/src/main/cpp/chiaki-jni.c b/android/app/src/main/cpp/chiaki-jni.c
index 6c95d7d..64bf535 100644
--- a/android/app/src/main/cpp/chiaki-jni.c
+++ b/android/app/src/main/cpp/chiaki-jni.c
@@ -55,7 +55,7 @@ JNIEXPORT jstring JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_errorCodeToS
return E->NewStringUTF(env, chiaki_error_string((ChiakiErrorCode)value));
}
-JNIEXPORT void JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_createSession(JNIEnv *env, jobject obj, jobject result, jobject connect_info_obj)
+JNIEXPORT void JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionCreate(JNIEnv *env, jobject obj, jobject result, jobject connect_info_obj)
{
ChiakiSession *session = NULL;
ChiakiErrorCode err = CHIAKI_ERR_SUCCESS;
@@ -119,4 +119,10 @@ beach:
free(host_str);
E->SetIntField(env, result, E->GetFieldID(env, result_class, "errorCode", "I"), (jint)err);
E->SetLongField(env, result, E->GetFieldID(env, result_class, "sessionPtr", "J"), (jlong)session);
+}
+
+JNIEXPORT jint JNICALL Java_com_metallic_chiaki_lib_ChiakiNative_sessionStart(JNIEnv *env, jobject obj, jlong ptr)
+{
+ ChiakiSession *session = (ChiakiSession *)ptr;
+ return chiaki_session_start(session);
}
\ No newline at end of file
diff --git a/android/app/src/main/java/com/metallic/chiaki/MainActivity.kt b/android/app/src/main/java/com/metallic/chiaki/MainActivity.kt
index e03e48a..8423c27 100644
--- a/android/app/src/main/java/com/metallic/chiaki/MainActivity.kt
+++ b/android/app/src/main/java/com/metallic/chiaki/MainActivity.kt
@@ -1,11 +1,13 @@
package com.metallic.chiaki
+import android.content.Context
+import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
-import com.metallic.chiaki.lib.ChiakiNative
-import com.metallic.chiaki.lib.ConnectInfo
-import com.metallic.chiaki.lib.ConnectVideoProfile
-import com.metallic.chiaki.lib.ErrorCode
+import android.util.Base64
+import androidx.core.content.edit
+import androidx.core.widget.addTextChangedListener
+import com.metallic.chiaki.lib.*
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity()
@@ -15,12 +17,43 @@ class MainActivity : AppCompatActivity()
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
- val result = ChiakiNative.CreateSessionResult(0, 0)
- ChiakiNative.createSession(result, ConnectInfo("host",
- ByteArray(0x10) { 0 },
- ByteArray(0x10) { 0 },
- ConnectVideoProfile(0, 0, 0, 0)))
+ val prefs = getPreferences(Context.MODE_PRIVATE)
- testTextView.text = "${ErrorCode(0).toString()}\n${result}\n${ErrorCode(result.errorCode)}"
+ hostEditText.setText(prefs.getString("debug_host", ""))
+ registKeyEditText.setText(prefs.getString("debug_regist_key", ""))
+ morningEditText.setText(prefs.getString("debug_morning", ""))
+
+ hostEditText.addTextChangedListener {
+ prefs.edit {
+ putString("debug_host", it?.toString())
+ }
+ }
+
+ registKeyEditText.addTextChangedListener {
+ prefs.edit {
+ putString("debug_regist_key", it?.toString())
+ }
+ }
+
+ morningEditText.addTextChangedListener {
+ prefs.edit {
+ putString("debug_morning", it?.toString())
+ }
+ }
+
+ startButton.setOnClickListener {
+ val registKeyBase = registKeyEditText.text.toString().toByteArray(Charsets.US_ASCII)
+ val registKey = registKeyBase + ByteArray(0x10 - registKeyBase.size) { 0 }
+ val morning = Base64.decode(morningEditText.text.toString(), Base64.DEFAULT)
+ val connectInfo = ConnectInfo(hostEditText.text.toString(),
+ registKey,
+ morning,
+ ConnectVideoProfile(1280, 720, 60, 10000))
+
+ Intent(this, StreamActivity::class.java).let {
+ it.putExtra(StreamActivity.EXTRA_CONNECT_INFO, connectInfo)
+ startActivity(it)
+ }
+ }
}
}
diff --git a/android/app/src/main/java/com/metallic/chiaki/StreamActivity.kt b/android/app/src/main/java/com/metallic/chiaki/StreamActivity.kt
new file mode 100644
index 0000000..3ef5116
--- /dev/null
+++ b/android/app/src/main/java/com/metallic/chiaki/StreamActivity.kt
@@ -0,0 +1,34 @@
+package com.metallic.chiaki
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.metallic.chiaki.lib.ConnectInfo
+import com.metallic.chiaki.lib.Session
+import kotlinx.android.synthetic.main.activity_stream.*
+
+class StreamActivity : AppCompatActivity()
+{
+ companion object
+ {
+ const val EXTRA_CONNECT_INFO = "connect_info"
+ }
+
+ private lateinit var session: Session
+
+ override fun onCreate(savedInstanceState: Bundle?)
+ {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_stream)
+
+ val connectInfo = intent.getParcelableExtra(EXTRA_CONNECT_INFO)
+ if(connectInfo == null)
+ {
+ finish()
+ return
+ }
+
+ session = Session(connectInfo)
+ session.start()
+ testTextView.text = ""
+ }
+}
diff --git a/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt b/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt
index d01e663..246df5e 100644
--- a/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt
+++ b/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt
@@ -1,22 +1,28 @@
package com.metallic.chiaki.lib
+import android.os.Parcelable
+import kotlinx.android.parcel.Parcelize
+import java.lang.Exception
+
+@Parcelize
data class ConnectVideoProfile(
val width: Int,
val height: Int,
val maxFPS: Int,
val bitrate: Int
-)
+): Parcelable
+@Parcelize
data class ConnectInfo(
val host: String,
val registKey: ByteArray,
val morning: ByteArray,
val videoProfile: ConnectVideoProfile
-)
+): Parcelable
class ChiakiNative
{
- data class CreateSessionResult(var errorCode: Int, var sessionPtr: Long)
+ data class SessionCreateResult(var errorCode: Int, var sessionPtr: Long)
companion object
{
init
@@ -24,16 +30,35 @@ class ChiakiNative
System.loadLibrary("chiaki-jni")
}
@JvmStatic external fun errorCodeToString(value: Int): String
- @JvmStatic external fun createSession(result: CreateSessionResult, connectInfo: ConnectInfo)
+ @JvmStatic external fun sessionCreate(result: SessionCreateResult, connectInfo: ConnectInfo)
+ @JvmStatic external fun sessionStart(ptr: Long): Int
}
}
class ErrorCode(val value: Int)
{
override fun toString() = ChiakiNative.errorCodeToString(value)
+ var isSuccess = value == 0
}
-class Session
+class SessionCreateError(val errorCode: ErrorCode): Exception("Failed to create Session: $errorCode")
+
+class Session(connectInfo: ConnectInfo)
{
- private val nativePtr: Long = 0
+ private val nativePtr: Long
+
+ init
+ {
+ val result = ChiakiNative.SessionCreateResult(0, 0)
+ ChiakiNative.sessionCreate(result, connectInfo)
+ val errorCode = ErrorCode(result.errorCode)
+ if(!errorCode.isSuccess)
+ throw SessionCreateError(errorCode)
+ nativePtr = result.sessionPtr
+ }
+
+ fun start()
+ {
+ ChiakiNative.sessionStart(nativePtr)
+ }
}
\ No newline at end of file
diff --git a/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml
index 145e02f..7e350d7 100644
--- a/android/app/src/main/res/layout/activity_main.xml
+++ b/android/app/src/main/res/layout/activity_main.xml
@@ -6,14 +6,49 @@
android:layout_height="match_parent"
tools:context=".MainActivity">
-
+
+
+
+
+
+
+
+ app:layout_constraintTop_toBottomOf="@+id/morningEditText" />
\ No newline at end of file
diff --git a/android/app/src/main/res/layout/activity_stream.xml b/android/app/src/main/res/layout/activity_stream.xml
new file mode 100644
index 0000000..145e02f
--- /dev/null
+++ b/android/app/src/main/res/layout/activity_stream.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/cmake/OpenSSLExternalProject.cmake b/cmake/OpenSSLExternalProject.cmake
index 048c3ec..0538d48 100644
--- a/cmake/OpenSSLExternalProject.cmake
+++ b/cmake/OpenSSLExternalProject.cmake
@@ -38,7 +38,7 @@ ExternalProject_Add(OpenSSL-ExternalProject
INSTALL_DIR "${OPENSSL_INSTALL_DIR}"
CONFIGURE_COMMAND ${CMAKE_COMMAND} -E env ${OPENSSL_BUILD_ENV}
"/Configure" "--prefix=" no-shared ${OPENSSL_CONFIG_EXTRA_ARGS} "${OPENSSL_OS_COMPILER}"
- BUILD_COMMAND ${CMAKE_COMMAND} -E env ${OPENSSL_BUILD_ENV} "${MAKE_EXE}" build_libs
+ BUILD_COMMAND ${CMAKE_COMMAND} -E env ${OPENSSL_BUILD_ENV} "${MAKE_EXE}" -j4 build_libs
INSTALL_COMMAND ${CMAKE_COMMAND} -E env ${OPENSSL_BUILD_ENV} "${MAKE_EXE}" install_dev)
add_library(OpenSSL_Crypto INTERFACE)
diff --git a/lib/src/session.c b/lib/src/session.c
index c3c6f98..83d3cf1 100644
--- a/lib/src/session.c
+++ b/lib/src/session.c
@@ -584,6 +584,11 @@ static bool session_thread_request_session(ChiakiSession *session)
session_sock = socket(ai->ai_family, SOCK_STREAM, 0);
if(CHIAKI_SOCKET_IS_INVALID(session_sock))
{
+#ifdef _WIN32
+ CHIAKI_LOGE(session->log, "Failed to create socket to request session");
+#else
+ CHIAKI_LOGE(session->log, "Failed to create socket to request session: %s", strerror(errno));
+#endif
free(sa);
continue;
}