Skip to content

Commit

Permalink
AudioFile API
Browse files Browse the repository at this point in the history
  • Loading branch information
YuliaGrigorieva committed Jun 24, 2020
1 parent 4955dfd commit 238a50b
Show file tree
Hide file tree
Showing 18 changed files with 767 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/*
* Copyright (c) 2011-2020, Zingaya, Inc. All rights reserved.
*/

package com.voximplant.reactnative;

import com.voximplant.sdk.hardware.IAudioFile;

import java.util.HashMap;
import java.util.Map;

public class AudioFileManager {
private static AudioFileManager mInstance = null;
private HashMap<String, IAudioFile> mAudioFiles = new HashMap<>();

static synchronized AudioFileManager getInstance() {
if (mInstance == null) {
mInstance = new AudioFileManager();
}
return mInstance;
}

void addAudioFile(String fileId, IAudioFile audioFile) {
if (fileId != null && audioFile != null) {
mAudioFiles.put(fileId, audioFile);
}
}

IAudioFile getAudioFile(String fileId) {
if (fileId == null) {
return null;
}
return mAudioFiles.get(fileId);
}

void removeAudioFile(String fileId) {
if (fileId != null) {
mAudioFiles.remove(fileId);
}
}

String getFileIdForAudioFile(IAudioFile audioFile) {
for(Map.Entry<String, IAudioFile> entry : mAudioFiles.entrySet()) {
if (entry.getValue().equals(audioFile)) {
return entry.getKey();
}
}
return null;
}
}
11 changes: 11 additions & 0 deletions android/src/main/java/com/voximplant/reactnative/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ class Constants {
static final String EVENT_CAMERA_SWITCH_DONE = "VICameraSwitchDone";
static final String EVENT_CAMERA_SWITCH_ERROR = "VICameraSwitchError";

static final String EVENT_AUDIO_FILE_STARTED = "VIAudioFileStarted";
static final String EVENT_AUDIO_FILE_STOPPED = "VIAudioFileStopped";

static final String EVENT_NAME_CONNECTION_ESTABLISHED = "ConnectionEstablished";
static final String EVENT_NAME_CONNECTION_FAILED = "ConnectionFailed";
Expand Down Expand Up @@ -77,6 +79,8 @@ class Constants {
static final String EVENT_NAME_CAMERA_SWITCH_DONE = "CameraSwitchDone";
static final String EVENT_NAME_CAMERA_SWITCH_ERROR = "CameraSwitchError";

static final String EVENT_NAME_AUDIO_FILE_STARTED = "Started";
static final String EVENT_NAME_AUDIO_FILE_STOPPED = "Stopped";

static final String EVENT_PARAM_NAME = "name";
static final String EVENT_PARAM_RESULT = "result";
Expand Down Expand Up @@ -113,6 +117,8 @@ class Constants {
static final String EVENT_PARAM_IS_LOCAL = "isLocal";
static final String EVENT_PARAM_VIDEO_STREAM_TYPE = "videoStreamType";

static final String EVENT_PARAM_AUDIO_FILE_ID = "fileId";

static final String EVENT_PARAM_CURRENT_AUDIO_DEVICE = "currentDevice";
static final String EVENT_PARAM_AUDIO_DEVICE_LIST = "newDeviceList";

Expand All @@ -128,6 +134,11 @@ class Constants {
static final String SCALE_TYPE_FIT = "fit";
static final String SCALE_TYPE_FILL = "fill";

static final String IN_CALL = "incall";
static final String NOTIFICATION = "notification";
static final String RINGTONE = "ringtone";
static final String UNKNOWN = "unknown";

static final String VIDEO_STREAM_TYPE_VIDEO = "Video";
static final String VIDEO_STREAM_TYPE_SCREEN_SHARING = "ScreenSharing";

Expand Down
22 changes: 22 additions & 0 deletions android/src/main/java/com/voximplant/reactnative/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import com.voximplant.sdk.client.LoginError;
import com.voximplant.sdk.client.RequestAudioFocusMode;
import com.voximplant.sdk.hardware.AudioDevice;
import com.voximplant.sdk.hardware.AudioFileUsage;
import com.voximplant.sdk.messaging.MessengerAction;
import com.voximplant.sdk.messaging.MessengerEventType;
import com.voximplant.sdk.messaging.MessengerNotification;
Expand Down Expand Up @@ -74,10 +75,14 @@
import static com.voximplant.reactnative.Constants.EVENT_PARAM_LOG_LEVEL_INFO;
import static com.voximplant.reactnative.Constants.EVENT_PARAM_LOG_LEVEL_VERBOSE;
import static com.voximplant.reactnative.Constants.EVENT_PARAM_LOG_LEVEL_WARNING;
import static com.voximplant.reactnative.Constants.IN_CALL;
import static com.voximplant.reactnative.Constants.NOTIFICATION;
import static com.voximplant.reactnative.Constants.RINGTONE;
import static com.voximplant.reactnative.Constants.SEND_MESSAGE;

import static com.voximplant.reactnative.Constants.REQUEST_ON_CALL_CONNECTED;
import static com.voximplant.reactnative.Constants.REQUEST_ON_CALL_START;
import static com.voximplant.reactnative.Constants.UNKNOWN;
import static com.voximplant.reactnative.Constants.VIDEO_STREAM_TYPE_SCREEN_SHARING;
import static com.voximplant.reactnative.Constants.VIDEO_STREAM_TYPE_VIDEO;

Expand Down Expand Up @@ -572,4 +577,21 @@ static String convertVideoStreamType(VideoStreamType videoStreamType) {
return VIDEO_STREAM_TYPE_VIDEO;
}
}

static AudioFileUsage convertStringToAudioFileUsage(String usage) {
if (usage == null) {
return AudioFileUsage.UNKNOWN;
}
switch (usage) {
case IN_CALL:
return AudioFileUsage.IN_CALL;
case NOTIFICATION:
return AudioFileUsage.NOTIFICATION;
case RINGTONE:
return AudioFileUsage.RINGTONE;
case UNKNOWN:
default:
return AudioFileUsage.UNKNOWN;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
/*
* Copyright (c) 2011-2020, Zingaya, Inc. All rights reserved.
*/

package com.voximplant.reactnative;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.voximplant.sdk.Voximplant;
import com.voximplant.sdk.hardware.IAudioFile;
import com.voximplant.sdk.hardware.IAudioFileListener;

import java.util.UUID;

import javax.annotation.Nullable;

import static com.voximplant.reactnative.Constants.EVENT_AUDIO_FILE_STARTED;
import static com.voximplant.reactnative.Constants.EVENT_AUDIO_FILE_STOPPED;
import static com.voximplant.reactnative.Constants.EVENT_NAME_AUDIO_FILE_STARTED;
import static com.voximplant.reactnative.Constants.EVENT_NAME_AUDIO_FILE_STOPPED;
import static com.voximplant.reactnative.Constants.EVENT_PARAM_AUDIO_FILE_ID;
import static com.voximplant.reactnative.Constants.EVENT_PARAM_NAME;
import static com.voximplant.reactnative.Constants.EVENT_PARAM_RESULT;

public class VIAudioFileModule extends ReactContextBaseJavaModule implements IAudioFileListener {
private ReactApplicationContext mReactContext;
private Callback mCallback;

public VIAudioFileModule(ReactApplicationContext reactContext) {
super(reactContext);
mReactContext = reactContext;
}

@Override
public String getName() {
return "VIAudioFileModule";
}

@ReactMethod
public void initWithFile(ReadableMap params, Callback callback) {
if (params == null) {
callback.invoke(null, "Invalid arguments");
return;
}
String name = params.getString("name");
String usage = params.getString("usage");
int rawId = mReactContext.getResources().getIdentifier(name, "raw", mReactContext.getPackageName());
IAudioFile audioFile = Voximplant.createAudioFile(mReactContext, rawId, Utils.convertStringToAudioFileUsage(usage));
if (audioFile == null) {
callback.invoke(null, "Internal error");
return;
}
audioFile.setAudioFileListener(this);
String fileId = UUID.randomUUID().toString();
AudioFileManager.getInstance().addAudioFile(fileId, audioFile);
callback.invoke(fileId, null);
}

@ReactMethod
public void loadFile(ReadableMap params, Callback callback) {
if (params == null) {
callback.invoke(null, "Invalid arguments");
return;
}
String url = params.getString("url");
String usage = params.getString("usage");
IAudioFile audioFile = Voximplant.createAudioFile(url, Utils.convertStringToAudioFileUsage(usage));
if (audioFile == null) {
callback.invoke(null, "Internal error");
return;
}
audioFile.setAudioFileListener(this);
String fileId = UUID.randomUUID().toString();
AudioFileManager.getInstance().addAudioFile(fileId, audioFile);
mCallback = callback;
}

@ReactMethod
public void play(String fileId, boolean loop) {
IAudioFile audioFile = AudioFileManager.getInstance().getAudioFile(fileId);
if (audioFile != null) {
audioFile.play(loop);
}
}

@ReactMethod
public void stop(String fileId) {
IAudioFile audioFile = AudioFileManager.getInstance().getAudioFile(fileId);
if (audioFile != null) {
audioFile.stop(false);
}
}

@ReactMethod
public void releaseResources(String fileId) {
IAudioFile audioFile = AudioFileManager.getInstance().getAudioFile(fileId);
if (audioFile != null) {
audioFile.release();
AudioFileManager.getInstance().removeAudioFile(fileId);
}
}


@Override
public void onStart(IAudioFile audioFile) {
String fileId = AudioFileManager.getInstance().getFileIdForAudioFile(audioFile);
if (fileId != null) {
WritableMap params = Arguments.createMap();
params.putString(EVENT_PARAM_NAME, EVENT_NAME_AUDIO_FILE_STARTED);
params.putString(EVENT_PARAM_AUDIO_FILE_ID, fileId);
params.putBoolean(EVENT_PARAM_RESULT, true);
sendEvent(EVENT_AUDIO_FILE_STARTED, params);
}
}

@Override
public void onStop(IAudioFile audioFile) {
String fileId = AudioFileManager.getInstance().getFileIdForAudioFile(audioFile);
if (fileId != null) {
WritableMap params = Arguments.createMap();
params.putString(EVENT_PARAM_NAME, EVENT_NAME_AUDIO_FILE_STOPPED);
params.putString(EVENT_PARAM_AUDIO_FILE_ID, fileId);
params.putBoolean(EVENT_PARAM_RESULT, true);
sendEvent(EVENT_AUDIO_FILE_STOPPED, params);
}
}

@Override
public void onPrepared(IAudioFile audioFile) {
if (mCallback != null) {
String fileId = AudioFileManager.getInstance().getFileIdForAudioFile(audioFile);
mCallback.invoke(fileId, null);
mCallback = null;
}
}

private void sendEvent(String eventName, @Nullable WritableMap params) {
mReactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(eventName, params);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ public List<NativeModule> createNativeModules(ReactApplicationContext reactConte
new VICallModule(reactContext),
new VIAudioDeviceModule(reactContext),
new VICameraModule(reactContext),
new VIMessagingModule(reactContext));
new VIMessagingModule(reactContext),
new VIAudioFileModule(reactContext));
}

@Override
Expand Down
15 changes: 15 additions & 0 deletions ios/Constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ FOUNDATION_EXPORT NSString *const kEventEndpointRemoved;
FOUNDATION_EXPORT NSString *const kEventAudioDeviceChanged;
FOUNDATION_EXPORT NSString *const kEventAudioDeviceListChanged;

FOUNDATION_EXPORT NSString *const kEventAudioFileStarted;
FOUNDATION_EXPORT NSString *const kEventAudioFileStopped;

FOUNDATION_EXPORT NSString *const kEventNameConnectionEstablished;
FOUNDATION_EXPORT NSString *const kEventNameConnectionFailed;
Expand Down Expand Up @@ -60,6 +62,8 @@ FOUNDATION_EXPORT NSString *const kEventNameEndpointRemoved;
FOUNDATION_EXPORT NSString *const kEventNameAudioDeviceChanged;
FOUNDATION_EXPORT NSString *const kEventNameAudioDeviceListChanged;

FOUNDATION_EXPORT NSString *const kEventNameAudioFileStarted;
FOUNDATION_EXPORT NSString *const kEventNameAudioFileStopped;

FOUNDATION_EXPORT NSString *const kEventParamName;
FOUNDATION_EXPORT NSString *const kEventParamResult;
Expand Down Expand Up @@ -97,6 +101,9 @@ FOUNDATION_EXPORT NSString *const kEventParamCurrentAudioDevice;
FOUNDATION_EXPORT NSString *const kEventParamDeviceList;
FOUNDATION_EXPORT NSString *const kEventParamVideoStreamType;

FOUNDATION_EXPORT NSString *const kEventParamAudioFileId;
FOUNDATION_EXPORT NSString *const kEventParamError;

FOUNDATION_EXPORT NSString *const kVideoStreamTypeVideo;
FOUNDATION_EXPORT NSString *const kVideoStreamTypeScreenSharing;

Expand All @@ -109,6 +116,14 @@ FOUNDATION_EXPORT NSString *const kCallErrorAlreadyInThisState;
FOUNDATION_EXPORT NSString *const kCallErrorMediaIsOnHold;
FOUNDATION_EXPORT NSString *const kCallErrorInternal;

FOUNDATION_EXPORT NSString *const kAudioFileErrorInternal;
FOUNDATION_EXPORT NSString *const kAudioFileErrorInterrupted;
FOUNDATION_EXPORT NSString *const kAudioFileErrorDestroyed;
FOUNDATION_EXPORT NSString *const kAudioFileErrorAlreadyPlaying;
FOUNDATION_EXPORT NSString *const kAudioFileErrorCallKitActivated;
FOUNDATION_EXPORT NSString *const kAudioFileErrorCallKitDeactivated;
FOUNDATION_EXPORT NSString *const kAudioFileErrorFailedToConfigureAudioSession;

FOUNDATION_EXPORT NSString *const kAudioDeviceEarpiece;
FOUNDATION_EXPORT NSString *const kAudioDeviceSpeaker;
FOUNDATION_EXPORT NSString *const kAudioDeviceWired;
Expand Down
16 changes: 16 additions & 0 deletions ios/Constants.m
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@
NSString *const kEventAudioDeviceChanged = @"VIAudioDeviceChanged";
NSString *const kEventAudioDeviceListChanged = @"VIAudioDeviceListChanged";

NSString *const kEventAudioFileStarted = @"VIAudioFileStarted";
NSString *const kEventAudioFileStopped = @"VIAudioFileStopped";


NSString *const kEventNameConnectionEstablished = @"ConnectionEstablished";
NSString *const kEventNameConnectionFailed = @"ConnectionFailed";
Expand Down Expand Up @@ -61,6 +64,8 @@
NSString *const kEventNameAudioDeviceChanged = @"DeviceChanged";
NSString *const kEventNameAudioDeviceListChanged = @"DeviceListChanged";

NSString *const kEventNameAudioFileStarted = @"Started";
NSString *const kEventNameAudioFileStopped = @"Stopped";

NSString *const kEventParamName = @"name";
NSString *const kEventParamResult = @"result";
Expand Down Expand Up @@ -98,6 +103,9 @@
NSString *const kEventParamDeviceList = @"newDeviceList";
NSString *const kEventParamVideoStreamType = @"videoStreamType";

NSString *const kEventParamAudioFileId = @"fileId";
NSString *const kEventParamError = @"error";

NSString *const kVideoStreamTypeVideo = @"Video";
NSString *const kVideoStreamTypeScreenSharing = @"ScreenSharing";

Expand All @@ -110,6 +118,14 @@
NSString *const kCallErrorMediaIsOnHold = @"MEDIA_IS_ON_HOLD";
NSString *const kCallErrorInternal = @"INTERNAL_ERROR";

NSString *const kAudioFileErrorInternal = @"INTERNAL_ERROR";
NSString *const kAudioFileErrorInterrupted = @"INTERRUPTED";
NSString *const kAudioFileErrorDestroyed = @"DESTROYED";
NSString *const kAudioFileErrorAlreadyPlaying = @"ALREADY_PLAYING";
NSString *const kAudioFileErrorCallKitActivated = @"CALLKIT_ACTIVATED";
NSString *const kAudioFileErrorCallKitDeactivated = @"CALLKIT_DEACTIVATED";
NSString *const kAudioFileErrorFailedToConfigureAudioSession = @"FAILED_TO_CONFIGURE_AUDIO_SESSION";

NSString *const kAudioDeviceEarpiece = @"Earpiece";
NSString *const kAudioDeviceSpeaker = @"Speaker";
NSString *const kAudioDeviceWired = @"WiredHeadset";
Expand Down
1 change: 1 addition & 0 deletions ios/Utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,6 @@
+ (NSString *)convertLogSeverity:(VILogSeverity)severity;
+ (NSDictionary *)convertAuthParamsToDictionary:(VIAuthParams *)authParams;
+ (NSString *)convertVideoStreamTypeToString:(VIVideoStreamType)videoStreamType;
+ (NSString *)convertAudioFileErrorToString:(VIAudioFileErrorCode)audioFileError;

@end
Loading

0 comments on commit 238a50b

Please sign in to comment.