Files
OpenRGB/Controllers/CreativeController/RGBController_CreativeSoundBlasterAE5_Windows.cpp
2025-10-15 00:05:50 -04:00

174 lines
5.5 KiB
C++

/*---------------------------------------------------------*\
| RGBController_CreativeSoundBlasterAE5_Windows.cpp |
| |
| RGBController for Creative SoundBlaster AE-5 (Windows) |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include "RGBController_CreativeSoundBlasterAE5_Windows.h"
/**------------------------------------------------------------------*\
@name Creative Sound Blaster AE-5
@category Audio
@type PCI
@save :x:
@direct :white_check_mark:
@effects :x:
@detectors DetectCreativeAE5Device
@comment
\*-------------------------------------------------------------------*/
RGBController_CreativeSoundBlasterAE5::RGBController_CreativeSoundBlasterAE5(CreativeSoundBlasterAE5ControllerBase* controller_ptr)
{
controller = controller_ptr;
name = controller->GetDeviceName();
vendor = "Creative Labs";
type = DEVICE_TYPE_SPEAKER;
description = controller->GetDeviceName() + " Device";
location = controller->GetDeviceLocation();
serial = "";
mode Direct;
Direct.name = "Direct";
Direct.value = 0;
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Direct.color_mode = MODE_COLORS_PER_LED;
modes.push_back(Direct);
SetupZones();
}
RGBController_CreativeSoundBlasterAE5::~RGBController_CreativeSoundBlasterAE5()
{
delete controller;
}
void RGBController_CreativeSoundBlasterAE5::SetupZones()
{
zone internal_zone;
internal_zone.name = "Internal";
internal_zone.type = ZONE_TYPE_LINEAR;
internal_zone.leds_min = 5;
internal_zone.leds_max = 5;
internal_zone.leds_count = 5;
internal_zone.matrix_map = NULL;
zones.push_back(internal_zone);
for(unsigned int led_idx = 0; led_idx < 5; led_idx++)
{
led new_led;
new_led.name = "Internal LED " + std::to_string(led_idx + 1);
leds.push_back(new_led);
}
zone external_zone;
external_zone.name = "External";
external_zone.type = ZONE_TYPE_LINEAR;
external_zone.leds_min = 0;
external_zone.leds_max = 100;
external_zone.leds_count = controller->GetExternalLEDCount();
external_zone.matrix_map = NULL;
zones.push_back(external_zone);
for(unsigned int led_idx = 0; led_idx < controller->GetExternalLEDCount(); led_idx++)
{
led new_led;
new_led.name = "External LED " + std::to_string(led_idx + 1);
leds.push_back(new_led);
}
SetupColors();
}
void RGBController_CreativeSoundBlasterAE5::ResizeZone(int zone, int new_size)
{
if(zone == 1) // External zone
{
zones[zone].leds_count = new_size;
leds.resize(5);
for(unsigned int led_idx = 0; led_idx < (unsigned int)new_size; led_idx++)
{
led new_led;
new_led.name = "External LED " + std::to_string(led_idx + 1);
leds.push_back(new_led);
}
controller->SetExternalLEDCount(new_size);
SetupColors();
}
}
void RGBController_CreativeSoundBlasterAE5::UpdateLEDRange(unsigned int start_led, unsigned int led_count)
{
if(led_count == 0)
{
return;
}
unsigned char* red_values = new unsigned char[led_count];
unsigned char* green_values = new unsigned char[led_count];
unsigned char* blue_values = new unsigned char[led_count];
for(unsigned int i = 0; i < led_count; i++)
{
unsigned int led_idx = start_led + i;
red_values[i] = RGBGetRValue(colors[led_idx]);
green_values[i] = RGBGetGValue(colors[led_idx]);
blue_values[i] = RGBGetBValue(colors[led_idx]);
}
controller->SetLEDColors(led_count, red_values, green_values, blue_values);
delete[] red_values;
delete[] green_values;
delete[] blue_values;
}
void RGBController_CreativeSoundBlasterAE5::DeviceUpdateLEDs()
{
UpdateLEDRange(0, controller->GetLEDCount());
}
void RGBController_CreativeSoundBlasterAE5::UpdateZoneLEDs(int zone)
{
if(zone >= 0 && zone < (int)zones.size())
{
unsigned int start_led = 0;
for(int i = 0; i < zone; i++)
{
start_led += zones[i].leds_count;
}
UpdateLEDRange(start_led, zones[zone].leds_count);
}
}
void RGBController_CreativeSoundBlasterAE5::UpdateSingleLED(int led)
{
/*-------------------------------------------------------------*\
| Find which zone this LED belongs to and update only that zone |
\*-------------------------------------------------------------*/
unsigned int current_led = 0;
for(unsigned int zone_idx = 0; zone_idx < zones.size(); zone_idx++)
{
if(led >= (int)current_led && led < (int)(current_led + zones[zone_idx].leds_count))
{
UpdateLEDRange(current_led, zones[zone_idx].leds_count);
return;
}
current_led += zones[zone_idx].leds_count;
}
}
void RGBController_CreativeSoundBlasterAE5::DeviceUpdateMode()
{
DeviceUpdateLEDs();
}