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