@@ -165,12 +165,25 @@ void processFeatureRequest(const FeatureRequest& req, DeviceData& dev, std::stri
165165 }
166166 }
167167
168- // Equalizer presets count
168+ // Equalizer presets count and presets
169169 if (device_caps & B (CAP_EQUALIZER_PRESET)) {
170170 auto presets_count = hid_device->getEqualizerPresetsCount ();
171171 if (presets_count > 0 ) {
172172 dev.equalizer_presets_count = presets_count;
173173 }
174+
175+ // Get actual preset data if available
176+ auto presets = hid_device->getEqualizerPresets ();
177+ if (presets.has_value () && !presets->empty ()) {
178+ std::vector<EqualizerPresetData> preset_data;
179+ for (const auto & preset : presets->presets ) {
180+ preset_data.push_back (EqualizerPresetData {
181+ .name = preset.name ,
182+ .values = preset.values
183+ });
184+ }
185+ dev.equalizer_presets = std::move (preset_data);
186+ }
174187 }
175188
176189 // Process feature requests
@@ -250,6 +263,32 @@ void outputYaml(const OutputData& data)
250263 dev.battery ->serialize (s);
251264 }
252265
266+ if (dev.equalizer .has_value ()) {
267+ dev.equalizer ->serialize (s);
268+ }
269+
270+ if (dev.equalizer_presets_count .has_value ()) {
271+ s.write (" equalizer_presets_count" , *dev.equalizer_presets_count );
272+ }
273+
274+ if (dev.equalizer_presets .has_value () && !dev.equalizer_presets ->empty ()) {
275+ s.beginObject (" equalizer_presets" );
276+ for (const auto & preset : *dev.equalizer_presets ) {
277+ // Convert name to lowercase for API compatibility
278+ std::string lower_name;
279+ lower_name.reserve (preset.name .size ());
280+ for (char c : preset.name ) {
281+ lower_name += static_cast <char >(std::tolower (static_cast <unsigned char >(c)));
282+ }
283+ s.writeArray (lower_name, preset.values );
284+ }
285+ s.endObject ();
286+ }
287+
288+ if (dev.parametric_eq .has_value ()) {
289+ dev.parametric_eq ->serialize (s);
290+ }
291+
253292 if (dev.chatmix .has_value ()) {
254293 s.write (" chatmix" , *dev.chatmix );
255294 }
@@ -327,6 +366,40 @@ void outputEnv(const OutputData& data)
327366 s.writeOptional (prefix + " _BATTERY_TIME_TO_EMPTY_MIN" , dev.battery ->time_to_empty_min );
328367 }
329368
369+ if (dev.equalizer .has_value ()) {
370+ s.write (prefix + " _EQUALIZER_BANDS" , dev.equalizer ->bands_count );
371+ s.write (prefix + " _EQUALIZER_BASELINE" , dev.equalizer ->baseline );
372+ s.write (prefix + " _EQUALIZER_STEP" , static_cast <double >(dev.equalizer ->step ));
373+ s.write (prefix + " _EQUALIZER_MIN" , dev.equalizer ->min );
374+ s.write (prefix + " _EQUALIZER_MAX" , dev.equalizer ->max );
375+ }
376+
377+ if (dev.equalizer_presets_count .has_value ()) {
378+ s.write (prefix + " _EQUALIZER_PRESETS_COUNT" , *dev.equalizer_presets_count );
379+ }
380+
381+ if (dev.equalizer_presets .has_value () && !dev.equalizer_presets ->empty ()) {
382+ for (const auto & preset : *dev.equalizer_presets ) {
383+ // Convert name to uppercase for ENV variable naming
384+ std::string upper_name;
385+ upper_name.reserve (preset.name .size ());
386+ for (char c : preset.name ) {
387+ if (c == ' ' )
388+ upper_name += ' _' ;
389+ else
390+ upper_name += static_cast <char >(std::toupper (static_cast <unsigned char >(c)));
391+ }
392+ // Output values as comma-separated string
393+ std::string values_str;
394+ for (size_t k = 0 ; k < preset.values .size (); ++k) {
395+ if (k > 0 )
396+ values_str += " ," ;
397+ values_str += std::format (" {:.1f}" , preset.values [k]);
398+ }
399+ s.write (std::format (" {}_EQUALIZER_PRESET_{}" , prefix, upper_name), values_str);
400+ }
401+ }
402+
330403 if (dev.chatmix .has_value ()) {
331404 s.write (prefix + " _CHATMIX" , *dev.chatmix );
332405 }
0 commit comments