Files
red-valley/resources/[framework]/[depends]/xsound/html/scripts/SoundPlayer.js
2026-03-29 21:41:17 +03:00

302 lines
7.3 KiB
JavaScript

let identifierCounterVariable = 0;
class SoundPlayer {
static yPlayer = null;
youtubePlayerReady = false;
constructor() {
this.url = "test";
this.name = "";
this.dynamic = false;
this.distance = 10;
this.volume = 1.0;
this.pos = [ 0.0, 0.0, 0.0 ];
this.max_volume = -1.0;
this.div_id = "myAudio_" + identifierCounterVariable++;
this.loop = false;
this.isYoutube = false;
this.load = false;
this.isMuted_ = false;
this.audioPlayer = null;
}
setYoutubePlayerReady(result) {
this.youtubePlayerReady = result;
}
isYoutubePlayerReady() {
return this.youtubePlayerReady;
}
isAudioYoutubePlayer() {
return this.isYoutube;
}
getDistance() {
return this.distance;
}
getLocation() {
return this.pos;
}
getVolume() {
return this.volume;
}
getMaxVolume() {
return this.max_volume;
}
getUrlSound() {
return this.url;
}
isDynamic() {
return this.dynamic;
}
getDivId() {
return this.div_id;
}
isLoop() {
return this.loop;
}
getName() {
return this.name;
}
loaded() {
return this.load;
}
getAudioPlayer() {
return this.audioPlayer;
}
getYoutubePlayer() {
return this.yPlayer;
}
getAudioCurrentTime() {
if (this.isAudioYoutubePlayer()) {
return this.getYoutubePlayer().getDuration();
}
return this.getAudioPlayer()._duration;
}
setLoaded(result) {
this.load = result;
}
setName(result) {
this.name = result;
}
setDistance(result) {
this.distance = result;
}
setDynamic(result) {
this.dynamic = result;
}
setLocation(x_, y_, z_) {
this.pos = [ x_, y_, z_ ];
}
setSoundUrl(result) {
this.url = sanitizeURL(result);
}
setLoop(result) {
if (!this.isAudioYoutubePlayer()) {
if (this.audioPlayer != null) {
this.audioPlayer.loop(result);
}
}
this.loop = result;
}
setMaxVolume(result) {
this.max_volume = result;
}
setVolume(result) {
this.volume = result;
if (this.max_volume == -1) this.max_volume = result;
if (this.max_volume > (this.volume - 0.01)) this.volume = this.max_volume;
let volume = result;
if (this.isDynamic() && (this.isMuted() || IsAllMuted)) volume = 0;
if (this.isAudioYoutubePlayer() && this.yPlayer && this.isYoutubePlayerReady()) {
this.yPlayer.setVolume(volume * 100);
} else if (this.audioPlayer) {
this.audioPlayer.volume(volume);
}
}
create() {
const link = getYoutubeUrlId(this.getUrlSound());
if (link === "") {
this.isYoutube = false;
this.audioPlayer = new Howl({
src: [ this.getUrlSound() ],
loop: false,
html5: true,
autoplay: false,
volume: 0.00,
format: [ 'mp3' ],
onload: () => {
$.post('https://xsound/events', JSON.stringify({ type: "onLoading", id: this.getName() }));
},
onend: () => {
ended(this.getName());
},
onplay: () => {
isReady(this.getName());
},
});
$("#" + this.div_id).remove();
} else {
this.isYoutube = true;
this.setYoutubePlayerReady(false);
$("#" + this.div_id).remove();
$("body").append("<div id='" + this.div_id + "'></div>");
this.yPlayer = new YT.Player(this.div_id, {
startSeconds: Number,
videoId: link,
origin: window.location.href,
enablejsapi: 1,
width: "0",
height: "0",
playerVars: {
autoplay: 0,
controls: 0,
quality: 'auto',
},
events: {
'onReady': (event) => {
event.target.unMute();
event.target.setVolume(0);
event.target.playVideo();
isReady(this.getName());
$.post('https://xsound/events', JSON.stringify({ type: "onLoading", id: this.getName() }));
},
'onStateChange': (event) => {
if (event.data == YT.PlayerState.ENDED) {
ended(this.getName());
}
}
}
});
}
}
destroyYoutubeApi() {
if (this.yPlayer) {
if (typeof this.yPlayer.stopVideo === "function" && typeof this.yPlayer.destroy === "function") {
this.yPlayer.stopVideo();
this.yPlayer.destroy();
this.youtubePlayerReady = false;
this.yPlayer = null;
}
}
}
delete() {
if (this.audioPlayer != null) {
this.audioPlayer.pause();
this.audioPlayer.stop();
this.audioPlayer.unload();
}
this.audioPlayer = null;
$("#" + this.div_id).remove();
}
updateVolume(dd, maxd) {
const d_max = maxd;
const d_now = dd;
let vol = 0;
let distance = (d_now / d_max);
if (distance < 1) {
distance = distance * 100;
const far_away = 100 - distance;
vol = (this.max_volume / 100) * far_away;
this.setVolume(vol);
this.isMuted_ = false;
} else {
this.setVolume(0);
this.isMuted_ = true;
}
}
play() {
if (!this.isAudioYoutubePlayer()) {
if (this.audioPlayer != null) {
this.audioPlayer.play();
}
} else {
if (this.isYoutubePlayerReady()) {
this.yPlayer.playVideo();
}
}
}
pause() {
if (!this.isAudioYoutubePlayer()) {
if (this.audioPlayer != null) this.audioPlayer.pause();
} else {
if (this.isYoutubePlayerReady()) this.yPlayer.pauseVideo();
}
}
resume() {
if (!this.isAudioYoutubePlayer()) {
if (this.audioPlayer != null) this.audioPlayer.play();
} else {
if (this.isYoutubePlayerReady()) this.yPlayer.playVideo();
}
}
isMuted() {
return this.isMuted_;
}
mute() {
this.isMuted_ = true;
this.setVolume(0)
}
unmute() {
this.isMuted_ = false;
this.setVolume(this.getVolume())
}
unmuteSilent() {
this.isMuted_ = false;
}
setTimeStamp(time) {
if (!this.isAudioYoutubePlayer()) {
this.audioPlayer.seek(time);
} else {
this.yPlayer.seekTo(time);
}
}
isPlaying() {
if (this.isAudioYoutubePlayer()) return this.isYoutubePlayerReady() && this.yPlayer.getPlayerState() == 1;
else return this.audioPlayer != null && this.audioPlayer.playing();
}
}