UNPKG

react-native-audio-recorder-player

Version:
302 lines (274 loc) 7.12 kB
import { DeviceEventEmitter, EmitterSubscription, NativeEventEmitter, NativeModules, Platform, } from 'react-native'; const { RNAudioRecorderPlayer } = NativeModules; export enum AudioSourceAndroidType { DEFAULT = 0, MIC, VOICE_UPLINK, VOICE_DOWNLINK, VOICE_CALL, CAMCORDER, VOICE_RECOGNITION, VOICE_COMMUNICATION, REMOTE_SUBMIX, UNPROCESSED, RADIO_TUNER = 1998, HOTWORD, } export enum OutputFormatAndroidType { DEFAULT = 0, THREE_GPP, MPEG_4, AMR_NB, AMR_WB, AAC_ADIF, AAC_ADTS, OUTPUT_FORMAT_RTP_AVP, MPEG_2_TS, WEBM, } export enum AudioEncoderAndroidType { DEFAULT = 0, AMR_NB, AMR_WB, AAC, HE_AAC, AAC_ELD, VORBIS, } type AVEncodingType = | AVEncodingOption.lpcm | AVEncodingOption.ima4 | AVEncodingOption.aac | AVEncodingOption.MAC3 | AVEncodingOption.MAC6 | AVEncodingOption.ulaw | AVEncodingOption.alaw | AVEncodingOption.mp1 | AVEncodingOption.mp2 | AVEncodingOption.alac | AVEncodingOption.amr | AVEncodingOption.flac | AVEncodingOption.opus; export enum AVEncodingOption { lpcm = 'lpcm', ima4 = 'ima4', aac = 'aac', MAC3 = 'MAC3', MAC6 = 'MAC6', ulaw = 'ulaw', alaw = 'alaw', mp1 = 'mp1', mp2 = 'mp2', alac = 'alac', amr = 'amr', flac = 'flac', opus = 'opus', } export enum AVEncoderAudioQualityIOSType { min = 0, low = 32, medium = 64, high = 96, max = 127, } export interface AudioSet { AVSampleRateKeyIOS?: number; AVFormatIDKeyIOS?: AVEncodingType; AVNumberOfChannelsKeyIOS?: number; AVEncoderAudioQualityKeyIOS?: AVEncoderAudioQualityIOSType; AudioSourceAndroid?: AudioSourceAndroidType; OutputFormatAndroid?: OutputFormatAndroidType; AudioEncoderAndroid?: AudioEncoderAndroidType; AudioEncodingBitRateAndroid?: number; AudioSamplingRateAndroid?: number; } const pad = (num: number): string => { return ('0' + num).slice(-2); }; class AudioRecorderPlayer { private _isRecording: boolean; private _isPlaying: boolean; private _hasPaused: boolean; private _recorderSubscription: EmitterSubscription; private _playerSubscription: EmitterSubscription; private _recordInterval: number; mmss = (secs: number): string => { let minutes = Math.floor(secs / 60); secs = secs % 60; minutes = minutes % 60; // minutes = ('0' + minutes).slice(-2); // secs = ('0' + secs).slice(-2); return pad(minutes) + ':' + pad(secs); }; mmssss = (milisecs: number): string => { const secs = Math.floor(milisecs / 1000); const minutes = Math.floor(secs / 60); const seconds = secs % 60; const miliseconds = Math.floor((milisecs % 1000) / 10); return pad(minutes) + ':' + pad(seconds) + ':' + pad(miliseconds); }; /** * set listerner from native module for recorder. * @returns {callBack(e: any)} */ addRecordBackListener = (e): void => { if (Platform.OS === 'android') { this._recorderSubscription = DeviceEventEmitter.addListener('rn-recordback', e); } else { const myModuleEvt = new NativeEventEmitter(RNAudioRecorderPlayer); this._recorderSubscription = myModuleEvt.addListener('rn-recordback', e); } }; /** * remove listener for recorder. * @returns {void} */ removeRecordBackListener = (): void => { if (this._recorderSubscription) { this._recorderSubscription.remove(); this._recorderSubscription = null; } }; /** * set listener from native module for player. * @returns {callBack(e: Event)} */ addPlayBackListener = (e): void => { if (Platform.OS === 'android') { this._playerSubscription = DeviceEventEmitter.addListener('rn-playback', e); } else { const myModuleEvt = new NativeEventEmitter(RNAudioRecorderPlayer); this._playerSubscription = myModuleEvt.addListener('rn-playback', e); } }; /** * remove listener for player. * @returns {void} */ removePlayBackListener = (): void => { if (this._playerSubscription) { this._playerSubscription.remove(); this._playerSubscription = null; } }; /** * start recording with param. * @param {string} uri audio uri. * @returns {Promise<string>} */ startRecorder = async ( uri?: string, meteringEnabled?: boolean, audioSets?: AudioSet, ): Promise<string> => { if (!uri) { uri = 'DEFAULT'; } if (!meteringEnabled) { meteringEnabled = false; } if (!this._isRecording) { this._isRecording = true; return RNAudioRecorderPlayer.startRecorder(uri, meteringEnabled, audioSets); } return 'Already recording'; }; /** * stop recording. * @returns {Promise<string>} */ stopRecorder = async (): Promise<string> => { if (this._isRecording) { this._isRecording = false; return RNAudioRecorderPlayer.stopRecorder(); } return 'Already stopped'; }; /** * resume playing. * @returns {Promise<string>} */ resumePlayer = async (): Promise<string> => { if (!this._isPlaying) return 'No audio playing'; if (this._hasPaused) { this._hasPaused = false; return RNAudioRecorderPlayer.resumePlayer(); } return 'Already playing'; }; /** * start playing with param. * @param {string} uri audio uri. * @returns {Promise<string>} */ startPlayer = async (uri?: string): Promise<string> => { if (!uri) { uri = 'DEFAULT'; } if (!this._isPlaying || this._hasPaused) { this._isPlaying = true; this._hasPaused = false; return RNAudioRecorderPlayer.startPlayer(uri); } }; /** * stop playing. * @returns {Promise<string>} */ stopPlayer = async (): Promise<string> => { if (this._isPlaying) { this._isPlaying = false; this._hasPaused = false; return RNAudioRecorderPlayer.stopPlayer(); } return 'Already stopped playing'; }; /** * pause playing. * @returns {Promise<string>} */ pausePlayer = async (): Promise<string> => { if (!this._isPlaying) return 'No audio playing'; if (!this._hasPaused) { this._hasPaused = true; return RNAudioRecorderPlayer.pausePlayer(); } }; /** * seek to. * @param {number} time position seek to in second. * @returns {Promise<string>} */ seekToPlayer = async (time: number): Promise<string> => { if (Platform.OS === 'ios') { time = time / 1000; } return RNAudioRecorderPlayer.seekToPlayer(time); }; /** * set volume. * @param {number} setVolume set volume. * @returns {Promise<string>} */ setVolume = async (volume: number): Promise<string> => { if (volume < 0 || volume > 1) { throw new Error('Value of volume should be between 0.0 to 1.0'); } return RNAudioRecorderPlayer.setVolume(volume); }; /** * set subscription duration. * @param {number} sec subscription callback duration in seconds. * @returns {Promise<string>} */ setSubscriptionDuration = async (sec: number): Promise<string> => { return RNAudioRecorderPlayer.setSubscriptionDuration(sec); }; } export default AudioRecorderPlayer;