| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*  audio_stream_opus.h                                                  */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							| 
									
										
										
										
											2017-08-27 14:16:55 +02:00
										 |  |  | /*                      https://godotengine.org                          */ | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-01 14:40:08 +01:00
										 |  |  | /* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							|  |  |  | /* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)    */ | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -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.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef AUDIO_STREAM_OPUS_H
 | 
					
						
							|  |  |  | #define AUDIO_STREAM_OPUS_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "io/resource_loader.h"
 | 
					
						
							| 
									
										
										
										
											2016-10-12 20:37:38 +02:00
										 |  |  | #include "os/file_access.h"
 | 
					
						
							|  |  |  | #include "scene/resources/audio_stream.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-03 21:10:34 +01:00
										 |  |  | #include <opus/opusfile.h>
 | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | /**
 | 
					
						
							|  |  |  | 	@author George Marques <george@gmarqu.es> | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | class AudioStreamPlaybackOpus : public AudioStreamPlayback { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	GDCLASS(AudioStreamPlaybackOpus, AudioStreamPlayback) | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	enum { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		MIN_MIX = 1024 | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	FileAccess *f; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	OpusFileCallbacks _op_callbacks; | 
					
						
							|  |  |  | 	float length; | 
					
						
							|  |  |  | 	static int _op_read_func(void *_stream, unsigned char *_ptr, int _nbytes); | 
					
						
							|  |  |  | 	static int _op_seek_func(void *_stream, opus_int64 _offset, int _whence); | 
					
						
							|  |  |  | 	static int _op_close_func(void *_stream); | 
					
						
							|  |  |  | 	static opus_int64 _op_tell_func(void *_stream); | 
					
						
							| 
									
										
										
										
											2015-10-03 00:38:43 +02:00
										 |  |  | 	static const float osrate; | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	String file; | 
					
						
							|  |  |  | 	int64_t frames_mixed; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bool stream_loaded; | 
					
						
							|  |  |  | 	volatile bool playing; | 
					
						
							|  |  |  | 	OggOpusFile *opus_file; | 
					
						
							|  |  |  | 	int stream_channels; | 
					
						
							|  |  |  | 	int current_section; | 
					
						
							|  |  |  | 	int pre_skip; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bool paused; | 
					
						
							|  |  |  | 	bool loops; | 
					
						
							|  |  |  | 	int repeats; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Error _load_stream(); | 
					
						
							|  |  |  | 	void _clear_stream(); | 
					
						
							|  |  |  | 	void _close_file(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bool stream_valid; | 
					
						
							|  |  |  | 	float loop_restart_time; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Error set_file(const String &p_file); | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	virtual void play(float p_from = 0); | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | 	virtual void stop(); | 
					
						
							|  |  |  | 	virtual bool is_playing() const { return playing; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	virtual void set_loop_restart_time(float p_time) { loop_restart_time = p_time; } | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	virtual void set_paused(bool p_paused) { paused = p_paused; } | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | 	virtual bool is_paused() const { return paused; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	virtual void set_loop(bool p_enable) { loops = p_enable; } | 
					
						
							|  |  |  | 	virtual bool has_loop() const { return loops; } | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	virtual float get_length() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual String get_stream_name() const { return ""; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual int get_loop_count() const { return repeats; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-21 00:31:36 -03:00
										 |  |  | 	virtual float get_playback_position() const; | 
					
						
							|  |  |  | 	virtual void seek(float p_time); | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	virtual int get_channels() const { return stream_channels; } | 
					
						
							|  |  |  | 	virtual int get_mix_rate() const { return osrate; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual int get_minimum_buffer_size() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-28 19:04:25 +07:00
										 |  |  | 	virtual int mix(int16_t *p_buffer, int p_frames); | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	AudioStreamPlaybackOpus(); | 
					
						
							|  |  |  | 	~AudioStreamPlaybackOpus(); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | class AudioStreamOpus : public AudioStream { | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	GDCLASS(AudioStreamOpus, AudioStream) | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	String file; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | 	Ref<AudioStreamPlayback> instance_playback() { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		Ref<AudioStreamPlaybackOpus> pb = memnew(AudioStreamPlaybackOpus); | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | 		pb->set_file(file); | 
					
						
							|  |  |  | 		return pb; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void set_file(const String &p_file) { file = p_file; } | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | class ResourceFormatLoaderAudioStreamOpus : public ResourceFormatLoader { | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL); | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | 	virtual void get_recognized_extensions(List<String> *p_extensions) const; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	virtual bool handles_type(const String &p_type) const; | 
					
						
							| 
									
										
										
										
											2015-10-02 14:20:50 -03:00
										 |  |  | 	virtual String get_resource_type(const String &p_path) const; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif // AUDIO_STREAM_OPUS_H
 |