| 
									
										
										
										
											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"
 | 
					
						
							| 
									
										
										
										
											2017-01-21 19:00:25 -03:00
										 |  |  | #include "servers/audio_server.h"
 | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											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(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-01-15 16:06:14 -03:00
										 |  |  | */ | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | int VideoPlayer::sp_get_channel_count() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return playback->get_channels(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void VideoPlayer::sp_set_mix_rate(int p_rate) { | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	server_mix_rate = p_rate; | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | bool VideoPlayer::sp_mix(int32_t *p_buffer, int p_frames) { | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (resampler.is_ready()) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		return resampler.mix(p_buffer, p_frames); | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	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
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | int VideoPlayer::_audio_mix_callback(void *p_udata, const int16_t *p_data, int p_frames) { | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	VideoPlayer *vp = (VideoPlayer *)p_udata; | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	int todo = MIN(vp->resampler.get_todo(), p_frames); | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	int16_t *wb = vp->resampler.get_write_buffer(); | 
					
						
							|  |  |  | 	int c = vp->resampler.get_channel_count(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (int i = 0; i < todo * c; i++) { | 
					
						
							|  |  |  | 		wb[i] = p_data[i]; | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 18:02:19 -03:00
										 |  |  | 		case NOTIFICATION_INTERNAL_PROCESS: { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			double delta = last_audio_time == 0 ? 0 : audio_time - last_audio_time; | 
					
						
							|  |  |  | 			last_audio_time = audio_time; | 
					
						
							|  |  |  | 			if (delta == 0) | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 				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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			Size2 s = expand ? get_size() : texture->get_size(); | 
					
						
							|  |  |  | 			draw_texture_rect(texture, Rect2(Point2(), s), false); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	expand = p_expand; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	update(); | 
					
						
							|  |  |  | 	minimum_size_changed(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool VideoPlayer::has_expand() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return expand; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void VideoPlayer::set_stream(const Ref<VideoStream> &p_stream) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	stop(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	stream = p_stream; | 
					
						
							|  |  |  | 	if (stream.is_valid()) { | 
					
						
							|  |  |  | 		stream->set_audio_track(audio_track); | 
					
						
							|  |  |  | 		playback = stream->instance_playback(); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		playback = Ref<VideoStreamPlayback>(); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (!playback.is_null()) { | 
					
						
							|  |  |  | 		playback->set_loop(loops); | 
					
						
							|  |  |  | 		playback->set_paused(paused); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		texture = playback->get_texture(); | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			resampler.setup(channels, playback->get_mix_rate(), server_mix_rate, buffering_ms, 0); | 
					
						
							| 
									
										
										
										
											2016-06-15 15:31:32 +02:00
										 |  |  | 		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) | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			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(); | 
					
						
							| 
									
										
										
										
											2017-01-10 18:02:19 -03:00
										 |  |  | 	set_process_internal(true); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01: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(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	//	AudioServer::get_singleton()->stream_set_active(stream_rid,false);
 | 
					
						
							| 
									
										
										
										
											2016-09-28 13:39:06 +02:00
										 |  |  | 	resampler.flush(); | 
					
						
							| 
									
										
										
										
											2017-01-10 18:02:19 -03:00
										 |  |  | 	set_process_internal(false); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01: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) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	paused = p_paused; | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 	if (playback.is_valid()) { | 
					
						
							|  |  |  | 		playback->set_paused(p_paused); | 
					
						
							| 
									
										
										
										
											2017-01-10 18:02:19 -03:00
										 |  |  | 		set_process_internal(!p_paused); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											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) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	buffering_ms = p_msec; | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | int VideoPlayer::get_buffering_msec() const { | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return buffering_ms; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-13 01:17:54 -03:00
										 |  |  | void VideoPlayer::set_audio_track(int p_track) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	audio_track = p_track; | 
					
						
							| 
									
										
										
										
											2015-10-13 01:17:54 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int VideoPlayer::get_audio_track() const { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	return audio_track; | 
					
						
							| 
									
										
										
										
											2015-10-13 01:17:54 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | void VideoPlayer::set_volume(float p_vol) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	volume = p_vol; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | float VideoPlayer::get_volume() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return volume; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void VideoPlayer::set_volume_db(float p_db) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (p_db < -79) | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		set_volume(0); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		set_volume(Math::db2linear(p_db)); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | float VideoPlayer::get_volume_db() const { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (volume == 0) | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		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(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	return Ref<Texture>(); | 
					
						
							| 
									
										
										
										
											2015-12-12 20:05:26 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-09-15 11:33:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | void VideoPlayer::set_autoplay(bool p_enable) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	autoplay = p_enable; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool VideoPlayer::has_autoplay() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return autoplay; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void VideoPlayer::_bind_methods() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_stream", "stream:VideoStream"), &VideoPlayer::set_stream); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_stream:VideoStream"), &VideoPlayer::get_stream); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("play"), &VideoPlayer::play); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("stop"), &VideoPlayer::stop); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("is_playing"), &VideoPlayer::is_playing); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_paused", "paused"), &VideoPlayer::set_paused); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("is_paused"), &VideoPlayer::is_paused); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_volume", "volume"), &VideoPlayer::set_volume); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_volume"), &VideoPlayer::get_volume); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_volume_db", "db"), &VideoPlayer::set_volume_db); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_volume_db"), &VideoPlayer::get_volume_db); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_audio_track", "track"), &VideoPlayer::set_audio_track); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_audio_track"), &VideoPlayer::get_audio_track); | 
					
						
							| 
									
										
										
										
											2015-10-13 01:17:54 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("get_stream_name"), &VideoPlayer::get_stream_name); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("get_stream_pos"), &VideoPlayer::get_stream_pos); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_autoplay", "enabled"), &VideoPlayer::set_autoplay); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("has_autoplay"), &VideoPlayer::has_autoplay); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_expand", "enable"), &VideoPlayer::set_expand); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("has_expand"), &VideoPlayer::has_expand); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_buffering_msec", "msec"), &VideoPlayer::set_buffering_msec); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_buffering_msec"), &VideoPlayer::get_buffering_msec); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("get_video_texture:Texture"), &VideoPlayer::get_video_texture); | 
					
						
							| 
									
										
										
										
											2015-12-12 20:05:26 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::INT, "audio_track", PROPERTY_HINT_RANGE, "0,128,1"), "set_audio_track", "get_audio_track"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "stream", PROPERTY_HINT_RESOURCE_TYPE, "VideoStream"), "set_stream", "get_stream"); | 
					
						
							| 
									
										
										
										
											2017-02-12 01:11:37 +01:00
										 |  |  | 	//ADD_PROPERTY( PropertyInfo(Variant::BOOL, "stream/loop"), "set_loop", "has_loop") ;
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::REAL, "volume_db", PROPERTY_HINT_RANGE, "-80,24,0.01"), "set_volume_db", "get_volume_db"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "autoplay"), "set_autoplay", "has_autoplay"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "paused"), "set_paused", "is_paused"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "expand"), "set_expand", "has_expand"); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | VideoPlayer::VideoPlayer() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	audio_track = 0; | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	buffering_ms = 500; | 
					
						
							|  |  |  | 	server_mix_rate = 44100; | 
					
						
							| 
									
										
										
										
											2015-09-26 14:50:42 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	//	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() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	//	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
										 |  |  | }; |