Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OboeTester: Add SpatializationBehavior #2173

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion apps/OboeTester/app/src/main/cpp/NativeAudioContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,8 @@ int ActivityContext::open(jint nativeApi,
jboolean formatConversionAllowed,
jint rateConversionQuality,
jboolean isMMap,
jboolean isInput) {
jboolean isInput,
jint spatializationBehavior) {

oboe::AudioApi audioApi = oboe::AudioApi::Unspecified;
switch (nativeApi) {
Expand Down Expand Up @@ -210,6 +211,7 @@ int ActivityContext::open(jint nativeApi,
->setChannelConversionAllowed(channelConversionAllowed)
->setFormatConversionAllowed(formatConversionAllowed)
->setSampleRateConversionQuality((oboe::SampleRateConversionQuality) rateConversionQuality)
->setSpatializationBehavior((oboe::SpatializationBehavior) spatializationBehavior)
;
if (channelMask != (jint) oboe::ChannelMask::Unspecified) {
// Set channel mask when it is specified.
Expand Down
4 changes: 3 additions & 1 deletion apps/OboeTester/app/src/main/cpp/NativeAudioContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ class ActivityContext {
* @param rateConversionQuality
* @param isMMap
* @param isInput
* @param spatializationBehavior
* @return stream ID
*/
int open(jint nativeApi,
Expand All @@ -128,7 +129,8 @@ class ActivityContext {
jboolean formatConversionAllowed,
jint rateConversionQuality,
jboolean isMMap,
jboolean isInput);
jboolean isInput,
jint spatializationBehavior);

oboe::Result release();

Expand Down
20 changes: 17 additions & 3 deletions apps/OboeTester/app/src/main/cpp/jni-bridge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ Java_com_mobileer_oboetester_OboeAudioStream_openNative(JNIEnv *env, jobject,
jboolean formatConversionAllowed,
jint rateConversionQuality,
jboolean isMMap,
jboolean isInput);
jboolean isInput,
jint spatializationBehavior);
JNIEXPORT void JNICALL
Java_com_mobileer_oboetester_OboeAudioStream_close(JNIEnv *env, jobject, jint);

Expand Down Expand Up @@ -157,7 +158,8 @@ Java_com_mobileer_oboetester_OboeAudioStream_openNative(
jboolean formatConversionAllowed,
jint rateConversionQuality,
jboolean isMMap,
jboolean isInput) {
jboolean isInput,
jint spatializationBehavior) {
LOGD("OboeAudioStream_openNative: sampleRate = %d", sampleRate);

return (jint) engine.getCurrentActivity()->open(nativeApi,
Expand All @@ -177,7 +179,8 @@ Java_com_mobileer_oboetester_OboeAudioStream_openNative(
formatConversionAllowed,
rateConversionQuality,
isMMap,
isInput);
isInput,
spatializationBehavior);
}

JNIEXPORT jint JNICALL
Expand Down Expand Up @@ -339,6 +342,17 @@ Java_com_mobileer_oboetester_OboeAudioStream_getInputPreset(
return result;
}

JNIEXPORT jint JNICALL
Java_com_mobileer_oboetester_OboeAudioStream_getSpatializationBehavior(
JNIEnv *env, jobject, jint streamIndex) {
jint result = (jint) oboe::Result::ErrorNull;
std::shared_ptr<oboe::AudioStream> oboeStream = engine.getCurrentActivity()->getStream(streamIndex);
if (oboeStream != nullptr) {
result = (jint) oboeStream->getSpatializationBehavior();
}
return result;
}

JNIEXPORT jint JNICALL
Java_com_mobileer_oboetester_OboeAudioStream_getFramesPerBurst(
JNIEnv *env, jobject, jint streamIndex) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ public void open(StreamConfiguration requestedConfiguration,
requestedConfiguration.getFormatConversionAllowed(),
requestedConfiguration.getRateConversionQuality(),
requestedConfiguration.isMMap(),
isInput()
isInput(),
requestedConfiguration.getSpatializationBehavior()
);
if (result < 0) {
streamIndex = INVALID_STREAM_INDEX;
Expand Down Expand Up @@ -100,6 +101,7 @@ public void open(StreamConfiguration requestedConfiguration,
actualConfiguration.setHardwareChannelCount(getHardwareChannelCount());
actualConfiguration.setHardwareSampleRate(getHardwareSampleRate());
actualConfiguration.setHardwareFormat(getHardwareFormat());
actualConfiguration.setSpatializationBehavior(getSpatializationBehavior());
}

private native int openNative(
Expand All @@ -120,7 +122,8 @@ private native int openNative(
boolean formatConversionAllowed,
int rateConversionQuality,
boolean isMMap,
boolean isInput);
boolean isInput,
int spatializationBehavior);

@Override
public void close() {
Expand Down Expand Up @@ -187,6 +190,11 @@ public int getInputPreset() {
}
private native int getInputPreset(int streamIndex);

public int getSpatializationBehavior() {
return getSpatializationBehavior(streamIndex);
}
private native int getSpatializationBehavior(int streamIndex);

public int getSampleRate() {
return getSampleRate(streamIndex);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,9 @@ public class StreamConfiguration {
public static final int INPUT_PRESET_UNPROCESSED = 9; // must match Oboe
public static final int INPUT_PRESET_VOICE_PERFORMANCE = 10; // must match Oboe

public static final int SPATIALIZATION_BEHAVIOR_AUTO = 1; // must match Oboe
public static final int SPATIALIZATION_BEHAVIOR_NEVER = 2; // must match Oboe

public static final int ERROR_BASE = -900; // must match Oboe
public static final int ERROR_DISCONNECTED = -899; // must match Oboe
public static final int ERROR_ILLEGAL_ARGUMENT = -898; // must match Oboe
Expand Down Expand Up @@ -298,6 +301,7 @@ public class StreamConfiguration {
private int mHardwareChannelCount;
private int mHardwareSampleRate;
private int mHardwareFormat;
private int mSpatializationBehavior;

public StreamConfiguration() {
reset();
Expand Down Expand Up @@ -351,6 +355,7 @@ public void reset() {
mHardwareChannelCount = UNSPECIFIED;
mHardwareSampleRate = UNSPECIFIED;
mHardwareFormat = UNSPECIFIED;
mSpatializationBehavior = UNSPECIFIED;
}

public int getFramesPerBurst() {
Expand Down Expand Up @@ -411,6 +416,11 @@ public void setInputPreset(int inputPreset) {
this.mInputPreset = inputPreset;
}

public int getSpatializationBehavior() { return mSpatializationBehavior; }
public void setSpatializationBehavior(int spatializationBehavior) {
this.mSpatializationBehavior = spatializationBehavior;
}

public int getUsage() { return mUsage; }
public void setUsage(int usage) {
this.mUsage = usage;
Expand Down Expand Up @@ -640,6 +650,8 @@ public String dump() {
message.append(String.format(Locale.getDefault(), "%s.hardware.sampleRate = %d\n", prefix, mHardwareSampleRate));
message.append(String.format(Locale.getDefault(), "%s.hardware.format = %s\n", prefix,
convertFormatToText(mHardwareFormat).toLowerCase(Locale.getDefault())));
message.append(String.format(Locale.getDefault(), "%s.spatializationBehavior = %s\n", prefix,
convertSpatializationBehaviorToText(mSpatializationBehavior).toLowerCase(Locale.getDefault())));
return message.toString();
}

Expand Down Expand Up @@ -697,6 +709,45 @@ public static int convertTextToInputPreset(String text) {
return -1;
}

// text must match menu values
public static final String NAME_SPATIALIZATION_BEHAVIOR_UNSPECIFIED = "Unspecified";
public static final String NAME_SPATIALIZATION_BEHAVIOR_AUTO = "Auto";
public static final String NAME_SPATIALIZATION_BEHAVIOR_NEVER = "Never";

public static String convertSpatializationBehaviorToText(int spatializationBehavior) {
switch(spatializationBehavior) {
case UNSPECIFIED:
return NAME_SPATIALIZATION_BEHAVIOR_UNSPECIFIED;
case SPATIALIZATION_BEHAVIOR_AUTO:
return NAME_SPATIALIZATION_BEHAVIOR_AUTO;
case SPATIALIZATION_BEHAVIOR_NEVER:
return NAME_SPATIALIZATION_BEHAVIOR_NEVER;
default:
return "Invalid";
}
}

private static boolean matchSpatializationBehavior(String text, int spatializationBehavior) {
return convertSpatializationBehaviorToText(spatializationBehavior).toLowerCase(Locale.getDefault()).equals(text);
}

/**
* Case insensitive.
* @param text
* @return spatializationBehavior, eg. SPATIALIZATION_BEHAVIOR_NEVER
*/
public static int convertTextToSpatializationBehavior(String text) {
text = text.toLowerCase(Locale.getDefault());
if (matchSpatializationBehavior(text, UNSPECIFIED)) {
return UNSPECIFIED;
} else if (matchSpatializationBehavior(text, SPATIALIZATION_BEHAVIOR_AUTO)) {
return SPATIALIZATION_BEHAVIOR_AUTO;
} else if (matchSpatializationBehavior(text, SPATIALIZATION_BEHAVIOR_NEVER)) {
return SPATIALIZATION_BEHAVIOR_NEVER;
}
return -1;
}

public int getChannelCount() {
return mChannelCount;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,10 @@ public class StreamConfigurationView extends LinearLayout {
private Spinner mContentTypeSpinner;
private TextView mActualContentTypeView;

private TableRow mSpatializationBehaviorTableRow;
private Spinner mSpatializationBehaviorSpinner;
private TextView mActualSpatializationBehaviorView;

private Spinner mFormatSpinner;
private Spinner mSampleRateSpinner;
private Spinner mRateConversionQualitySpinner;
Expand Down Expand Up @@ -334,6 +338,10 @@ public void onNothingSelected(AdapterView<?> adapterView) {
mActualContentTypeView = (TextView) findViewById(R.id.actualContentType);
mContentTypeSpinner = (Spinner) findViewById(R.id.spinnerContentType);

mSpatializationBehaviorTableRow = (TableRow) findViewById(R.id.rowSpatializationBehavior);
mActualSpatializationBehaviorView = (TextView) findViewById(R.id.actualSpatializationBehavior);
mSpatializationBehaviorSpinner = (Spinner) findViewById(R.id.spinnerSpatializationBehavior);

mStreamInfoView = (TextView) findViewById(R.id.streamInfo);

mStreamStatusView = (TextView) findViewById(R.id.statusView);
Expand Down Expand Up @@ -407,6 +415,10 @@ public void applyToModel(StreamConfiguration config) {
int contentType = StreamConfiguration.convertTextToContentType(text);
config.setContentType(contentType);

text = mSpatializationBehaviorSpinner.getSelectedItem().toString();
int spatializationBehavior = StreamConfiguration.convertTextToSpatializationBehavior(text);
config.setSpatializationBehavior(spatializationBehavior);

// The corresponding channel count of the selected channel mask may be different from
// the selected channel count, the last selected will be respected.
if (mIsChannelMaskLastSelected) {
Expand Down Expand Up @@ -453,6 +465,7 @@ public void setChildrenEnabled(boolean enabled) {
mUsageSpinner.setEnabled(enabled);
mContentTypeSpinner.setEnabled(enabled);
mFormatSpinner.setEnabled(enabled);
mSpatializationBehaviorSpinner.setEnabled(enabled);
mSampleRateSpinner.setEnabled(enabled);
mRateConversionQualitySpinner.setEnabled(enabled);
mDeviceSpinner.setEnabled(enabled);
Expand Down Expand Up @@ -494,6 +507,10 @@ void updateDisplay(StreamConfiguration actualConfiguration) {
mActualContentTypeView.setText(StreamConfiguration.convertContentTypeToText(value));
mActualContentTypeView.requestLayout();

value = actualConfiguration.getSpatializationBehavior();
mActualSpatializationBehaviorView.setText(StreamConfiguration.convertSpatializationBehaviorToText(value));
mActualSpatializationBehaviorView.requestLayout();

mActualChannelCountView.setText(actualConfiguration.getChannelCount() + "");
mActualSampleRateView.setText(actualConfiguration.getSampleRate() + "");
mActualSessionIdView.setText("S#: " + actualConfiguration.getSessionId());
Expand Down
22 changes: 22 additions & 0 deletions apps/OboeTester/app/src/main/res/layout/stream_config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,28 @@

</TableRow>

<TableRow
android:id="@+id/rowSpatializationBehavior">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/spatialization_behavior_prompt"/>

<Spinner
android:id="@+id/spinnerSpatializationBehavior"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/spatialization_behaviors" />

<TextView
android:id="@+id/actualSpatializationBehavior"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="\?" />

</TableRow>

</TableLayout>

<LinearLayout
Expand Down
7 changes: 7 additions & 0 deletions apps/OboeTester/app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,13 @@
<item>Sonification</item>
</string-array>

<string name="spatialization_behavior_prompt">Spatialization:</string>
<string-array name="spatialization_behaviors">
<item>Unspecified</item>
<item>Auto</item>
<item>Never</item>
</string-array>

<string name="channel_count_prompt">Channels:</string>
<string-array name="channel_counts">
<item>0</item>
Expand Down
Loading