Skip to content

Commit

Permalink
Update to split audio/video bit rate setter functions.
Browse files Browse the repository at this point in the history
Introduced in TokTok/c-toxcore#578.
  • Loading branch information
iphydf committed Jan 28, 2018
1 parent 0ccc943 commit 89cc1d0
Show file tree
Hide file tree
Showing 14 changed files with 156 additions and 50 deletions.
1 change: 1 addition & 0 deletions .travis.yml
Expand Up @@ -45,6 +45,7 @@ matrix:

install:
- test -f _install/host/protobuf.stamp || scripts/build-host -j$(nproc || sysctl -n hw.ncpu) $PWD/_install/host/protobuf.stamp
- if [ -e _git/toxcore ]; then (cd _git/toxcore && git pull); fi

script:
- scripts/build-$TARGET -j$(nproc || sysctl -n hw.ncpu) $GOAL
Expand Down
18 changes: 17 additions & 1 deletion BUILD
@@ -1,4 +1,4 @@
load("@io_bazel_rules_scala//scala:scala.bzl", "scala_library", "scala_test")
load("@io_bazel_rules_scala//scala:scala.bzl", "scala_binary", "scala_library", "scala_test")
load("@io_bazel_rules_scala//scala_proto:scala_proto.bzl", "scalapb_proto_library")

genrule(
Expand Down Expand Up @@ -201,3 +201,19 @@ scala_library(
"@org_slf4j_slf4j_log4j12//jar",
],
) for src in glob(["src/test/java/**/*.java"])]

[scala_binary(
name = src[src.rindex("/") + 1:-6],
testonly = True,
srcs = [src],
main_class = "im.tox.tox4j.impl.jni.codegen." + src[src.rindex("/") + 1:-6],
resources = glob([
"src/test/resources/**/*",
]),
deps = [
":codegen_lib",
":jvm-toxcore-c",
"//jvm-toxcore-api",
"@com_google_guava_guava//jar",
],
) for src in glob(["src/test/java/im/tox/tox4j/impl/jni/codegen/Jni*.scala"])]
23 changes: 18 additions & 5 deletions cpp/src/ToxAv/av.cpp
Expand Up @@ -85,14 +85,27 @@ TOX_METHOD (void, CallControl,

/*
* Class: im_tox_tox4j_impl_ToxAvJni
* Method: toxavBitRateSet
* Signature: (IIII)V
* Method: toxavAudioSetBitRate
* Signature: (III)V
*/
TOX_METHOD (void, BitRateSet,
jint instanceNumber, jint friendNumber, jint audioBitRate, jint videoBitRate)
TOX_METHOD (void, AudioSetBitRate,
jint instanceNumber, jint friendNumber, jint audioBitRate)
{
return instances.with_instance_ign (env, instanceNumber,
toxav_audio_set_bit_rate, friendNumber, audioBitRate
);
}

/*
* Class: im_tox_tox4j_impl_ToxAvJni
* Method: toxavVideoSetBitRate
* Signature: (III)V
*/
TOX_METHOD (void, VideoSetBitRate,
jint instanceNumber, jint friendNumber, jint videoBitRate)
{
return instances.with_instance_ign (env, instanceNumber,
toxav_bit_rate_set, friendNumber, audioBitRate, videoBitRate
toxav_video_set_bit_rate, friendNumber, videoBitRate
);
}

Expand Down
3 changes: 1 addition & 2 deletions cpp/src/ToxAv/generated/errors.cpp
Expand Up @@ -21,8 +21,7 @@ HANDLE ("BitRateSet", BIT_RATE_SET)
success_case (BIT_RATE_SET);
failure_case (BIT_RATE_SET, FRIEND_NOT_FOUND);
failure_case (BIT_RATE_SET, FRIEND_NOT_IN_CALL);
failure_case (BIT_RATE_SET, INVALID_AUDIO_BIT_RATE);
failure_case (BIT_RATE_SET, INVALID_VIDEO_BIT_RATE);
failure_case (BIT_RATE_SET, INVALID_BIT_RATE);
failure_case (BIT_RATE_SET, SYNC);
}
return unhandled ();
Expand Down
14 changes: 11 additions & 3 deletions cpp/src/ToxAv/generated/im_tox_tox4j_impl_jni_ToxAvJni.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 4 additions & 2 deletions cpp/src/ToxAv/generated/natives.h
Expand Up @@ -3,8 +3,10 @@ JAVA_METHOD_REF (toxavAnswer)
CXX_FUNCTION_REF (toxav_answer)
JAVA_METHOD_REF (toxavAudioSendFrame)
CXX_FUNCTION_REF (toxav_audio_send_frame)
JAVA_METHOD_REF (toxavBitRateSet)
CXX_FUNCTION_REF (toxav_bit_rate_set)
JAVA_METHOD_REF (toxavAudioSetBitRate)
CXX_FUNCTION_REF (toxav_audio_set_bit_rate)
JAVA_METHOD_REF (toxavVideoSetBitRate)
CXX_FUNCTION_REF (toxav_video_set_bit_rate)
JAVA_METHOD_REF (toxavCall)
CXX_FUNCTION_REF (toxav_call)
JAVA_METHOD_REF (toxavCallControl)
Expand Down
46 changes: 36 additions & 10 deletions cpp/src/ToxAv/lifecycle.cpp
Expand Up @@ -35,14 +35,23 @@ tox4j_call_state_cb (uint32_t friend_number, uint32_t state, Events *events)


