diff options
Diffstat (limited to 'src/Screens/UScreenOptionsRecord.pas')
-rw-r--r-- | src/Screens/UScreenOptionsRecord.pas | 785 |
1 files changed, 0 insertions, 785 deletions
diff --git a/src/Screens/UScreenOptionsRecord.pas b/src/Screens/UScreenOptionsRecord.pas deleted file mode 100644 index 885f7db5..00000000 --- a/src/Screens/UScreenOptionsRecord.pas +++ /dev/null @@ -1,785 +0,0 @@ -unit UScreenOptionsRecord; - -interface - -{$IFDEF FPC} - {$MODE Delphi} -{$ENDIF} - -{$I switches.inc} - -uses - UThemes, - UMusic, - URecord, - UMenu; - -type - TDrawState = record - ChannelIndex: integer; - R, G, B: real; // mapped player color (normal) - RD, GD, BD: real; // mapped player color (dark) - end; - - TPeakInfo = record - Volume: single; - Time: cardinal; - end; - - TScreenOptionsRecord = class(TMenu) - private - // max. count of input-channels determined for all devices - MaxChannelCount: integer; - - // current input device - CurrentDeviceIndex: integer; - PreviewDeviceIndex: integer; - - // string arrays for select-slide options - InputSourceNames: array of string; - InputDeviceNames: array of string; - - // dynamic generated themes for channel select-sliders - SelectSlideChannelTheme: array of TThemeSelectSlide; - - // indices for widget-updates - SelectInputSourceID: integer; - SelectSlideChannelID: array of integer; - - // interaction IDs - ExitButtonIID: integer; - - // dummy data for non-available channels - ChannelToPlayerMapDummy: integer; - - // preview channel-buffers - PreviewChannel: array of TCaptureBuffer; - ChannelPeak: array of TPeakInfo; - - // Device source volume - SourceVolume: single; - NextVolumePollTime: cardinal; - - procedure StartPreview; - procedure StopPreview; - procedure UpdateInputDevice; - procedure ChangeVolume(VolumeChange: single); - procedure DrawVolume(x, y, Width, Height: single); - procedure DrawVUMeter(const State: TDrawState; x, y, Width, Height: single); - procedure DrawPitch(const State: TDrawState; x, y, Width, Height: single); - public - constructor Create; override; - function Draw: boolean; override; - function ParseInput(PressedKey: Cardinal; CharCode: WideChar; PressedDown: Boolean): Boolean; override; - procedure onShow; override; - procedure onHide; override; - end; - -const - PeakDecay = 0.2; // strength of peak-decay (reduction after one sec) - -const - BarHeight = 11; // height of each bar (volume/vu-meter/pitch) - BarUpperSpacing = 1; // spacing between a bar-area and the previous widget - BarLowerSpacing = 3; // spacing between a bar-area and the next widget - SourceBarsTotalHeight = BarHeight + BarUpperSpacing + BarLowerSpacing; - ChannelBarsTotalHeight = 2*BarHeight + BarUpperSpacing + BarLowerSpacing; - -implementation - -uses - SysUtils, - Math, - SDL, - gl, - TextGL, - UGraphic, - UDraw, - UMain, - UMenuSelectSlide, - UMenuText, - UFiles, - UDisplay, - UIni, - ULog; - -function TScreenOptionsRecord.ParseInput(PressedKey: Cardinal; CharCode: WideChar; PressedDown: Boolean): Boolean; -begin - Result := true; - If (PressedDown) Then - begin // Key Down - // check normal keys - case WideCharUpperCase(CharCode)[1] of - 'Q': - begin - Result := false; - Exit; - end; - '+': - begin - // FIXME: add a nice volume-slider instead - // or at least provide visualization and acceleration if the user holds the key pressed. - ChangeVolume(0.02); - end; - '-': - begin - // FIXME: add a nice volume-slider instead - // or at least provide visualization and acceleration if the user holds the key pressed. - ChangeVolume(-0.02); - end; - 'T': - begin - if ((SDL_GetModState() and KMOD_SHIFT) <> 0) then - Ini.ThresholdIndex := (Ini.ThresholdIndex + Length(IThresholdVals) - 1) mod Length(IThresholdVals) - else - Ini.ThresholdIndex := (Ini.ThresholdIndex + 1) mod Length(IThresholdVals); - end; - end; - - // check special keys - case PressedKey of - SDLK_ESCAPE, - SDLK_BACKSPACE: - begin - // Escape -> save nothing - just leave this screen - - AudioPlayback.PlaySound(SoundLib.Back); - FadeTo(@ScreenOptions); - end; - SDLK_RETURN: - begin - if (SelInteraction = ExitButtonIID) then - begin - Ini.Save; - AudioPlayback.PlaySound(SoundLib.Back); - FadeTo(@ScreenOptions); - end; - end; - SDLK_DOWN: - InteractNext; - SDLK_UP : - InteractPrev; - SDLK_RIGHT: - begin - if (SelInteraction >= 0) and (SelInteraction < ExitButtonIID) then - begin - AudioPlayback.PlaySound(SoundLib.Option); - InteractInc; - end; - UpdateInputDevice; - end; - SDLK_LEFT: - begin - if (SelInteraction >= 0) and (SelInteraction < ExitButtonIID) then - begin - AudioPlayback.PlaySound(SoundLib.Option); - InteractDec; - end; - UpdateInputDevice; - end; - end; - end; -end; - -constructor TScreenOptionsRecord.Create; -var - DeviceIndex: integer; - SourceIndex: integer; - ChannelIndex: integer; - InputDevice: TAudioInputDevice; - InputDeviceCfg: PInputDeviceConfig; - ChannelTheme: ^TThemeSelectSlide; - //ButtonTheme: TThemeButton; - WidgetYPos: integer; -begin - inherited Create; - - LoadFromTheme(Theme.OptionsRecord); - - // set CurrentDeviceIndex to a valid device - if (Length(AudioInputProcessor.DeviceList) > 0) then - CurrentDeviceIndex := 0 - else - CurrentDeviceIndex := -1; - - PreviewDeviceIndex := -1; - - WidgetYPos := 0; - - // init sliders if at least one device was detected - if (Length(AudioInputProcessor.DeviceList) > 0) then - begin - InputDevice := AudioInputProcessor.DeviceList[CurrentDeviceIndex]; - InputDeviceCfg := @Ini.InputDeviceConfig[InputDevice.CfgIndex]; - - // init device-selection slider - SetLength(InputDeviceNames, Length(AudioInputProcessor.DeviceList)); - for DeviceIndex := 0 to High(AudioInputProcessor.DeviceList) do - begin - InputDeviceNames[DeviceIndex] := AudioInputProcessor.DeviceList[DeviceIndex].Name; - end; - // add device-selection slider (InteractionID: 0) - AddSelectSlide(Theme.OptionsRecord.SelectSlideCard, CurrentDeviceIndex, InputDeviceNames); - - // init source-selection slider - SetLength(InputSourceNames, Length(InputDevice.Source)); - for SourceIndex := 0 to High(InputDevice.Source) do - begin - InputSourceNames[SourceIndex] := InputDevice.Source[SourceIndex].Name; - end; - // add source-selection slider (InteractionID: 1) - SelectInputSourceID := AddSelectSlide(Theme.OptionsRecord.SelectSlideInput, - InputDeviceCfg.Input, InputSourceNames); - - // add space for source volume bar - WidgetYPos := Theme.OptionsRecord.SelectSlideInput.Y + - Theme.OptionsRecord.SelectSlideInput.H + - SourceBarsTotalHeight; - - // find max. channel count of all devices - MaxChannelCount := 0; - for DeviceIndex := 0 to High(AudioInputProcessor.DeviceList) do - begin - if (AudioInputProcessor.DeviceList[DeviceIndex].AudioFormat.Channels > MaxChannelCount) then - MaxChannelCount := AudioInputProcessor.DeviceList[DeviceIndex].AudioFormat.Channels; - end; - - // init channel-to-player mapping sliders - SetLength(SelectSlideChannelID, MaxChannelCount); - SetLength(SelectSlideChannelTheme, MaxChannelCount); - - for ChannelIndex := 0 to MaxChannelCount-1 do - begin - // copy reference slide - SelectSlideChannelTheme[ChannelIndex] := - Theme.OptionsRecord.SelectSlideChannel; - // set current channel-theme - ChannelTheme := @SelectSlideChannelTheme[ChannelIndex]; - // adjust vertical position - ChannelTheme.Y := WidgetYPos; - // calc size of next slide (add space for bars) - WidgetYPos := WidgetYPos + ChannelTheme.H + ChannelBarsTotalHeight; - // append channel index to name - ChannelTheme.Text := ChannelTheme.Text + IntToStr(ChannelIndex+1); - - // show/hide widgets depending on whether the channel exists - if (ChannelIndex < Length(InputDeviceCfg.ChannelToPlayerMap)) then - begin - // current device has this channel - - // add slider - SelectSlideChannelID[ChannelIndex] := AddSelectSlide(ChannelTheme^, - InputDeviceCfg.ChannelToPlayerMap[ChannelIndex], IChannelPlayer); - end - else - begin - // current device does not have that many channels - - // add slider but hide it and assign a dummy variable to it - SelectSlideChannelID[ChannelIndex] := AddSelectSlide(ChannelTheme^, - ChannelToPlayerMapDummy, IChannelPlayer); - SelectsS[SelectSlideChannelID[ChannelIndex]].Visible := false; - end; - end; - end; - - // add Exit-button - //ButtonTheme := Theme.OptionsRecord.ButtonExit; - // adjust button position - //if (WidgetYPos <> 0) then - // ButtonTheme.Y := WidgetYPos; - //AddButton(ButtonTheme); - // <mog> I uncommented the stuff above, because it's not skinable :X - AddButton(Theme.OptionsRecord.ButtonExit); - if (Length(Button[0].Text) = 0) then - AddButtonText(14, 20, Theme.Options.Description[7]); - // store InteractionID - if (Length(AudioInputProcessor.DeviceList) > 0) then - ExitButtonIID := MaxChannelCount + 2 - else - ExitButtonIID := 0; - - // set focus - Interaction := 0; -end; - -procedure TScreenOptionsRecord.UpdateInputDevice; -var - SourceIndex: integer; - InputDevice: TAudioInputDevice; - InputDeviceCfg: PInputDeviceConfig; - ChannelIndex: integer; -begin - //Log.LogStatus('Update input-device', 'TScreenOptionsRecord.UpdateCard') ; - - StopPreview(); - - // set CurrentDeviceIndex to a valid device - if (CurrentDeviceIndex > High(AudioInputProcessor.DeviceList)) then - CurrentDeviceIndex := 0; - - // update sliders if at least one device was detected - if (Length(AudioInputProcessor.DeviceList) > 0) then - begin - InputDevice := AudioInputProcessor.DeviceList[CurrentDeviceIndex]; - InputDeviceCfg := @Ini.InputDeviceConfig[InputDevice.CfgIndex]; - - // update source-selection slider - SetLength(InputSourceNames, Length(InputDevice.Source)); - for SourceIndex := 0 to High(InputDevice.Source) do - begin - InputSourceNames[SourceIndex] := InputDevice.Source[SourceIndex].Name; - end; - UpdateSelectSlideOptions(Theme.OptionsRecord.SelectSlideInput, SelectInputSourceID, - InputSourceNames, InputDeviceCfg.Input); - - // update channel-to-player mapping sliders - for ChannelIndex := 0 to MaxChannelCount-1 do - begin - // show/hide widgets depending on whether the channel exists - if (ChannelIndex < Length(InputDeviceCfg.ChannelToPlayerMap)) then - begin - // current device has this channel - - // show slider - UpdateSelectSlideOptions(SelectSlideChannelTheme[ChannelIndex], - SelectSlideChannelID[ChannelIndex], IChannelPlayer, - InputDeviceCfg.ChannelToPlayerMap[ChannelIndex]); - SelectsS[SelectSlideChannelID[ChannelIndex]].Visible := true; - end - else - begin - // current device does not have that many channels - - // hide slider and assign a dummy variable to it - UpdateSelectSlideOptions(SelectSlideChannelTheme[ChannelIndex], - SelectSlideChannelID[ChannelIndex], IChannelPlayer, - ChannelToPlayerMapDummy); - SelectsS[SelectSlideChannelID[ChannelIndex]].Visible := false; - end; - end; - end; - - StartPreview(); -end; - -procedure TScreenOptionsRecord.ChangeVolume(VolumeChange: single); -var - InputDevice: TAudioInputDevice; - Volume: single; -begin - // validate CurrentDeviceIndex - if ((CurrentDeviceIndex < 0) or - (CurrentDeviceIndex > High(AudioInputProcessor.DeviceList))) then - begin - Exit; - end; - - InputDevice := AudioInputProcessor.DeviceList[CurrentDeviceIndex]; - if not assigned(InputDevice) then - Exit; - - // set new volume - Volume := InputDevice.GetVolume() + VolumeChange; - InputDevice.SetVolume(Volume); - //DebugWriteln('Volume: ' + floattostr(InputDevice.GetVolume)); - - // volume must be polled again - NextVolumePollTime := 0; -end; - -procedure TScreenOptionsRecord.onShow; -var - ChannelIndex: integer; -begin - inherited; - - Interaction := 0; - - // create preview sound-buffers - SetLength(PreviewChannel, MaxChannelCount); - for ChannelIndex := 0 to High(PreviewChannel) do - PreviewChannel[ChannelIndex] := TCaptureBuffer.Create(); - - SetLength(ChannelPeak, MaxChannelCount); - - StartPreview(); -end; - -procedure TScreenOptionsRecord.onHide; -var - ChannelIndex: integer; -begin - StopPreview(); - - // free preview buffers - for ChannelIndex := 0 to High(PreviewChannel) do - PreviewChannel[ChannelIndex].Free; - SetLength(PreviewChannel, 0); - SetLength(ChannelPeak, 0); -end; - -procedure TScreenOptionsRecord.StartPreview; -var - ChannelIndex: integer; - Device: TAudioInputDevice; -begin - if ((CurrentDeviceIndex >= 0) and - (CurrentDeviceIndex <= High(AudioInputProcessor.DeviceList))) then - begin - Device := AudioInputProcessor.DeviceList[CurrentDeviceIndex]; - // set preview channel as active capture channel - for ChannelIndex := 0 to High(Device.CaptureChannel) do - begin - PreviewChannel[ChannelIndex].Clear(); - Device.LinkCaptureBuffer(ChannelIndex, PreviewChannel[ChannelIndex]); - FillChar(ChannelPeak[ChannelIndex], SizeOf(TPeakInfo), 0); - end; - Device.Start(); - PreviewDeviceIndex := CurrentDeviceIndex; - - // volume must be polled again - NextVolumePollTime := 0; - end; -end; - -procedure TScreenOptionsRecord.StopPreview; -var - ChannelIndex: integer; - Device: TAudioInputDevice; -begin - if ((PreviewDeviceIndex >= 0) and - (PreviewDeviceIndex <= High(AudioInputProcessor.DeviceList))) then - begin - Device := AudioInputProcessor.DeviceList[PreviewDeviceIndex]; - Device.Stop; - for ChannelIndex := 0 to High(Device.CaptureChannel) do - Device.LinkCaptureBuffer(ChannelIndex, nil); - end; - PreviewDeviceIndex := -1; -end; - - -procedure TScreenOptionsRecord.DrawVolume(x, y, Width, Height: single); -var - x1, y1, x2, y2: single; - VolBarInnerWidth: integer; - Volume: single; -const - VolBarInnerHSpacing = 2; - VolBarInnerVSpacing = 1; -begin - // coordinates for black rect - x1 := x; - y1 := y; - x2 := x1 + Width; - y2 := y1 + Height; - - // init blend mode - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_BLEND); - - // draw black background-rect - glColor4f(0, 0, 0, 0.8); - glBegin(GL_QUADS); - glVertex2f(x1, y1); - glVertex2f(x2, y1); - glVertex2f(x2, y2); - glVertex2f(x1, y2); - glEnd(); - - VolBarInnerWidth := Trunc(Width - 2*VolBarInnerHSpacing); - - // TODO: if no volume is available, show some info (a blue bar maybe) - if (SourceVolume >= 0) then - Volume := SourceVolume - else - Volume := 0; - - // coordinates for first half of the volume bar - x1 := x + VolBarInnerHSpacing; - x2 := x1 + VolBarInnerWidth * Volume; - y1 := y1 + VolBarInnerVSpacing; - y2 := y2 - VolBarInnerVSpacing; - - // draw volume-bar - glBegin(GL_QUADS); - // draw volume bar - glColor3f(0.4, 0.3, 0.3); - glVertex2f(x1, y1); - glVertex2f(x1, y2); - glColor3f(1, 0.1, 0.1); - glVertex2f(x2, y2); - glVertex2f(x2, y1); - glEnd(); - - { not needed anymore - // coordinates for separator - x1 := x + VolBarInnerHSpacing; - x2 := x1 + VolBarInnerWidth; - - // draw separator - glBegin(GL_LINE_STRIP); - glColor4f(0.1, 0.1, 0.1, 0.2); - glVertex2f(x1, y2); - glColor4f(0.4, 0.4, 0.4, 0.2); - glVertex2f((x1+x2)/2, y2); - glColor4f(0.1, 0.1, 0.1, 0.2); - glVertex2f(x2, y2); - glEnd(); - } - - glDisable(GL_BLEND); -end; - -procedure TScreenOptionsRecord.DrawVUMeter(const State: TDrawState; x, y, Width, Height: single); -var - x1, y1, x2, y2: single; - Volume, PeakVolume: single; - Delta: single; - VolBarInnerWidth: integer; -const - VolBarInnerHSpacing = 2; - VolBarInnerVSpacing = 1; -begin - // coordinates for black rect - x1 := x; - y1 := y; - x2 := x1 + Width; - y2 := y1 + Height; - - // init blend mode - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_BLEND); - - // draw black background-rect - glColor4f(0, 0, 0, 0.8); - glBegin(GL_QUADS); - glVertex2f(x1, y1); - glVertex2f(x2, y1); - glVertex2f(x2, y2); - glVertex2f(x1, y2); - glEnd(); - - VolBarInnerWidth := Trunc(Width - 2*VolBarInnerHSpacing); - - // vertical positions - y1 := y1 + VolBarInnerVSpacing; - y2 := y2 - VolBarInnerVSpacing; - - // coordinates for bevel - x1 := x + VolBarInnerHSpacing; - x2 := x1 + VolBarInnerWidth; - - glBegin(GL_QUADS); - Volume := PreviewChannel[State.ChannelIndex].MaxSampleVolume(); - - // coordinates for volume bar - x1 := x + VolBarInnerHSpacing; - x2 := x1 + VolBarInnerWidth * Volume; - - // draw volume bar - glColor3f(State.RD, State.GD, State.BD); - glVertex2f(x1, y1); - glVertex2f(x1, y2); - glColor3f(State.R, State.G, State.B); - glVertex2f(x2, y2); - glVertex2f(x2, y1); - - Delta := (SDL_GetTicks() - ChannelPeak[State.ChannelIndex].Time)/1000; - PeakVolume := ChannelPeak[State.ChannelIndex].Volume - Delta*Delta*PeakDecay; - - // determine new peak-volume - if (Volume > PeakVolume) then - begin - PeakVolume := Volume; - ChannelPeak[State.ChannelIndex].Volume := Volume; - ChannelPeak[State.ChannelIndex].Time := SDL_GetTicks(); - end; - - x1 := x + VolBarInnerHSpacing + VolBarInnerWidth * PeakVolume; - x2 := x1 + 2; - - // draw peak - glColor3f(0.8, 0.8, 0.8); - glVertex2f(x1, y1); - glVertex2f(x1, y2); - glVertex2f(x2, y2); - glVertex2f(x2, y1); - - // draw threshold - x1 := x + VolBarInnerHSpacing; - x2 := x1 + VolBarInnerWidth * IThresholdVals[Ini.ThresholdIndex]; - - glColor4f(0.3, 0.3, 0.3, 0.6); - glVertex2f(x1, y1); - glVertex2f(x1, y2); - glVertex2f(x2, y2); - glVertex2f(x2, y1); - glEnd(); - - glDisable(GL_BLEND); -end; - -procedure TScreenOptionsRecord.DrawPitch(const State: TDrawState; x, y, Width, Height: single); -var - x1, y1, x2, y2: single; - i: integer; - ToneBoxWidth: real; - ToneString: PChar; - ToneStringWidth, ToneStringHeight: real; - ToneStringMaxWidth: real; - ToneStringCenterXOffset: real; -const - PitchBarInnerHSpacing = 2; - PitchBarInnerVSpacing = 1; -begin - // calc tone pitch - PreviewChannel[State.ChannelIndex].AnalyzeBuffer(); - - // coordinates for black rect - x1 := x; - y1 := y; - x2 := x + Width; - y2 := y + Height; - - // init blend mode - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_BLEND); - - // draw black background-rect - glColor4f(0, 0, 0, 0.8); - glBegin(GL_QUADS); - glVertex2f(x1, y1); - glVertex2f(x2, y1); - glVertex2f(x2, y2); - glVertex2f(x1, y2); - glEnd(); - - // coordinates for tone boxes - ToneBoxWidth := Width / NumHalftones; - y1 := y1 + PitchBarInnerVSpacing; - y2 := y2 - PitchBarInnerVSpacing; - - glBegin(GL_QUADS); - // draw tone boxes - for i := 0 to NumHalftones-1 do - begin - x1 := x + i * ToneBoxWidth + PitchBarInnerHSpacing; - x2 := x1 + ToneBoxWidth - 2*PitchBarInnerHSpacing; - - if ((PreviewChannel[State.ChannelIndex].ToneValid) and - (PreviewChannel[State.ChannelIndex].ToneAbs = i)) then - begin - // highlight current tone-pitch - glColor3f(1, i / (NumHalftones-1), 0) - end - else - begin - // grey other tone-pitches - glColor3f(0.3, i / (NumHalftones-1) * 0.3, 0); - end; - - glVertex2f(x1, y1); - glVertex2f(x2, y1); - glVertex2f(x2, y2); - glVertex2f(x1, y2); - end; - glEnd(); - - glDisable(GL_BLEND); - - /// - // draw the name of the tone - /////// - - ToneString := PChar(PreviewChannel[State.ChannelIndex].ToneString); - ToneStringHeight := ChannelBarsTotalHeight; - - // initialize font - // TODO: what about reflection, italic etc.? - SetFontSize(ToneStringHeight/3); - - // center - // Note: for centering let us assume that G#4 has the max. horizontal extent - ToneStringWidth := glTextWidth(ToneString); - ToneStringMaxWidth := glTextWidth('G#4'); - ToneStringCenterXOffset := (ToneStringMaxWidth-ToneStringWidth) / 2; - - // draw - SetFontPos(x-ToneStringWidth-ToneStringCenterXOffset, y-ToneStringHeight/2); - glColor3f(0, 0, 0); - glPrint(ToneString); -end; - -function TScreenOptionsRecord.Draw: boolean; -var - i: integer; - Device: TAudioInputDevice; - DeviceCfg: PInputDeviceConfig; - SelectSlide: TSelectSlide; - BarXOffset, BarYOffset, BarWidth: real; - ChannelIndex: integer; - State: TDrawState; -begin - DrawBG; - DrawFG; - - if ((PreviewDeviceIndex >= 0) and - (PreviewDeviceIndex <= High(AudioInputProcessor.DeviceList))) then - begin - Device := AudioInputProcessor.DeviceList[PreviewDeviceIndex]; - DeviceCfg := @Ini.InputDeviceConfig[Device.CfgIndex]; - - // update source volume - if (SDL_GetTicks() >= NextVolumePollTime) then - begin - NextVolumePollTime := SDL_GetTicks() + 500; // next poll in 500ms - SourceVolume := Device.GetVolume(); - end; - - // get source select slide - SelectSlide := SelectsS[SelectInputSourceID]; - BarXOffset := SelectSlide.TextureSBG.X; - BarYOffset := SelectSlide.TextureSBG.Y + SelectSlide.TextureSBG.H + BarUpperSpacing; - BarWidth := SelectSlide.TextureSBG.W; - DrawVolume(SelectSlide.TextureSBG.X, BarYOffset, BarWidth, BarHeight); - - for ChannelIndex := 0 to High(Device.CaptureChannel) do - begin - // load player color mapped to current input channel - if (DeviceCfg.ChannelToPlayerMap[ChannelIndex] > 0) then - begin - // set mapped channel to corresponding player-color - LoadColor(State.R, State.G, State.B, 'P'+ IntToStr(DeviceCfg.ChannelToPlayerMap[ChannelIndex]) + 'Dark'); - end - else - begin - // set non-mapped channel to white - State.R := 1; State.G := 1; State.B := 1; - end; - - // dark player colors - State.RD := 0.2 * State.R; - State.GD := 0.2 * State.G; - State.BD := 0.2 * State.B; - - // channel select slide - SelectSlide := SelectsS[SelectSlideChannelID[ChannelIndex]]; - - BarXOffset := SelectSlide.TextureSBG.X; - BarYOffset := SelectSlide.TextureSBG.Y + SelectSlide.TextureSBG.H + BarUpperSpacing; - BarWidth := SelectSlide.TextureSBG.W; - - State.ChannelIndex := ChannelIndex; - - DrawVUMeter(State, BarXOffset, BarYOffset, BarWidth, BarHeight); - DrawPitch(State, BarXOffset, BarYOffset+BarHeight, BarWidth, BarHeight); - end; - end; - - Result := True; -end; - - -end. |