329 lines
		
	
	
	
		
			7.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			329 lines
		
	
	
	
		
			7.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| class SoundPlayer
 | |
| {
 | |
|     static yPlayer = null;
 | |
|     youtubeIsReady = 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_" + Math.floor(Math.random() * 9999999);
 | |
| 		this.loop = false;
 | |
| 		this.isYoutube = false;
 | |
| 		this.load = false;
 | |
| 		this.isMuted_ = false;
 | |
| 		this.audioPlayer = null;
 | |
| 
 | |
| 		//this.textToSpeech = false;
 | |
|         //this.speechSynthMessage = new SpeechSynthesisUtterance();
 | |
| 		//this.textToRead = "hello you know";
 | |
| 		//this.textToReadLang = "en-US";
 | |
| 	}
 | |
| 
 | |
|     /*
 | |
|     setTextToSpeechLang(lang){
 | |
|         this.textToReadLang = lang;
 | |
|     }
 | |
| 
 | |
|     setTextToSpeech(text){
 | |
|         this.textToRead = text;
 | |
|     }
 | |
| 
 | |
|     IsTextToSpeech(result){
 | |
|         if(typeof result !== "undefined"){
 | |
|             this.textToSpeech = result
 | |
|         }
 | |
|         return this.textToSpeech
 | |
|     }
 | |
|     */
 | |
| 
 | |
| 	isYoutubeReady(result){
 | |
| 	    this.youtubeIsReady = result;
 | |
| 	}
 | |
| 
 | |
| 	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;     }
 | |
| 
 | |
|     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 = result.replace(/<[^>]*>?/gm, '');
 | |
| 	}
 | |
| 
 | |
| 	setLoop(result) {
 | |
|         if(!this.isYoutube)
 | |
|         {
 | |
|             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;
 | |
| 
 | |
|         /*
 | |
| 		if(this.IsTextToSpeech()){
 | |
|             this.speechSynthMessage.volume = result;
 | |
| 		    return;
 | |
| 		}
 | |
| 		*/
 | |
| 
 | |
| 		if(this.dynamic && (this.isMuted_ || isMutedAll)){
 | |
| 			if(!this.isYoutube)
 | |
| 			{
 | |
| 				if(this.audioPlayer != null) {
 | |
| 				    this.audioPlayer.volume(0);
 | |
| 				}
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				if(this.yPlayer && this.youtubeIsReady){
 | |
| 				    this.yPlayer.setVolume(0);
 | |
| 				}
 | |
| 			}			
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			if(!this.isYoutube)
 | |
| 			{
 | |
| 				if(this.audioPlayer != null){
 | |
| 				    this.audioPlayer.volume(result);
 | |
| 				}
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				if(this.yPlayer && this.youtubeIsReady){
 | |
| 				    this.yPlayer.setVolume(result * 100);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
|   
 | |
| 	create()
 | |
| 	{
 | |
| 	    $.post('https://xsound/events', JSON.stringify(
 | |
| 	    {
 | |
|             type: "onLoading",
 | |
|             id: this.getName(),
 | |
| 	    }));
 | |
| 	    var 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'],
 | |
|                 onend: function(event){
 | |
|                     ended(null);
 | |
|                 },
 | |
|                 onplay: function(){
 | |
|                     isReady("nothing", true);
 | |
|                 },
 | |
|             });
 | |
|             $("#" + this.div_id).remove();
 | |
|             $("body").append("<div id = '"+ this.div_id +"' style='display:none'>"+this.getUrlSound() +"</div>")
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             this.isYoutube = true;
 | |
|             this.isYoutubeReady(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: {
 | |
|                     controls: 0,
 | |
|                 },
 | |
|                 events: {
 | |
|                     'onReady': function(event){
 | |
|                         event.target.unMute();
 | |
|                         event.target.setVolume(0);
 | |
|                         event.target.playVideo();
 | |
|                         isReady(event.target.getIframe().id);
 | |
|                     },
 | |
|                     'onStateChange': function(event){
 | |
|                         if (event.data == YT.PlayerState.ENDED) {
 | |
|                             isLooped(event.target.getIframe().id);
 | |
|                             ended(event.target.getIframe().id);
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             });
 | |
|         }
 | |
| 	}
 | |
| 
 | |
|     destroyYoutubeApi()
 | |
|     {
 | |
|         if (this.yPlayer) {
 | |
|             if (typeof this.yPlayer.stopVideo === "function" && typeof this.yPlayer.destroy === "function") {
 | |
|                 this.yPlayer.stopVideo();
 | |
|                 this.yPlayer.destroy();
 | |
|                 this.youtubeIsReady = 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) 
 | |
| 	{
 | |
|         var d_max = maxd;
 | |
|         var d_now = dd;
 | |
| 
 | |
|         var vol = 0;
 | |
| 
 | |
|         var distance = (d_now / d_max);
 | |
| 
 | |
|         if (distance < 1)
 | |
|         {
 | |
|             distance = distance * 100;
 | |
|             var 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.IsTextToSpeech()){
 | |
|             this.speechSynthMessage.lang = this.textToReadLang;
 | |
|             this.speechSynthMessage.text = this.textToRead;
 | |
|             window.speechSynthesis.speak(this.speechSynthMessage);
 | |
|             return;
 | |
|         }
 | |
|         */
 | |
| 
 | |
|         if(!this.isYoutube)
 | |
|         {
 | |
|             if(this.audioPlayer != null){
 | |
|                 this.audioPlayer.play();
 | |
|             }
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             if(this.youtubeIsReady){
 | |
|                 this.yPlayer.playVideo();
 | |
|             }
 | |
|         }
 | |
| 	}
 | |
| 	pause()
 | |
| 	{
 | |
|         if(!this.isYoutube)
 | |
|         {
 | |
|             if(this.audioPlayer != null) this.audioPlayer.pause();
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             if(this.youtubeIsReady) this.yPlayer.pauseVideo();
 | |
|         }
 | |
| 	}
 | |
| 
 | |
| 	resume()
 | |
| 	{
 | |
|         if(!this.isYoutube)
 | |
|         {
 | |
|             if(this.audioPlayer != null) this.audioPlayer.play();
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             if(this.youtubeIsReady) 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.isYoutube)
 | |
|         {
 | |
|             this.audioPlayer.seek(time);
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             this.yPlayer.seekTo(time);
 | |
|         }
 | |
| 	}
 | |
| 
 | |
| 	isPlaying()
 | |
| 	{
 | |
|         if(this.isYoutube) return this.youtubeIsReady && this.yPlayer.getPlayerState() == 1;
 | |
|         else return this.audioPlayer != null  && this.audioPlayer.playing();
 | |
| 	}
 | |
| }
 | 
