1 /*************************************************************************/
2 /*  audio_effect_panner.cpp                                              */
3 /*************************************************************************/
4 /*                       This file is part of:                           */
5 /*                           GODOT ENGINE                                */
6 /*                      https://godotengine.org                          */
7 /*************************************************************************/
8 /* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */
9 /* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).   */
10 /*                                                                       */
11 /* Permission is hereby granted, free of charge, to any person obtaining */
12 /* a copy of this software and associated documentation files (the       */
13 /* "Software"), to deal in the Software without restriction, including   */
14 /* without limitation the rights to use, copy, modify, merge, publish,   */
15 /* distribute, sublicense, and/or sell copies of the Software, and to    */
16 /* permit persons to whom the Software is furnished to do so, subject to */
17 /* the following conditions:                                             */
18 /*                                                                       */
19 /* The above copyright notice and this permission notice shall be        */
20 /* included in all copies or substantial portions of the Software.       */
21 /*                                                                       */
22 /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
23 /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
24 /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
25 /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
26 /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
27 /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
28 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
29 /*************************************************************************/
30 
31 #include "audio_effect_panner.h"
32 
process(const AudioFrame * p_src_frames,AudioFrame * p_dst_frames,int p_frame_count)33 void AudioEffectPannerInstance::process(const AudioFrame *p_src_frames, AudioFrame *p_dst_frames, int p_frame_count) {
34 
35 	float lvol = CLAMP(1.0 - base->pan, 0, 1);
36 	float rvol = CLAMP(1.0 + base->pan, 0, 1);
37 
38 	for (int i = 0; i < p_frame_count; i++) {
39 
40 		p_dst_frames[i].l = p_src_frames[i].l * lvol + p_src_frames[i].r * (1.0 - rvol);
41 		p_dst_frames[i].r = p_src_frames[i].r * rvol + p_src_frames[i].l * (1.0 - lvol);
42 	}
43 }
44 
instance()45 Ref<AudioEffectInstance> AudioEffectPanner::instance() {
46 	Ref<AudioEffectPannerInstance> ins;
47 	ins.instance();
48 	ins->base = Ref<AudioEffectPanner>(this);
49 	return ins;
50 }
51 
set_pan(float p_cpanume)52 void AudioEffectPanner::set_pan(float p_cpanume) {
53 	pan = p_cpanume;
54 }
55 
get_pan() const56 float AudioEffectPanner::get_pan() const {
57 
58 	return pan;
59 }
60 
_bind_methods()61 void AudioEffectPanner::_bind_methods() {
62 
63 	ClassDB::bind_method(D_METHOD("set_pan", "cpanume"), &AudioEffectPanner::set_pan);
64 	ClassDB::bind_method(D_METHOD("get_pan"), &AudioEffectPanner::get_pan);
65 
66 	ADD_PROPERTY(PropertyInfo(Variant::REAL, "pan", PROPERTY_HINT_RANGE, "-1,1,0.01"), "set_pan", "get_pan");
67 }
68 
AudioEffectPanner()69 AudioEffectPanner::AudioEffectPanner() {
70 	pan = 0;
71 }
72