Skip to content

Commit 56bf45e

Browse files
authored
Merge pull request #514 from react-native-webrtc/trigger_audio_route_changes
Trigger audio route changes
2 parents 1b3a347 + dbc6566 commit 56bf45e

File tree

6 files changed

+67
-19
lines changed

6 files changed

+67
-19
lines changed

README.md

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -682,18 +682,19 @@ RNCallKeep.registerAndroidEvents();
682682

683683
| Event | iOS | Android |
684684
| ----------------------------------------------------------------- | :--: | :-----: |
685-
| [didReceiveStartCallAction()](#didReceiveStartCallAction) |||
686-
| [answerCall()](#answerCall) |||
687-
| [endCall()](#endCall) |||
688-
| [didActivateAudioSession()](#didActivateAudioSession) |||
689-
| [didDisplayIncomingCall()](#didDisplayIncomingCall) |||
690-
| [didPerformSetMutedCallAction()](#didPerformSetMutedCallAction) |||
691-
| [didToggleHoldCallAction()](#didToggleHoldCallAction) |||
692-
| [didPerformDTMFAction()](#didPerformDTMFAction) |||
693-
| [didLoadWithEvents()](#didLoadWithEvents) |||
694-
| [showIncomingCallUi()](#showIncomingCallUi) |||
695-
| [silenceIncomingCall()](#silenceIncomingCall) |||
696-
| [checkReachability()](#checkReachability) |||
685+
| [didReceiveStartCallAction](#didReceiveStartCallAction) |||
686+
| [answerCall](#answerCall) |||
687+
| [endCall](#endCall) |||
688+
| [didActivateAudioSession](#didActivateAudioSession) |||
689+
| [didDisplayIncomingCall](#didDisplayIncomingCall) |||
690+
| [didPerformSetMutedCallAction](#didPerformSetMutedCallAction) |||
691+
| [didToggleHoldCallAction](#didToggleHoldCallAction) |||
692+
| [didPerformDTMFAction](#didPerformDTMFAction) |||
693+
| [didLoadWithEvents](#didLoadWithEvents) |||
694+
| [showIncomingCallUi](#showIncomingCallUi) |||
695+
| [silenceIncomingCall](#silenceIncomingCall) |||
696+
| [checkReachability](#checkReachability) |||
697+
| [didChangeAudioRoute](#didChangeAudioRoute) |||
697698

698699
### didReceiveStartCallAction
699700

@@ -806,6 +807,17 @@ RNCallKeep.addEventListener('didToggleHoldCallAction', ({ hold, callUUID }) => {
806807
});
807808
```
808809

810+
### - didChangeAudioRoute
811+
812+
Triggered when the audio route has been changed.
813+
⚠️ Will send `Speaker` on iOS but `SPEAKER` on Android.
814+
815+
```js
816+
RNCallKeep.addEventListener('didChangeAudioRoute', ({ output }) => {
817+
818+
});
819+
```
820+
809821
- `hold` (boolean)
810822
- `callUUID` (string)
811823
- The UUID of the call.

actions.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const RNCallKeepDidLoadWithEvents = 'RNCallKeepDidLoadWithEvents';
1818
const RNCallKeepShowIncomingCallUi = 'RNCallKeepShowIncomingCallUi';
1919
const RNCallKeepOnSilenceIncomingCall = 'RNCallKeepOnSilenceIncomingCall';
2020
const RNCallKeepOnIncomingConnectionFailed = 'RNCallKeepOnIncomingConnectionFailed';
21+
const RNCallKeepDidChangeAudioRoute = 'RNCallKeepDidChangeAudioRoute';
2122
const isIOS = Platform.OS === 'ios';
2223

2324
const didReceiveStartCallAction = handler => {
@@ -35,6 +36,9 @@ const answerCall = handler =>
3536
const endCall = handler =>
3637
eventEmitter.addListener(RNCallKeepPerformEndCallAction, (data) => handler(data));
3738

39+
const didChangeAudioRoute = handler =>
40+
eventEmitter.addListener(RNCallKeepDidChangeAudioRoute, handler);
41+
3842
const didActivateAudioSession = handler =>
3943
eventEmitter.addListener(RNCallKeepDidActivateAudioSession, handler);
4044

@@ -98,4 +102,5 @@ export const listeners = {
98102
showIncomingCallUi,
99103
silenceIncomingCall,
100104
createIncomingConnectionFailed
105+
didChangeAudioRoute,
101106
};

android/src/main/java/io/wazo/callkeep/Constants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public class Constants {
1515
public static final String ACTION_SHOW_INCOMING_CALL_UI = "ACTION_SHOW_INCOMING_CALL_UI";
1616
public static final String ACTION_ON_SILENCE_INCOMING_CALL = "ACTION_ON_SILENCE_INCOMING_CALL";
1717
public static final String ACTION_ON_CREATE_CONNECTION_FAILED = "ACTION_ON_CREATE_CONNECTION_FAILED";
18+
public static final String ACTION_DID_CHANGE_AUDIO_ROUTE = "ACTION_DID_CHANGE_AUDIO_ROUTE";
1819

1920

2021
public static final String EXTRA_CALL_NUMBER = "EXTRA_CALL_NUMBER";

android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@
9696
import static io.wazo.callkeep.Constants.ACTION_SHOW_INCOMING_CALL_UI;
9797
import static io.wazo.callkeep.Constants.ACTION_ON_SILENCE_INCOMING_CALL;
9898
import static io.wazo.callkeep.Constants.ACTION_ON_CREATE_CONNECTION_FAILED;
99+
import static io.wazo.callkeep.Constants.ACTION_DID_CHANGE_AUDIO_ROUTE;
99100

100101
// @see https://github.com/kbagchiGWC/voice-quickstart-android/blob/9a2aff7fbe0d0a5ae9457b48e9ad408740dfb968/exampleConnectionService/src/main/java/com/twilio/voice/examples/connectionservice/VoiceConnectionServiceActivity.java
101102
public class RNCallKeepModule extends ReactContextBaseJavaModule {
@@ -947,6 +948,7 @@ private void registerReceiver() {
947948
intentFilter.addAction(ACTION_SHOW_INCOMING_CALL_UI);
948949
intentFilter.addAction(ACTION_ON_SILENCE_INCOMING_CALL);
949950
intentFilter.addAction(ACTION_ON_CREATE_CONNECTION_FAILED);
951+
intentFilter.addAction(ACTION_DID_CHANGE_AUDIO_ROUTE);
950952

951953
LocalBroadcastManager.getInstance(this.reactContext).registerReceiver(voiceBroadcastReceiver, intentFilter);
952954
isReceiverRegistered = true;
@@ -1073,6 +1075,11 @@ public void onReceive(Context context, Intent intent) {
10731075
args.putString("callUUID", attributeMap.get(EXTRA_CALL_UUID));
10741076
args.putString("name", attributeMap.get(EXTRA_CALLER_NAME));
10751077
sendEventToJS("RNCallKeepOnIncomingConnectionFailed", args);
1078+
case ACTION_DID_CHANGE_AUDIO_ROUTE:
1079+
args.putString("handle", attributeMap.get(EXTRA_CALL_NUMBER));
1080+
args.putString("callUUID", attributeMap.get(EXTRA_CALL_UUID));
1081+
args.putString("output", attributeMap.get("output"));
1082+
sendEventToJS("RNCallKeepDidChangeAudioRoute", args);
10761083
break;
10771084
}
10781085
}

android/src/main/java/io/wazo/callkeep/VoiceConnection.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import static io.wazo.callkeep.Constants.EXTRA_CALL_UUID;
5151
import static io.wazo.callkeep.Constants.ACTION_SHOW_INCOMING_CALL_UI;
5252
import static io.wazo.callkeep.Constants.ACTION_ON_SILENCE_INCOMING_CALL;
53+
import static io.wazo.callkeep.Constants.ACTION_DID_CHANGE_AUDIO_ROUTE;
5354

5455
@TargetApi(Build.VERSION_CODES.M)
5556
public class VoiceConnection extends Connection {
@@ -88,6 +89,10 @@ public void onExtrasChanged(Bundle extras) {
8889
@Override
8990
public void onCallAudioStateChanged(CallAudioState state) {
9091
Log.d(TAG, "[VoiceConnection] onCallAudioStateChanged muted :" + (state.isMuted() ? "true" : "false"));
92+
93+
handle.put("output", CallAudioState.audioRouteToString(state.getRoute()));
94+
sendCallRequestToActivity(ACTION_DID_CHANGE_AUDIO_ROUTE, handle);
95+
9196
if (state.isMuted() == this.isMuted) {
9297
return;
9398
}
@@ -192,7 +197,7 @@ public void onUnhold() {
192197
sendCallRequestToActivity(ACTION_UNHOLD_CALL, handle);
193198
setActive();
194199
}
195-
200+
196201
public void onReject(int rejectReason) {
197202
Log.d(TAG, "[VoiceConnection] onReject(int) executed");
198203

ios/RNCallKeep/RNCallKeep.m

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
static NSString *const RNCallKeepDidToggleHoldAction = @"RNCallKeepDidToggleHoldAction";
3535
static NSString *const RNCallKeepProviderReset = @"RNCallKeepProviderReset";
3636
static NSString *const RNCallKeepCheckReachability = @"RNCallKeepCheckReachability";
37+
static NSString *const RNCallKeepDidChangeAudioRoute = @"RNCallKeepDidChangeAudioRoute";
3738
static NSString *const RNCallKeepDidLoadWithEvents = @"RNCallKeepDidLoadWithEvents";
3839

3940
@implementation RNCallKeep
@@ -42,7 +43,7 @@ @implementation RNCallKeep
4243
BOOL _isStartCallActionEventListenerAdded;
4344
bool _hasListeners;
4445
NSMutableArray *_delayedEvents;
45-
}
46+
}
4647

4748
static bool isSetupNatively;
4849
static CXProvider* sharedProvider;
@@ -58,6 +59,11 @@ - (instancetype)init
5859
if (self = [super init]) {
5960
_isStartCallActionEventListenerAdded = NO;
6061
if (_delayedEvents == nil) _delayedEvents = [NSMutableArray array];
62+
63+
[[NSNotificationCenter defaultCenter] addObserver:self
64+
selector:@selector(onAudioRouteChange:)
65+
name:AVAudioSessionRouteChangeNotification
66+
object:nil];
6167
}
6268
return self;
6369
}
@@ -116,6 +122,18 @@ - (void)stopObserving
116122
_hasListeners = FALSE;
117123
}
118124

125+
- (void)onAudioRouteChange:(NSNotification *)notification
126+
{
127+
NSDictionary *info = notification.userInfo;
128+
NSInteger reason = [[info valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue];
129+
NSString *output = [AVAudioSession sharedInstance].currentRoute.outputs.count > 0 ? [AVAudioSession sharedInstance].currentRoute.outputs[0].portType : nil;
130+
131+
[self sendEventWithName:RNCallKeepDidChangeAudioRoute body:@{
132+
@"output": output,
133+
@"reason": @(reason),
134+
}];
135+
}
136+
119137
- (void)sendEventWithNameWrapper:(NSString *)name body:(id)body {
120138
if (_hasListeners) {
121139
[self sendEventWithName:name body:body];
@@ -398,8 +416,8 @@ + (void)setup:(NSDictionary *)options {
398416
resolve([RNCallKeep getCalls]);
399417
}
400418

401-
RCT_EXPORT_METHOD(setAudioRoute: (NSString *)uuid
402-
inputName:(NSString *)inputName
419+
RCT_EXPORT_METHOD(setAudioRoute: (NSString *)uuid
420+
inputName:(NSString *)inputName
403421
resolver:(RCTPromiseResolveBlock)resolve
404422
rejecter:(RCTPromiseRejectBlock)reject)
405423
{
@@ -417,7 +435,7 @@ + (void)setup:(NSDictionary *)options {
417435
resolve(@"Speaker");
418436
return;
419437
}
420-
438+
421439
NSArray *ports = [RNCallKeep getAudioInputs];
422440
for (AVAudioSessionPortDescription *port in ports) {
423441
if ([port.portName isEqualToString:inputName]) {
@@ -456,12 +474,12 @@ + (void)setup:(NSDictionary *)options {
456474
+ (NSMutableArray *) formatAudioInputs: (NSMutableArray *)inputs
457475
{
458476
NSMutableArray *newInputs = [NSMutableArray new];
459-
477+
460478
NSMutableDictionary *speakerDict = [[NSMutableDictionary alloc]init];
461479
[speakerDict setObject:@"Speaker" forKey:@"name"];
462480
[speakerDict setObject:AVAudioSessionPortBuiltInSpeaker forKey:@"type"];
463481
[newInputs addObject:speakerDict];
464-
482+
465483
for (AVAudioSessionPortDescription* input in inputs)
466484
{
467485
NSString *str = [NSString stringWithFormat:@"PORTS :\"%@\": UID:%@", input.portName, input.UID ];

0 commit comments

Comments
 (0)