Skip to content
This repository was archived by the owner on Jul 16, 2025. It is now read-only.

Commit ee2929b

Browse files
committed
feat: allow specifying use in android
1 parent d970232 commit ee2929b

File tree

13 files changed

+100
-24
lines changed

13 files changed

+100
-24
lines changed

android/src/main/cpp/AudioEngine.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88

99
#include "audio/AAssetDataSource.h"
1010

11-
SetupAudioStreamResult AudioEngine::setupAudioStream(double sampleRate, double channelCount) {
11+
SetupAudioStreamResult AudioEngine::setupAudioStream(
12+
double sampleRate,
13+
double channelCount,
14+
int usage) {
1215
if(mAudioStream) {
1316
return { .error = "Setting up an audio stream while one is already available"};
1417
}
@@ -18,6 +21,7 @@ SetupAudioStreamResult AudioEngine::setupAudioStream(double sampleRate, double c
1821

1922
oboe::AudioStreamBuilder builder {};
2023

24+
builder.setUsage(getUsageFromInt(usage));
2125
builder.setFormat(oboe::AudioFormat::Float);
2226
builder.setFormatConversionAllowed(true);
2327
builder.setPerformanceMode(oboe::PerformanceMode::LowLatency);
@@ -185,3 +189,21 @@ void AudioEngine::unloadSounds(const std::optional<std::vector<std::string>> &id
185189
mPlayers.clear();
186190
}
187191
}
192+
193+
oboe::Usage AudioEngine::getUsageFromInt(int usage) {
194+
switch(usage) {
195+
case 0: return oboe::Usage::Media;
196+
case 1: return oboe::Usage::VoiceCommunication;
197+
case 2: return oboe::Usage::VoiceCommunicationSignalling;
198+
case 3: return oboe::Usage::Alarm;
199+
case 4: return oboe::Usage::Notification;
200+
case 5: return oboe::Usage::NotificationRingtone;
201+
case 6: return oboe::Usage::NotificationEvent;
202+
case 7: return oboe::Usage::AssistanceAccessibility;
203+
case 8: return oboe::Usage::AssistanceNavigationGuidance;
204+
case 9: return oboe::Usage::AssistanceSonification;
205+
case 10: return oboe::Usage::Game;
206+
case 11: return oboe::Usage::Assistant;
207+
default: return oboe::Usage::Media;
208+
}
209+
}

android/src/main/cpp/AudioEngine.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
class AudioEngine : public oboe::AudioStreamDataCallback{
1818
public:
19-
SetupAudioStreamResult setupAudioStream(double sampleRate, double channelCount);
19+
SetupAudioStreamResult setupAudioStream(double sampleRate, double channelCount, int usage);
2020
OpenAudioStreamResult openAudioStream();
2121
PauseAudioStreamResult pauseAudioStream();
2222
CloseAudioStreamResult closeAudioStream();
@@ -34,6 +34,8 @@ class AudioEngine : public oboe::AudioStreamDataCallback{
3434
std::map<std::string, std::unique_ptr<Player>> mPlayers;
3535
int32_t mDesiredSampleRate{};
3636
int mDesiredChannelCount{};
37+
38+
oboe::Usage getUsageFromInt(int usage);
3739
};
3840

3941
#endif //AUDIOPLAYBACK_AUDIOENGINE_H

android/src/main/cpp/native-lib.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,13 @@ std::vector<std::string> jniStringArrayToStringVector(JNIEnv* env, jobjectArray
8383

8484
extern "C" {
8585
JNIEXPORT jobject JNICALL
86-
Java_com_audioplayback_AudioPlaybackModule_setupAudioStreamNative(JNIEnv *env, jobject thiz, jdouble sample_rate, jdouble channel_count) {
87-
auto result = audioEngine->setupAudioStream(sample_rate, channel_count);
86+
Java_com_audioplayback_AudioPlaybackModule_setupAudioStreamNative(
87+
JNIEnv *env,
88+
jobject thiz,
89+
jdouble sample_rate,
90+
jdouble channel_count,
91+
jint usage) {
92+
auto result = audioEngine->setupAudioStream(sample_rate, channel_count, usage);
8893

8994
jclass structClass = env->FindClass("com/audioplayback/models/SetupAudioStreamResult");
9095
jmethodID constructor = env->GetMethodID(structClass, "<init>", "(Ljava/lang/String;)V");

android/src/main/java/com/audioplayback/AudioPlaybackModule.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.audioplayback.models.OpenAudioStreamResult
1313
import com.audioplayback.models.PauseAudioStreamResult
1414
import com.audioplayback.models.SetupAudioStreamResult
1515
import com.facebook.react.bridge.Arguments
16+
import com.facebook.react.bridge.ReadableMap
1617
import com.facebook.react.bridge.WritableMap
1718
import kotlinx.coroutines.CoroutineScope
1819
import kotlinx.coroutines.Dispatchers
@@ -29,8 +30,12 @@ class AudioPlaybackModule internal constructor(context: ReactApplicationContext)
2930
}
3031

3132
@ReactMethod(isBlockingSynchronousMethod = true)
32-
override fun setupAudioStream(sampleRate: Double, channelCount: Double): WritableMap {
33-
val result = setupAudioStreamNative(sampleRate, channelCount)
33+
override fun setupAudioStream(options: ReadableMap): WritableMap {
34+
val sampleRate = options.getDouble("sampleRate")
35+
val channelCount = options.getDouble("channelCount")
36+
val usage = options.getMap("android")!!.getInt("usage")
37+
38+
val result = setupAudioStreamNative(sampleRate, channelCount, usage)
3439
val map = Arguments.createMap()
3540
result.error?.let { map.putString("error", it) } ?: map.putNull("error")
3641
return map
@@ -185,7 +190,7 @@ class AudioPlaybackModule internal constructor(context: ReactApplicationContext)
185190
unloadSoundsNative(null)
186191
}
187192

188-
private external fun setupAudioStreamNative(sampleRate: Double, channelCount: Double): SetupAudioStreamResult
193+
private external fun setupAudioStreamNative(sampleRate: Double, channelCount: Double, usage: Int): SetupAudioStreamResult
189194
private external fun openAudioStreamNative(): OpenAudioStreamResult
190195
private external fun pauseAudioStreamNative(): PauseAudioStreamResult
191196
private external fun closeAudioStreamNative(): CloseAudioStreamResult

example/Gemfile.lock

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ GEM
6666
netrc (~> 0.11)
6767
cocoapods-try (1.2.0)
6868
colored2 (3.1.2)
69-
concurrent-ruby (1.3.4)
69+
concurrent-ruby (1.3.3)
7070
connection_pool (2.4.1)
7171
drb (2.2.1)
7272
escape (0.0.4)
@@ -110,6 +110,7 @@ PLATFORMS
110110
DEPENDENCIES
111111
activesupport (>= 6.1.7.5, != 7.1.0)
112112
cocoapods (>= 1.13, != 1.15.1, != 1.15.0)
113+
concurrent-ruby (< 1.3.4)
113114
xcodeproj (< 1.26.0)
114115

115116
RUBY VERSION

example/android/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
3232
# your application. You should enable this flag either if you want
3333
# to write custom TurboModules/Fabric components OR use libraries that
3434
# are providing them.
35-
newArchEnabled=false
35+
newArchEnabled=true
3636

3737
# Use this property to enable or disable the Hermes JS engine.
3838
# If set to false, you will be using JSC instead.

example/ios/Podfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1854,4 +1854,4 @@ SPEC CHECKSUMS:
18541854

18551855
PODFILE CHECKSUM: 0de3c0d5ec96ef8679c10cf5c8e600381b2b0ac8
18561856

1857-
COCOAPODS: 1.14.3
1857+
COCOAPODS: 1.15.2

example/src/components/StreamControl.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import { AudioManager } from 'react-native-audio-playback';
1+
import {
2+
AndroidAudioStreamUsage,
3+
AudioManager,
4+
} from 'react-native-audio-playback';
25

36
import { Button } from './Button';
47
import { Section } from './Section';
@@ -9,7 +12,11 @@ interface StreamControlProps {
912

1013
export function StreamControl({ onLoadSounds }: StreamControlProps) {
1114
function onSetupStream() {
12-
AudioManager.shared.setupAudioStream();
15+
AudioManager.shared.setupAudioStream({
16+
android: {
17+
usage: AndroidAudioStreamUsage.Alarm,
18+
},
19+
});
1320
}
1421

1522
function onOpenStream() {

src/NativeAudioPlayback.ts

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,16 @@
11
import type { TurboModule } from 'react-native';
22
import { TurboModuleRegistry } from 'react-native';
33

4-
export enum IosAudioSessionCategory {
5-
Ambient,
6-
MultiRoute,
7-
PlayAndRecord,
8-
Playback,
9-
Record,
10-
SoloAmbient,
11-
}
12-
134
export interface Spec extends TurboModule {
145
setupAudioStream: (options: {
156
sampleRate: number;
167
channelCount: number;
178
ios: {
189
audioSessionCategory: number;
1910
};
11+
android: {
12+
usage: number;
13+
};
2014
}) => { error: string | null };
2115
openAudioStream: () => { error: string | null };
2216
pauseAudioStream: () => { error: string | null };

src/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
export { AudioManager, Player } from './models';
2-
export { IosAudioSessionCategory } from './NativeAudioPlayback';
2+
export { IosAudioSessionCategory, AndroidAudioStreamUsage } from './types';

0 commit comments

Comments
 (0)