mirror of
https://github.com/CalcProgrammer1/OpenRGB.git
synced 2026-04-04 06:11:07 -04:00
* Add zone flags to indicate if fields are manually configurable and if they have been manually configured * Add flags field to segment type * Add segment flags for group start and group member * Add color mode support flags to zone (RGB, RBG, GRB, GBR, BRG, BGR) * Add color mode enum to zone * Update zone and segment description functions to support new fields * Rename the effects-only configurable size flag * Remove zone type and matrix map configuration from E1.31 manual configuration, use zone editor instead * Rework DeviceResizeZone to DeviceConfigureZone * Rework most ARGB controllers to allow zone customizations * Rework DRGBController to define devices in DRGBDevices list (similar to RazerDevices) * Rework NollieController to define devices in NollieDevices list (similar to RazerDevices)
209 lines
6.8 KiB
C++
209 lines
6.8 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()
|
|
{
|
|
Shutdown();
|
|
|
|
delete controller;
|
|
}
|
|
|
|
void RGBController_CreativeSoundBlasterAE5::SetupZones()
|
|
{
|
|
/*-----------------------------------------------------*\
|
|
| Only set LED count on the first run |
|
|
\*-----------------------------------------------------*/
|
|
bool first_run = false;
|
|
|
|
if(zones.size() == 0)
|
|
{
|
|
first_run = true;
|
|
}
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Clear any existing color/LED configuration |
|
|
\*-----------------------------------------------------*/
|
|
leds.clear();
|
|
colors.clear();
|
|
zones.resize(2);
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Set up internal zone |
|
|
\*-----------------------------------------------------*/
|
|
zones[0].name = "Internal";
|
|
zones[0].type = ZONE_TYPE_LINEAR;
|
|
zones[0].leds_min = 5;
|
|
zones[0].leds_max = 5;
|
|
zones[0].leds_count = 5;
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Set up internal zone and LEDs |
|
|
\*-----------------------------------------------------*/
|
|
zones[1].leds_min = 0;
|
|
zones[1].leds_max = 100;
|
|
|
|
if(first_run)
|
|
{
|
|
zones[1].flags = ZONE_FLAG_MANUALLY_CONFIGURABLE_SIZE
|
|
| ZONE_FLAG_MANUALLY_CONFIGURABLE_NAME
|
|
| ZONE_FLAG_MANUALLY_CONFIGURABLE_TYPE
|
|
| ZONE_FLAG_MANUALLY_CONFIGURABLE_MATRIX_MAP;
|
|
}
|
|
|
|
if(!(zones[1].flags & ZONE_FLAG_MANUALLY_CONFIGURED_NAME))
|
|
{
|
|
zones[1].name = "Addressable RGB Header";
|
|
}
|
|
|
|
if(!(zones[1].flags & ZONE_FLAG_MANUALLY_CONFIGURED_SIZE))
|
|
{
|
|
zones[1].leds_count = controller->GetExternalLEDCount();;
|
|
}
|
|
|
|
if(!(zones[1].flags & ZONE_FLAG_MANUALLY_CONFIGURED_TYPE))
|
|
{
|
|
zones[1].type = ZONE_TYPE_LINEAR;
|
|
}
|
|
|
|
if(!(zones[1].flags & ZONE_FLAG_MANUALLY_CONFIGURED_MATRIX_MAP))
|
|
{
|
|
zones[1].matrix_map.width = 0;
|
|
zones[1].matrix_map.height = 0;
|
|
zones[1].matrix_map.map.resize(0);
|
|
}
|
|
|
|
/*-----------------------------------------------------*\
|
|
| Set up LEDs |
|
|
\*-----------------------------------------------------*/
|
|
for(std::size_t zone_idx = 0; zone_idx < zones.size(); zone_idx++)
|
|
{
|
|
for(unsigned int led_idx = 0; led_idx < zones[zone_idx].leds_count; led_idx++)
|
|
{
|
|
led new_led;
|
|
new_led.name = zones[0].name + ", LED " + std::to_string(led_idx + 1);
|
|
leds.push_back(new_led);
|
|
}
|
|
}
|
|
|
|
SetupColors();
|
|
}
|
|
|
|
void RGBController_CreativeSoundBlasterAE5::DeviceConfigureZone(int zone_idx)
|
|
{
|
|
if((size_t)zone_idx < zones.size())
|
|
{
|
|
controller->SetExternalLEDCount(zones[zone_idx].leds_count);
|
|
|
|
SetupZones();
|
|
}
|
|
}
|
|
|
|
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::DeviceUpdateZoneLEDs(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::DeviceUpdateSingleLED(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();
|
|
}
|