mirror of
https://github.com/CalcProgrammer1/OpenRGB.git
synced 2025-12-23 23:37:48 -05:00
174 lines
5.5 KiB
C++
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();
|
|
}
|