nativescript-audio-with-pitch
Version:
NativeScript plugin to record and play audio.
313 lines • 11.6 kB
JavaScript
import { knownFolders, Observable, path as nsFilePath, Utils } from '@nativescript/core';
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TNSPlayerDelegate = void 0;
var TNSPlayerDelegate = /** @class */ (function (_super) {
__extends(TNSPlayerDelegate, _super);
function TNSPlayerDelegate() {
return _super !== null && _super.apply(this, arguments) || this;
}
TNSPlayerDelegate.initWithOwner = function (owner) {
var delegate = TNSPlayerDelegate.new();
delegate._owner = new WeakRef(owner);
return delegate;
};
TNSPlayerDelegate.prototype.audioPlayerDidFinishPlayingSuccessfully = function (player, flag) {
var owner = this._owner.get();
if (owner) {
if (flag && owner.completeCallback) {
owner.completeCallback({ player: player, flag: flag });
}
else if (!flag && owner.errorCallback) {
owner.errorCallback({ player: player, flag: flag });
}
}
};
TNSPlayerDelegate.prototype.audioPlayerDecodeErrorDidOccurError = function (player, error) {
var owner = this._owner.get();
if (owner) {
if (owner.errorCallback) {
owner.errorCallback({ player: player, error: error });
}
}
};
TNSPlayerDelegate.ObjCProtocols = [AVAudioPlayerDelegate];
return TNSPlayerDelegate;
}(NSObject));
exports.TNSPlayerDelegate = TNSPlayerDelegate;
export class TNSPlayer extends Observable {
get ios() {
return this._player;
}
get volume() {
return this._player ? this._player.volume : 0;
}
set volume(value) {
if (this._player && value >= 0) {
this._player.volume = value;
}
}
get duration() {
if (this._player) {
return this._player.duration;
}
else {
return 0;
}
}
get currentTime() {
return this._player ? this._player.currentTime : 0;
}
initFromFile(options) {
return new Promise((resolve, reject) => {
options.autoPlay = false;
this.playFromFile(options).then(resolve, reject);
});
}
playFromFile(options) {
return new Promise((resolve, reject) => {
if (options.autoPlay !== false) {
options.autoPlay = true;
}
try {
let fileName = Utils.isString(options.audioFile)
? options.audioFile.trim()
: '';
if (fileName.indexOf('~/') === 0) {
fileName = nsFilePath.join(knownFolders.currentApp().path, fileName.replace('~/', ''));
}
this.completeCallback = options.completeCallback;
this.errorCallback = options.errorCallback;
this.infoCallback = options.infoCallback;
const audioSession = AVAudioSession.sharedInstance();
if (options.audioMixing) {
audioSession.setCategoryWithOptionsError(AVAudioSessionCategoryAmbient, 1);
}
else {
audioSession.setCategoryWithOptionsError(AVAudioSessionCategoryAmbient, 2);
}
const output = audioSession.currentRoute.outputs.lastObject.portType;
if (output.match(/Receiver/)) {
try {
audioSession.setCategoryError(AVAudioSessionCategoryPlayAndRecord);
audioSession.overrideOutputAudioPortError(1936747378);
audioSession.setActiveError(true);
}
catch (err) {
console.error('setting audioSession catergory failed', err);
}
}
const errorRef = new interop.Reference();
this._player = AVAudioPlayer.alloc().initWithContentsOfURLError(NSURL.fileURLWithPath(fileName), errorRef);
if (errorRef && errorRef.value) {
reject(errorRef.value);
return;
}
else if (this._player) {
this._player.delegate = TNSPlayerDelegate.initWithOwner(this);
this._player.enableRate = true;
if (options.metering) {
this._player.meteringEnabled = true;
}
if (options.loop) {
this._player.numberOfLoops = -1;
}
if (options.autoPlay) {
this._player.play();
}
resolve(null);
}
else {
reject();
}
}
catch (ex) {
if (this.errorCallback) {
this.errorCallback({ ex });
}
reject(ex);
}
});
}
initFromUrl(options) {
return new Promise((resolve, reject) => {
options.autoPlay = false;
this.playFromUrl(options).then(resolve, reject);
});
}
playFromUrl(options) {
return new Promise((resolve, reject) => {
if (options.autoPlay !== false) {
options.autoPlay = true;
}
try {
this._task = NSURLSession.sharedSession.dataTaskWithURLCompletionHandler(NSURL.URLWithString(options.audioFile), (data, response, error) => {
if (error !== null) {
if (this.errorCallback) {
this.errorCallback({ error });
}
reject();
}
this.completeCallback = options.completeCallback;
this.errorCallback = options.errorCallback;
this.infoCallback = options.infoCallback;
const audioSession = AVAudioSession.sharedInstance();
if (options.audioMixing) {
audioSession.setCategoryWithOptionsError(AVAudioSessionCategoryAmbient, 1);
}
else {
audioSession.setCategoryWithOptionsError(AVAudioSessionCategoryAmbient, 2);
}
const output = audioSession.currentRoute.outputs.lastObject.portType;
if (output.match(/Receiver/)) {
try {
audioSession.setCategoryError(AVAudioSessionCategoryPlayAndRecord);
audioSession.overrideOutputAudioPortError(1936747378);
audioSession.setActiveError(true);
}
catch (err) {
console.error('Setting audioSession category failed.', err);
}
}
const errorRef = new interop.Reference();
this._player = AVAudioPlayer.alloc().initWithDataError(data, errorRef);
if (errorRef && errorRef.value) {
reject(errorRef.value);
return;
}
else if (this._player) {
this._player.delegate = TNSPlayerDelegate.initWithOwner(this);
this._player.enableRate = true;
this._player.numberOfLoops = options.loop ? -1 : 0;
if (options.metering) {
this._player.meteringEnabled = true;
}
if (options.autoPlay) {
this._player.play();
}
resolve(null);
}
else {
reject();
}
});
this._task.resume();
}
catch (ex) {
if (this.errorCallback) {
this.errorCallback({ ex });
}
reject(ex);
}
});
}
pause() {
return new Promise((resolve, reject) => {
try {
if (this._player && this._player.playing) {
this._player.pause();
resolve(true);
}
}
catch (ex) {
if (this.errorCallback) {
this.errorCallback({ ex });
}
reject(ex);
}
});
}
play() {
return new Promise((resolve, reject) => {
try {
if (!this.isAudioPlaying()) {
this._player.play();
resolve(true);
}
}
catch (ex) {
if (this.errorCallback) {
this.errorCallback({ ex });
}
reject(ex);
}
});
}
resume() {
if (this._player) {
this._player.play();
}
}
playAtTime(time) {
if (this._player) {
this._player.playAtTime(time);
}
}
seekTo(time) {
return new Promise((resolve, reject) => {
try {
if (this._player) {
this._player.currentTime = time;
resolve(true);
}
}
catch (ex) {
reject(ex);
}
});
}
dispose() {
return new Promise((resolve, reject) => {
try {
if (this._player && this.isAudioPlaying()) {
this._player.stop();
}
const audioSession = AVAudioSession.sharedInstance();
audioSession.setActiveError(false);
this._reset();
resolve(null);
}
catch (ex) {
if (this.errorCallback) {
this.errorCallback({ ex });
}
reject(ex);
}
});
}
isAudioPlaying() {
return this._player ? this._player.playing : false;
}
getAudioTrackDuration() {
return new Promise((resolve, reject) => {
try {
const duration = this._player ? this._player.duration : 0;
resolve(duration.toString());
}
catch (ex) {
if (this.errorCallback) {
this.errorCallback({ ex });
}
reject(ex);
}
});
}
changePlayerSpeed(speed) {
if (this._player && speed) {
if (typeof speed === 'string') {
speed = parseFloat(speed);
}
this._player.rate = speed;
}
}
_reset() {
if (this._player) {
this._player = undefined;
}
if (this._task) {
this._task.cancel();
this._task = undefined;
}
}
}
//# sourceMappingURL=player.js.map