static void
tox4j_bit_rate_status_cb (uint32_t friend_number,
uint32_t audio_bit_rate,
uint32_t video_bit_rate,
Events *events)
tox4j_audio_bit_rate_cb (uint32_t friend_number,
uint32_t audio_bit_rate,
Events *events)
{
auto msg = events->add_bit_rate_status ();
auto msg = events->add_audio_bit_rate ();
msg->set_friend_number (friend_number);
msg->set_audio_bit_rate (audio_bit_rate);
}


static void
tox4j_video_bit_rate_cb (uint32_t friend_number,
uint32_t video_bit_rate,
Events *events)
{
auto msg = events->add_video_bit_rate ();
msg->set_friend_number (friend_number);
msg->set_video_bit_rate (video_bit_rate);
}

Expand Down Expand Up @@ -179,17 +188,34 @@ TOX_METHOD (void, Finalize,

/*
* Class: im_tox_tox4j_impl_jni_ToxAvJni
* Method: invokeBitRateStatus
* Signature: (IIII)V
* Method: invokeAudioBitRate
* Signature: (III)V
*/
JNIEXPORT void JNICALL Java_im_tox_tox4j_impl_jni_ToxAvJni_invokeAudioBitRate
(JNIEnv *env, jclass, jint instanceNumber, jint friendNumber, jint audioBitRate)
{
return instances.with_instance (env, instanceNumber,
[=] (ToxAV *av, Events &events)
{
assert (av != nullptr);
tox4j_audio_bit_rate_cb (friendNumber, audioBitRate, &events);
}
);
}

/*
* Class: im_tox_tox4j_impl_jni_ToxAvJni
* Method: invokeVideoBitRate
* Signature: (III)V
*/
JNIEXPORT void JNICALL Java_im_tox_tox4j_impl_jni_ToxAvJni_invokeBitRateStatus
(JNIEnv *env, jclass, jint instanceNumber, jint friendNumber, jint audioBitRate, jint videoBitRate)
JNIEXPORT void JNICALL Java_im_tox_tox4j_impl_jni_ToxAvJni_invokeVideoBitRate
(JNIEnv *env, jclass, jint instanceNumber, jint friendNumber, jint videoBitRate)
{
return instances.with_instance (env, instanceNumber,
[=] (ToxAV *av, Events &events)
{
assert (av != nullptr);
tox4j_bit_rate_status_cb (friendNumber, audioBitRate, videoBitRate, &events);
tox4j_video_bit_rate_cb (friendNumber, videoBitRate, &events);
}
);
}
Expand Down
6 changes: 4 additions & 2 deletions cpp/src/tox/generated/av.h
@@ -1,10 +1,12 @@
// im.tox.tox4j.av.callbacks.AudioBitRateCallback#audioBitRate
CALLBACK (audio_bit_rate)
// im.tox.tox4j.av.callbacks.AudioReceiveFrameCallback#audioReceiveFrame
CALLBACK (audio_receive_frame)
// im.tox.tox4j.av.callbacks.BitRateStatusCallback#bitRateStatus
CALLBACK (bit_rate_status)
// im.tox.tox4j.av.callbacks.CallCallback#call
CALLBACK (call)
// im.tox.tox4j.av.callbacks.CallStateCallback#callState
CALLBACK (call_state)
// im.tox.tox4j.av.callbacks.VideoBitRateCallback#videoBitRate
CALLBACK (video_bit_rate)
// im.tox.tox4j.av.callbacks.VideoReceiveFrameCallback#videoReceiveFrame
CALLBACK (video_receive_frame)
22 changes: 16 additions & 6 deletions src/main/java/im/tox/tox4j/impl/jni/ToxAvEventDispatch.scala
Expand Up @@ -66,12 +66,21 @@ object ToxAvEventDispatch {
}
}

