2 * An example showing how to load and apply a reverb effect to a source.
14 #include "efx-presets.h"
17 int ci_compare(alure::StringView lhs
, alure::StringView rhs
)
19 using traits
= alure::StringView::traits_type
;
21 auto left
= lhs
.begin();
22 auto right
= rhs
.begin();
23 for(;left
!= lhs
.end() && right
!= rhs
.end();++left
,++right
)
25 int diff
= std::tolower(traits::to_int_type(*left
)) -
26 std::tolower(traits::to_int_type(*right
));
27 if(diff
!= 0) return (diff
< 0) ? -1 : 1;
29 if(right
!= rhs
.end()) return -1;
30 if(left
!= lhs
.end()) return 1;
35 #define DECL(x) { #x, EFX_REVERB_PRESET_##x }
36 static const struct ReverbEntry
{
38 EFXEAXREVERBPROPERTIES props
;
51 DECL(CARPETEDHALLWAY
),
67 DECL(CASTLE_SMALLROOM
),
68 DECL(CASTLE_SHORTPASSAGE
),
69 DECL(CASTLE_MEDIUMROOM
),
70 DECL(CASTLE_LARGEROOM
),
71 DECL(CASTLE_LONGPASSAGE
),
73 DECL(CASTLE_CUPBOARD
),
74 DECL(CASTLE_COURTYARD
),
77 DECL(FACTORY_SMALLROOM
),
78 DECL(FACTORY_SHORTPASSAGE
),
79 DECL(FACTORY_MEDIUMROOM
),
80 DECL(FACTORY_LARGEROOM
),
81 DECL(FACTORY_LONGPASSAGE
),
83 DECL(FACTORY_CUPBOARD
),
84 DECL(FACTORY_COURTYARD
),
87 DECL(ICEPALACE_SMALLROOM
),
88 DECL(ICEPALACE_SHORTPASSAGE
),
89 DECL(ICEPALACE_MEDIUMROOM
),
90 DECL(ICEPALACE_LARGEROOM
),
91 DECL(ICEPALACE_LONGPASSAGE
),
93 DECL(ICEPALACE_CUPBOARD
),
94 DECL(ICEPALACE_COURTYARD
),
95 DECL(ICEPALACE_ALCOVE
),
97 DECL(SPACESTATION_SMALLROOM
),
98 DECL(SPACESTATION_SHORTPASSAGE
),
99 DECL(SPACESTATION_MEDIUMROOM
),
100 DECL(SPACESTATION_LARGEROOM
),
101 DECL(SPACESTATION_LONGPASSAGE
),
102 DECL(SPACESTATION_HALL
),
103 DECL(SPACESTATION_CUPBOARD
),
104 DECL(SPACESTATION_ALCOVE
),
106 DECL(WOODEN_SMALLROOM
),
107 DECL(WOODEN_SHORTPASSAGE
),
108 DECL(WOODEN_MEDIUMROOM
),
109 DECL(WOODEN_LARGEROOM
),
110 DECL(WOODEN_LONGPASSAGE
),
112 DECL(WOODEN_CUPBOARD
),
113 DECL(WOODEN_COURTYARD
),
116 DECL(SPORT_EMPTYSTADIUM
),
117 DECL(SPORT_SQUASHCOURT
),
118 DECL(SPORT_SMALLSWIMMINGPOOL
),
119 DECL(SPORT_LARGESWIMMINGPOOL
),
120 DECL(SPORT_GYMNASIUM
),
121 DECL(SPORT_FULLSTADIUM
),
122 DECL(SPORT_STADIUMTANNOY
),
124 DECL(PREFAB_WORKSHOP
),
125 DECL(PREFAB_SCHOOLROOM
),
126 DECL(PREFAB_PRACTISEROOM
),
127 DECL(PREFAB_OUTHOUSE
),
128 DECL(PREFAB_CARAVAN
),
132 DECL(DOME_SAINTPAULS
),
137 DECL(OUTDOORS_BACKYARD
),
138 DECL(OUTDOORS_ROLLINGPLAINS
),
139 DECL(OUTDOORS_DEEPCANYON
),
140 DECL(OUTDOORS_CREEK
),
141 DECL(OUTDOORS_VALLEY
),
147 DECL(DRIVING_COMMENTATOR
),
148 DECL(DRIVING_PITGARAGE
),
149 DECL(DRIVING_INCAR_RACER
),
150 DECL(DRIVING_INCAR_SPORTS
),
151 DECL(DRIVING_INCAR_LUXURY
),
152 DECL(DRIVING_FULLGRANDSTAND
),
153 DECL(DRIVING_EMPTYGRANDSTAND
),
154 DECL(DRIVING_TUNNEL
),
160 DECL(CITY_UNDERPASS
),
161 DECL(CITY_ABANDONED
),
165 DECL(SMALLWATERROOM
),
170 int main(int argc
, char *argv
[])
172 alure::DeviceManager devMgr
= alure::DeviceManager::get();
176 if(argc
> 3 && strcmp(argv
[1], "-device") == 0)
179 dev
= devMgr
.openPlayback(argv
[2], std::nothrow
);
181 std::cerr
<< "Failed to open \""<<argv
[2]<<"\" - trying default" <<std::endl
;
184 dev
= devMgr
.openPlayback();
185 std::cout
<< "Opened \""<<dev
.getName()<<"\"" <<std::endl
;
187 alure::Context ctx
= dev
.createContext();
188 alure::Context::MakeCurrent(ctx
);
190 bool gotreverb
= false;
191 alure::Effect effect
= ctx
.createEffect();
193 if(argc
-fileidx
>= 2 && alure::StringView("-preset") == argv
[fileidx
])
195 const char *reverb_name
= argv
[fileidx
+1];
198 auto iter
= std::find_if(std::begin(reverblist
), std::end(reverblist
),
199 [reverb_name
](const ReverbEntry
&entry
) -> bool
200 { return ci_compare(reverb_name
, entry
.name
) == 0; }
202 if(iter
!= std::end(reverblist
))
204 std::cout
<< "Loading preset "<<iter
->name
<<std::endl
;
205 effect
.setReverbProperties(iter
->props
);
211 std::cout
<< "Loading generic preset" <<std::endl
;
212 effect
.setReverbProperties(EFX_REVERB_PRESET_GENERIC
);
215 alure::AuxiliaryEffectSlot auxslot
= ctx
.createAuxiliaryEffectSlot();
216 auxslot
.applyEffect(effect
);
218 for(int i
= fileidx
;i
< argc
;i
++)
220 alure::SharedPtr
<alure::Decoder
> decoder(ctx
.createDecoder(argv
[i
]));
221 alure::Source source
= ctx
.createSource();
223 source
.setAuxiliarySend(auxslot
, 0);
225 source
.play(decoder
, 12000, 4);
226 std::cout
<< "Playing "<<argv
[i
]<<" ("<<alure::GetSampleTypeName(decoder
->getSampleType())<<", "
227 <<alure::GetChannelConfigName(decoder
->getChannelConfig())<<", "
228 <<decoder
->getFrequency()<<"hz)" <<std::endl
;
230 float invfreq
= 1.0f
/ decoder
->getFrequency();
231 while(source
.isPlaying())
233 std::cout
<< "\r "<<std::fixed
<<std::setprecision(2)<<
234 source
.getSecOffset().count()<<" / "<<(decoder
->getLength()*invfreq
);
236 std::this_thread::sleep_for(std::chrono::milliseconds(25));
239 std::cout
<<std::endl
;
248 alure::Context::MakeCurrent(nullptr);