| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*  video_player.cpp                                                     */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							|  |  |  | /*                    http://www.godotengine.org                         */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2017-01-01 22:01:57 +01:00
										 |  |  | /* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the       */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including   */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to */ | 
					
						
							|  |  |  | /* the following conditions:                                             */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be        */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | #include "video_player.h"
 | 
					
						
							| 
									
										
										
										
											2015-11-25 00:28:03 -03:00
										 |  |  | #include "os/os.h"
 | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int VideoPlayer::InternalStream::get_channel_count() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return player->sp_get_channel_count(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | void VideoPlayer::InternalStream::set_mix_rate(int p_rate){ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return player->sp_set_mix_rate(p_rate); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | bool VideoPlayer::InternalStream::mix(int32_t *p_buffer,int p_frames){ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return player->sp_mix(p_buffer,p_frames); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | void VideoPlayer::InternalStream::update(){ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	player->sp_update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int VideoPlayer::sp_get_channel_count() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return playback->get_channels(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void VideoPlayer::sp_set_mix_rate(int p_rate){ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	server_mix_rate=p_rate; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool VideoPlayer::sp_mix(int32_t *p_buffer,int p_frames) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (resampler.is_ready()) { | 
					
						
							|  |  |  | 		return resampler.mix(p_buffer,p_frames); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void VideoPlayer::sp_update() { | 
					
						
							|  |  |  | #if 0
 | 
					
						
							|  |  |  | 	_THREAD_SAFE_METHOD_ | 
					
						
							|  |  |  | 	//update is unused
 | 
					
						
							|  |  |  | 	if (!paused && playback.is_valid()) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (!playback->is_playing()) { | 
					
						
							|  |  |  | 			//stream depleted data, but there's still audio in the ringbuffer
 | 
					
						
							|  |  |  | 			//check that all this audio has been flushed before stopping the stream
 | 
					
						
							|  |  |  | 			int to_mix = resampler.get_total() - resampler.get_todo(); | 
					
						
							|  |  |  | 			if (to_mix==0) { | 
					
						
							|  |  |  | 				stop(); | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		int todo =resampler.get_todo(); | 
					
						
							|  |  |  | 		int wrote = playback->mix(resampler.get_write_buffer(),todo); | 
					
						
							|  |  |  | 		resampler.write(wrote); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int VideoPlayer::_audio_mix_callback(void* p_udata,const int16_t *p_data,int p_frames) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	VideoPlayer *vp=(VideoPlayer*)p_udata; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int todo=MIN(vp->resampler.get_todo(),p_frames); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int16_t *wb = vp->resampler.get_write_buffer(); | 
					
						
							|  |  |  | 	int c = vp->resampler.get_channel_count(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for(int i=0;i<todo*c;i++) { | 
					
						
							|  |  |  | 		wb[i]=p_data[i]; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	vp->resampler.write(todo); | 
					
						
							|  |  |  | 	return todo; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | void VideoPlayer::_notification(int p_notification) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch (p_notification) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-05 21:20:42 -03:00
										 |  |  | 		case NOTIFICATION_ENTER_TREE: { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-15 09:17:32 -03:00
										 |  |  | 			if (stream.is_valid() && autoplay && !get_tree()->is_editor_hint()) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 				play(); | 
					
						
							| 
									
										
										
										
											2015-12-15 09:17:32 -03:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		} break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		case NOTIFICATION_PROCESS: { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (stream.is_null()) | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			if (paused) | 
					
						
							|  |  |  | 				return; | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 			if (!playback->is_playing()) | 
					
						
							| 
									
										
										
										
											2014-11-02 11:31:01 -03:00
										 |  |  | 				return; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-21 21:18:16 -03:00
										 |  |  | 			double audio_time = USEC_TO_SEC(OS::get_singleton()->get_ticks_usec()); //AudioServer::get_singleton()->get_mix_time();
 | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			double delta = last_audio_time==0?0:audio_time-last_audio_time; | 
					
						
							|  |  |  | 			last_audio_time=audio_time; | 
					
						
							|  |  |  | 			if (delta==0) | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			playback->update(delta); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		} break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		case NOTIFICATION_DRAW: { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (texture.is_null()) | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			if (texture->get_width() == 0) | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			Size2 s=expand?get_size():texture->get_size(); | 
					
						
							|  |  |  | 			draw_texture_rect(texture,Rect2(Point2(),s),false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | Size2 VideoPlayer::get_minimum_size() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!expand && !texture.is_null()) | 
					
						
							|  |  |  | 		return texture->get_size(); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		return Size2(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void VideoPlayer::set_expand(bool p_expand) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	expand=p_expand; | 
					
						
							|  |  |  | 	update(); | 
					
						
							|  |  |  | 	minimum_size_changed(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool VideoPlayer::has_expand() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return expand; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void VideoPlayer::set_stream(const Ref<VideoStream> &p_stream) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	stop(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	stream=p_stream; | 
					
						
							| 
									
										
										
										
											2015-10-13 01:17:54 -03:00
										 |  |  |     if (stream.is_valid()) { | 
					
						
							| 
									
										
										
										
											2015-11-04 09:54:23 -03:00
										 |  |  | 	stream->set_audio_track(audio_track); | 
					
						
							|  |  |  | 	playback=stream->instance_playback(); | 
					
						
							| 
									
										
										
										
											2015-10-13 01:17:54 -03:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2015-11-04 09:54:23 -03:00
										 |  |  | 	playback=Ref<VideoStreamPlayback>(); | 
					
						
							| 
									
										
										
										
											2015-10-13 01:17:54 -03:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (!playback.is_null()) { | 
					
						
							|  |  |  | 		playback->set_loop(loops); | 
					
						
							|  |  |  | 		playback->set_paused(paused); | 
					
						
							|  |  |  | 		texture=playback->get_texture(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-15 15:31:32 +02:00
										 |  |  | 		const int channels = playback->get_channels(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 		AudioServer::get_singleton()->lock(); | 
					
						
							| 
									
										
										
										
											2016-06-15 15:31:32 +02:00
										 |  |  | 		if (channels > 0) | 
					
						
							|  |  |  | 			resampler.setup(channels,playback->get_mix_rate(),server_mix_rate,buffering_ms,0); | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			resampler.clear(); | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 		AudioServer::get_singleton()->unlock(); | 
					
						
							| 
									
										
										
										
											2016-06-15 15:31:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (channels > 0) | 
					
						
							|  |  |  | 			playback->set_mix_callback(_audio_mix_callback,this); | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		texture.unref(); | 
					
						
							|  |  |  | 		AudioServer::get_singleton()->lock(); | 
					
						
							|  |  |  | 		resampler.clear(); | 
					
						
							|  |  |  | 		AudioServer::get_singleton()->unlock(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 	update(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Ref<VideoStream> VideoPlayer::get_stream() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return stream; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void VideoPlayer::play() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-05 21:20:42 -03:00
										 |  |  | 	ERR_FAIL_COND(!is_inside_tree()); | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 	if (playback.is_null()) | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 	playback->stop(); | 
					
						
							|  |  |  | 	playback->play(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	set_process(true); | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 	AudioServer::get_singleton()->stream_set_active(stream_rid,true); | 
					
						
							|  |  |  | 	AudioServer::get_singleton()->stream_set_volume_scale(stream_rid,volume); | 
					
						
							|  |  |  | 	last_audio_time=0; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void VideoPlayer::stop() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-05 21:20:42 -03:00
										 |  |  | 	if (!is_inside_tree()) | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 	if (playback.is_null()) | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 	playback->stop(); | 
					
						
							| 
									
										
										
										
											2015-11-04 09:54:23 -03:00
										 |  |  | 	AudioServer::get_singleton()->stream_set_active(stream_rid,false); | 
					
						
							| 
									
										
										
										
											2016-09-28 13:39:06 +02:00
										 |  |  | 	resampler.flush(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	set_process(false); | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 	last_audio_time=0; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool VideoPlayer::is_playing() const { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 	if (playback.is_null()) | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		return false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 	return playback->is_playing(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void VideoPlayer::set_paused(bool p_paused) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	paused=p_paused; | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 	if (playback.is_valid()) { | 
					
						
							|  |  |  | 		playback->set_paused(p_paused); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		set_process(!p_paused); | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2015-12-26 15:38:39 -03:00
										 |  |  | 	last_audio_time = 0; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool VideoPlayer::is_paused() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return paused; | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void VideoPlayer::set_buffering_msec(int p_msec) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	buffering_ms=p_msec; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int VideoPlayer::get_buffering_msec() const{ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return buffering_ms; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-13 01:17:54 -03:00
										 |  |  | void VideoPlayer::set_audio_track(int p_track) { | 
					
						
							|  |  |  |     audio_track=p_track; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int VideoPlayer::get_audio_track() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return audio_track; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | void VideoPlayer::set_volume(float p_vol) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	volume=p_vol; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | float VideoPlayer::get_volume() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return volume; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void VideoPlayer::set_volume_db(float p_db) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (p_db<-79) | 
					
						
							|  |  |  | 		set_volume(0); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		set_volume(Math::db2linear(p_db)); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | float VideoPlayer::get_volume_db() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (volume==0) | 
					
						
							|  |  |  | 		return -80; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		return Math::linear2db(volume); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | String VideoPlayer::get_stream_name() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (stream.is_null()) | 
					
						
							|  |  |  | 		return "<No Stream>"; | 
					
						
							|  |  |  | 	return stream->get_name(); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-12 11:23:23 -03:00
										 |  |  | float VideoPlayer::get_stream_pos() const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 	if (playback.is_null()) | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		return 0; | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 	return playback->get_pos(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-12 20:05:26 -03:00
										 |  |  | Ref<Texture> VideoPlayer::get_video_texture() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (playback.is_valid()) | 
					
						
							|  |  |  | 		return playback->get_texture(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return Ref<Texture> (); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-09-15 11:33:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | void VideoPlayer::set_autoplay(bool p_enable) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	autoplay=p_enable; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool VideoPlayer::has_autoplay() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return autoplay; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void VideoPlayer::_bind_methods() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 23:03:46 -03:00
										 |  |  | 	ClassDB::bind_method(_MD("set_stream","stream:VideoStream"),&VideoPlayer::set_stream); | 
					
						
							|  |  |  | 	ClassDB::bind_method(_MD("get_stream:VideoStream"),&VideoPlayer::get_stream); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 23:03:46 -03:00
										 |  |  | 	ClassDB::bind_method(_MD("play"),&VideoPlayer::play); | 
					
						
							|  |  |  | 	ClassDB::bind_method(_MD("stop"),&VideoPlayer::stop); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 23:03:46 -03:00
										 |  |  | 	ClassDB::bind_method(_MD("is_playing"),&VideoPlayer::is_playing); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 23:03:46 -03:00
										 |  |  | 	ClassDB::bind_method(_MD("set_paused","paused"),&VideoPlayer::set_paused); | 
					
						
							|  |  |  | 	ClassDB::bind_method(_MD("is_paused"),&VideoPlayer::is_paused); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 23:03:46 -03:00
										 |  |  | 	ClassDB::bind_method(_MD("set_volume","volume"),&VideoPlayer::set_volume); | 
					
						
							|  |  |  | 	ClassDB::bind_method(_MD("get_volume"),&VideoPlayer::get_volume); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 23:03:46 -03:00
										 |  |  | 	ClassDB::bind_method(_MD("set_volume_db","db"),&VideoPlayer::set_volume_db); | 
					
						
							|  |  |  | 	ClassDB::bind_method(_MD("get_volume_db"),&VideoPlayer::get_volume_db); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 23:03:46 -03:00
										 |  |  |     ClassDB::bind_method(_MD("set_audio_track","track"),&VideoPlayer::set_audio_track); | 
					
						
							|  |  |  |     ClassDB::bind_method(_MD("get_audio_track"),&VideoPlayer::get_audio_track); | 
					
						
							| 
									
										
										
										
											2015-10-13 01:17:54 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 23:03:46 -03:00
										 |  |  | 	ClassDB::bind_method(_MD("get_stream_name"),&VideoPlayer::get_stream_name); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 23:03:46 -03:00
										 |  |  | 	ClassDB::bind_method(_MD("get_stream_pos"),&VideoPlayer::get_stream_pos); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 23:03:46 -03:00
										 |  |  | 	ClassDB::bind_method(_MD("set_autoplay","enabled"),&VideoPlayer::set_autoplay); | 
					
						
							|  |  |  | 	ClassDB::bind_method(_MD("has_autoplay"),&VideoPlayer::has_autoplay); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 23:03:46 -03:00
										 |  |  | 	ClassDB::bind_method(_MD("set_expand","enable"), &VideoPlayer::set_expand ); | 
					
						
							|  |  |  | 	ClassDB::bind_method(_MD("has_expand"), &VideoPlayer::has_expand ); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 23:03:46 -03:00
										 |  |  | 	ClassDB::bind_method(_MD("set_buffering_msec","msec"),&VideoPlayer::set_buffering_msec); | 
					
						
							|  |  |  | 	ClassDB::bind_method(_MD("get_buffering_msec"),&VideoPlayer::get_buffering_msec); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 23:03:46 -03:00
										 |  |  | 	ClassDB::bind_method(_MD("get_video_texture:Texture"), &VideoPlayer::get_video_texture ); | 
					
						
							| 
									
										
										
										
											2015-12-12 20:05:26 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-17 09:46:08 -03:00
										 |  |  | 	ADD_PROPERTY( PropertyInfo(Variant::INT, "stream/audio_track",PROPERTY_HINT_RANGE,"0,128,1"), _SCS("set_audio_track"), _SCS("get_audio_track") ); | 
					
						
							| 
									
										
										
										
											2014-09-15 11:33:30 -03:00
										 |  |  | 	ADD_PROPERTY( PropertyInfo(Variant::OBJECT, "stream/stream", PROPERTY_HINT_RESOURCE_TYPE,"VideoStream"), _SCS("set_stream"), _SCS("get_stream") ); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | //	ADD_PROPERTY( PropertyInfo(Variant::BOOL, "stream/loop"), _SCS("set_loop"), _SCS("has_loop") );
 | 
					
						
							|  |  |  | 	ADD_PROPERTY( PropertyInfo(Variant::REAL, "stream/volume_db", PROPERTY_HINT_RANGE,"-80,24,0.01"), _SCS("set_volume_db"), _SCS("get_volume_db") ); | 
					
						
							|  |  |  | 	ADD_PROPERTY( PropertyInfo(Variant::BOOL, "stream/autoplay"), _SCS("set_autoplay"), _SCS("has_autoplay") ); | 
					
						
							|  |  |  | 	ADD_PROPERTY( PropertyInfo(Variant::BOOL, "stream/paused"), _SCS("set_paused"), _SCS("is_paused") ); | 
					
						
							| 
									
										
										
										
											2015-11-04 09:54:23 -03:00
										 |  |  | 	ADD_PROPERTY( PropertyInfo( Variant::BOOL, "expand" ), _SCS("set_expand"),_SCS("has_expand") ); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | VideoPlayer::VideoPlayer() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	volume=1; | 
					
						
							| 
									
										
										
										
											2014-11-02 11:31:01 -03:00
										 |  |  | 	loops = false; | 
					
						
							|  |  |  | 	paused = false; | 
					
						
							|  |  |  | 	autoplay = false; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	expand = true; | 
					
						
							|  |  |  | 	loops = false; | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-13 01:17:54 -03:00
										 |  |  |     audio_track=0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 	buffering_ms=500; | 
					
						
							|  |  |  | 	server_mix_rate=44100; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	internal_stream.player=this; | 
					
						
							|  |  |  | 	stream_rid=AudioServer::get_singleton()->audio_stream_create(&internal_stream); | 
					
						
							|  |  |  | 	last_audio_time=0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | VideoPlayer::~VideoPlayer() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (stream_rid.is_valid()) | 
					
						
							|  |  |  | 		AudioServer::get_singleton()->free(stream_rid); | 
					
						
							| 
									
										
										
										
											2016-09-28 13:39:06 +02:00
										 |  |  | 	resampler.clear(); //Not necessary here, but make in consistent with other "stream_player" classes
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 |