private def dispatchBitRateStatus[S](handler: BitRateStatusCallback[S], bitRateStatus: Seq[BitRateStatus])(state: S): S = {
bitRateStatus.foldLeft(state) {
case (state, BitRateStatus(friendNumber, audioBitRate, videoBitRate)) =>
handler.bitRateStatus(
private def dispatchAudioBitRate[S](handler: AudioBitRateCallback[S], audioBitRate: Seq[AudioBitRate])(state: S): S = {
audioBitRate.foldLeft(state) {
case (state, AudioBitRate(friendNumber, audioBitRate)) =>
handler.audioBitRate(
ToxFriendNumber.unsafeFromInt(friendNumber),
BitRate.unsafeFromInt(audioBitRate)
)(state)
}
}

private def dispatchVideoBitRate[S](handler: VideoBitRateCallback[S], videoBitRate: Seq[VideoBitRate])(state: S): S = {
videoBitRate.foldLeft(state) {
case (state, VideoBitRate(friendNumber, videoBitRate)) =>
handler.videoBitRate(
ToxFriendNumber.unsafeFromInt(friendNumber),
BitRate.unsafeFromInt(audioBitRate),
BitRate.unsafeFromInt(videoBitRate)
)(state)
}
Expand Down Expand Up @@ -136,7 +145,8 @@ object ToxAvEventDispatch {
(state
|> dispatchCall(handler, events.call)
|> dispatchCallState(handler, events.callState)
|> dispatchBitRateStatus(handler, events.bitRateStatus)
|> dispatchAudioBitRate(handler, events.audioBitRate)
|> dispatchVideoBitRate(handler, events.videoBitRate)
|> dispatchAudioReceiveFrame(handler, events.audioReceiveFrame)
|> dispatchVideoReceiveFrame(handler, events.videoReceiveFrame))
}
Expand Down
14 changes: 10 additions & 4 deletions src/main/java/im/tox/tox4j/impl/jni/ToxAvImpl.scala
Expand Up @@ -77,8 +77,12 @@ final class ToxAvImpl(@NotNull private val tox: ToxCoreImpl) extends ToxAv {
ToxAvJni.toxavCallControl(instanceNumber, friendNumber.value, control.ordinal)

@throws[ToxavBitRateSetException]
override def setBitRate(friendNumber: ToxFriendNumber, audioBitRate: BitRate, videoBitRate: BitRate): Unit =
ToxAvJni.toxavBitRateSet(instanceNumber, friendNumber.value, audioBitRate.value, videoBitRate.value)
override def setBitRateAudio(friendNumber: ToxFriendNumber, audioBitRate: BitRate): Unit =
ToxAvJni.toxavBitRateSetAudio(instanceNumber, friendNumber.value, audioBitRate.value)

@throws[ToxavBitRateSetException]
override def setBitRateVideo(friendNumber: ToxFriendNumber, videoBitRate: BitRate): Unit =
ToxAvJni.toxavBitRateSetVideo(instanceNumber, friendNumber.value, videoBitRate.value)

@throws[ToxavSendFrameException]
override def audioSendFrame(
Expand All @@ -102,8 +106,10 @@ final class ToxAvImpl(@NotNull private val tox: ToxCoreImpl) extends ToxAv {

def invokeAudioReceiveFrame(friendNumber: ToxFriendNumber, pcm: Array[Short], channels: AudioChannels, samplingRate: SamplingRate): Unit =
ToxAvJni.invokeAudioReceiveFrame(instanceNumber, friendNumber.value, pcm, channels.value, samplingRate.value)
def invokeBitRateStatus(friendNumber: ToxFriendNumber, audioBitRate: BitRate, videoBitRate: BitRate): Unit =
ToxAvJni.invokeBitRateStatus(instanceNumber, friendNumber.value, audioBitRate.value, videoBitRate.value)
def invokeAudioBitRate(friendNumber: ToxFriendNumber, audioBitRate: BitRate): Unit =
ToxAvJni.invokeAudioBitRate(instanceNumber, friendNumber.value, audioBitRate.value)
def invokeVideoBitRate(friendNumber: ToxFriendNumber, videoBitRate: BitRate): Unit =
ToxAvJni.invokeVideoBitRate(instanceNumber, friendNumber.value, videoBitRate.value)
def invokeCall(friendNumber: ToxFriendNumber, audioEnabled: Boolean, videoEnabled: Boolean): Unit =
ToxAvJni.invokeCall(instanceNumber, friendNumber.value, audioEnabled, videoEnabled)
def invokeCallState(friendNumber: ToxFriendNumber, callState: util.EnumSet[ToxavFriendCallState]): Unit =
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/im/tox/tox4j/impl/jni/ToxAvJni.java
Expand Up @@ -20,7 +20,8 @@ public final class ToxAvJni {
static native void toxavCall(int instanceNumber, int friendNumber, int audioBitRate, int videoBitRate) throws ToxavCallException;
static native void toxavAnswer(int instanceNumber, int friendNumber, int audioBitRate, int videoBitRate) throws ToxavAnswerException;
static native void toxavCallControl(int instanceNumber, int friendNumber, int control) throws ToxavCallControlException;
static native void toxavBitRateSet(int instanceNumber, int friendNumber, int audioBitRate, int videoBitRate) throws ToxavBitRateSetException;
static native void toxavBitRateSetAudio(int instanceNumber, int friendNumber, int audioBitRate) throws ToxavBitRateSetException;
static native void toxavBitRateSetVideo(int instanceNumber, int friendNumber, int videoBitRate) throws ToxavBitRateSetException;

static native void toxavAudioSendFrame(
int instanceNumber,
Expand All @@ -37,7 +38,8 @@ static native void toxavVideoSendFrame(
) throws ToxavSendFrameException;

static native void invokeAudioReceiveFrame(int instanceNumber, int friendNumber, short[] pcm, int channels, int samplingRate);
static native void invokeBitRateStatus(int instanceNumber, int friendNumber, int audioBitRate, int videoBitRate);
static native void invokeAudioBitRate(int instanceNumber, int friendNumber, int audioBitRate);
static native void invokeVideoBitRate(int instanceNumber, int friendNumber, int videoBitRate);
static native void invokeCall(int instanceNumber, int friendNumber, boolean audioEnabled, boolean videoEnabled);
static native void invokeCallState(int instanceNumber, int friendNumber, int callState);
@SuppressWarnings("checkstyle:parametername")
Expand Down
15 changes: 10 additions & 5 deletions src/main/protobuf/Av.proto
Expand Up @@ -23,10 +23,14 @@ message CallState {
repeated Kind call_state = 2;
}

message BitRateStatus {
message AudioBitRate {
uint32 friend_number = 1;
uint32 audio_bit_rate = 2;
uint32 video_bit_rate = 3;
}

message VideoBitRate {
uint32 friend_number = 1;
uint32 video_bit_rate = 2;
}

message AudioReceiveFrame {
Expand All @@ -52,7 +56,8 @@ message VideoReceiveFrame {
message AvEvents {
repeated Call call = 1;
repeated CallState call_state = 2;
repeated BitRateStatus bit_rate_status = 3;
repeated AudioReceiveFrame audio_receive_frame = 4;
repeated VideoReceiveFrame video_receive_frame = 5;
repeated AudioBitRate audio_bit_rate = 3;
repeated VideoBitRate video_bit_rate = 4;
repeated AudioReceiveFrame audio_receive_frame = 5;
repeated VideoReceiveFrame video_receive_frame = 6;
}
23 changes: 17 additions & 6 deletions src/test/java/im/tox/tox4j/av/callbacks/AvInvokeTest.scala
Expand Up @@ -29,7 +29,8 @@ final class AvInvokeTest extends FunSuite with PropertyChecks {

// scalastyle:off line.size.limit
override def audioReceiveFrame(friendNumber: ToxFriendNumber, pcm: Array[Short], channels: AudioChannels, samplingRate: SamplingRate)(state: Option[Event]): Option[Event] = setEvent(AudioReceiveFrame(friendNumber, pcm, channels, samplingRate))(state)
override def bitRateStatus(friendNumber: ToxFriendNumber, audioBitRate: BitRate, videoBitRate: BitRate)(state: Option[Event]): Option[Event] = setEvent(BitRateStatus(friendNumber, audioBitRate, videoBitRate))(state)
override def audioBitRate(friendNumber: ToxFriendNumber, audioBitRate: BitRate)(state: Option[Event]): Option[Event] = setEvent(AudioBitRate(friendNumber, audioBitRate))(state)
override def videoBitRate(friendNumber: ToxFriendNumber, videoBitRate: BitRate)(state: Option[Event]): Option[Event] = setEvent(VideoBitRate(friendNumber, videoBitRate))(state)
override def call(friendNumber: ToxFriendNumber, audioEnabled: Boolean, videoEnabled: Boolean)(state: Option[Event]): Option[Event] = setEvent(Call(friendNumber, audioEnabled, videoEnabled))(state)
override def callState(friendNumber: ToxFriendNumber, callState: util.EnumSet[ToxavFriendCallState])(state: Option[Event]): Option[Event] = setEvent(CallState(friendNumber, callState.asScala.toSet))(state)
override def videoReceiveFrame(friendNumber: ToxFriendNumber, width: Width, height: Height, y: Array[Byte], u: Array[Byte], v: Array[Byte], yStride: Int, uStride: Int, vStride: Int)(state: Option[Event]): Option[Event] = setEvent(VideoReceiveFrame(friendNumber, width, height, y, u, v, yStride, uStride, vStride))(state)
Expand Down Expand Up @@ -110,11 +111,20 @@ final class AvInvokeTest extends FunSuite with PropertyChecks {
}
}

test("BitRateStatus") {
forAll { (friendNumber: ToxFriendNumber, audioBitRate: BitRate, videoBitRate: BitRate) =>
test("AudioBitRate") {
forAll { (friendNumber: ToxFriendNumber, audioBitRate: BitRate) =>
callbackTest(
_.invokeBitRateStatus(friendNumber, audioBitRate, videoBitRate),
BitRateStatus(friendNumber, audioBitRate, videoBitRate)
_.invokeAudioBitRate(friendNumber, audioBitRate),
AudioBitRate(friendNumber, audioBitRate)
)
}
}

test("VideoBitRate") {
forAll { (friendNumber: ToxFriendNumber, videoBitRate: BitRate) =>
callbackTest(
_.invokeVideoBitRate(friendNumber, videoBitRate),
VideoBitRate(friendNumber, videoBitRate)
)
}
}
Expand Down Expand Up @@ -160,9 +170,10 @@ final class AvInvokeTest extends FunSuite with PropertyChecks {

object AvInvokeTest {
sealed trait Event
private final case class AudioBitRate(friendNumber: ToxFriendNumber, audioBitRate: BitRate) extends Event
private final case class AudioReceiveFrame(friendNumber: ToxFriendNumber, pcm: ShortArray, channels: AudioChannels, samplingRate: SamplingRate) extends Event
private final case class BitRateStatus(friendNumber: ToxFriendNumber, audioBitRate: BitRate, videoBitRate: BitRate) extends Event
private final case class Call(friendNumber: ToxFriendNumber, audioEnabled: Boolean, videoEnabled: Boolean) extends Event
private final case class CallState(friendNumber: ToxFriendNumber, callState: Set[ToxavFriendCallState]) extends Event
private final case class VideoBitRate(friendNumber: ToxFriendNumber, videoBitRate: BitRate) extends Event
private final case class VideoReceiveFrame(friendNumber: ToxFriendNumber, width: Width, height: Height, y: ByteArray, u: ByteArray, v: ByteArray, yStride: Int, uStride: Int, vStride: Int) extends Event // scalastyle:ignore line.size.limit
}
Expand Up @@ -105,8 +105,13 @@ final class AudioReceiveFrameCallbackTest extends AutoTestSuite with ToxExceptio
state.addTask(sendFrame(friendNumber))
}

override def bitRateStatus(friendNumber: ToxFriendNumber, audioBitRate: BitRate, videoBitRate: BitRate)(state: State): State = {
debug(state, s"Bit rate in call with ${state.id(friendNumber)} should change to $audioBitRate for audio and $videoBitRate for video")
override def audioBitRate(friendNumber: ToxFriendNumber, audioBitRate: BitRate)(state: State): State = {
debug(state, s"Bit rate in call with ${state.id(friendNumber)} should change to $audioBitRate for audio")
state
}

override def videoBitRate(friendNumber: ToxFriendNumber, videoBitRate: BitRate)(state: State): State = {
debug(state, s"Bit rate in call with ${state.id(friendNumber)} should change to $videoBitRate for video")
state
}

Expand Down

0 comments on commit 89cc1d0

Please sign in to comment.