1
Визуализации / Visualizations / Re: OpenSpectrumLazarus Спектрум (исходник на Lazarus)
« on: February 06, 2018, 13:48:15 »
пока Evg3559 не проверит 3.6 делать выводы про ошибку в плагине рано
This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.
А у меня не идет - вылетает плеер и всё
Последняя версия проги, скачана с оф сайта, система - винда семерка, сп1
господа - никто не подскажет как поднять пики что бы в полноэкранном варианте отображалось все линии и в середине тоже
переключить частоту выхода на слышимый диапазон: 44100 Гц (настройки \ воспроизведение)
Нет переключения внешнего вида по клику на визуализации, как на 4'ом скрине 1го сообщения.Это другая визуализация. http://jqbook.net.ru/lazarus/spvis2
TAIMP_SimpleVisual = class (TAIMPCustomPlugin)
{ ... }
public
// Методы для наследования
// - Необязательные методы
function vis_Init(Width, Height: Integer): HRESULT; virtual;
procedure vis_Finalize; virtual;
procedure vis_Click(X, Y: Integer; Button: Integer); virtual;
procedure vis_Resize(NewWidth, NewHeight: Integer); virtual;
procedure vis_AIMP_Message(Message: DWORD; Param1: Integer; Param2: Pointer; var Result: HRESULT); virtual;
// - Обязательные методы, требуют реализации
function vis_GetAutor: string; virtual;
function vis_GetName: string; virtual;
function vis_GetType: TAIMP_VISUAL_TYPE; virtual; // AIMP_VISUAL_FLAGS_RQD_DATA_SPECTRUM
// Отрисовка
procedure vis_Draw(DC_AIMP, DC_Buffer: HDC;
Data: PAIMPVisualData; const Width,Height:integer); virtual;
end;
AIMP_VISUAL_FLAGS_RQD_DATA_WAVE = 1;
AIMP_VISUAL_FLAGS_RQD_DATA_SPECTRUM = 2;
AIMP_VISUAL_FLAGS_NOT_SUSPEND = 4;
procedure vis_Draw(
DC_AIMP, DC_Buffer: HDC;
Data: PAIMPVisualData;
const Width,Height:integer
); virtual;
type
TAIMPVisualDataSpectrum = array[0..AIMP_VISUAL_SPECTRUM_MAX - 1] of Single;
TAIMPVisualDataWaveform = array[0..AIMP_VISUAL_WAVEFORM_MAX - 1] of Single;
PAIMPVisualData = ^TAIMPVisualData;
TAIMPVisualData = packed record
Peaks: array[0..1] of Single;
Spectrum: array[0..2] of TAIMPVisualDataSpectrum;
Waveform: array[0..1] of TAIMPVisualDataWaveform;
end;
TSimpleWave = class (TAIMP_SimpleVisual)
public
function vis_GetAutor: string; override;
function vis_GetName: string; override;
function vis_GetType: TAIMP_VISUAL_TYPE; override;
// Отрисовка
procedure vis_Draw(DC_AIMP, DC_Buffer: HDC; Data: PAIMPVisualData; const Width,Height:integer); override;
// Init
function vis_Init(Width, Height: Integer): HRESULT; override;
// Обработка сообщений
procedure vis_AIMP_Message(Message: DWORD; Param1: Integer; Param2: Pointer; var Result: HRESULT); override;
// Клик по визуализации
procedure vis_Click(X, Y: Integer; Button: Integer); override;
public
showTextTime: Integer;
end;
function TSimpleWave.vis_GetAutor: string;
begin
Result:='SimpleWave Autor';
end;
function TSimpleWave.vis_GetName: string;
begin
Result:='SimpleWave Visual';
showTextTime:=0;
end;
function TSimpleWave.vis_GetType: TAIMP_VISUAL_TYPE;
begin
Result:=AIMP_VISUAL_FLAGS_RQD_DATA_WAVE; // запрашиваем волновую
end;
procedure TSimpleWave.vis_Draw(DC_AIMP, DC_Buffer: HDC; Data: PAIMPVisualData; const Width, Height: integer);
var ci,x,z,y, offset: integer;
br: HBRUSH; s: AnsiString;
begin
// отрисовка
// Все рисование идет на DC_Buffer, и в самом конце переносится на DC_AIMP через функцию BitBlt
// Очистка экрана
br:=windows.CreateSolidBrush($3C3C3C);
windows.FillRect(DC_Buffer, Bounds(0,0, Width, Height), br);
windows.DeleteObject(br);
offset:=trunc( Height / 2 );
// << CSS совместимый цвет
y:=0;
for ci:=0 to High(Data^.Waveform) do begin
for x:=0 to Width-1 do begin
z:= Trunc((1 - Data^.Waveform[ci][x]) * offset / 2);
if z < 0 then z := 0;
if z > Height then z:= Height -1;
if x = 0 then y := z;
repeat // draw line from previous sample...
if y < z then begin
inc(y);
end else if y > z then begin
dec(y);
end;
if (ci = 0) then begin
windows.SetPixel(DC_Buffer, x, y + round(offset / 2), $FFFAFA);
end;
if (ci = 1) then begin
windows.SetPixel(DC_Buffer, x, y + round(offset / 2), $00FA9A);
end;
until y = z;
end; // end for
end; // end for
if (showTextTime>0) then begin
// показываем текст в случае если таймер showTextTime не истек
dec(showTextTime);
s:= 'AIMP new track';
Windows.SetBkColor(DC_Buffer, $3C3C3C); // фон
Windows.SetTextColor(DC_Buffer, $00FA9A); // текст
Windows.TextOutA(DC_Buffer, 2, Height-15, PAnsiChar(s), Length(s));
end;
// Копируем буфер на DC_AIMP
BitBlt(
DC_AIMP,
0, 0,
Width, Height,
DC_Buffer,
0, 0,
SRCCOPY
);
end;
function TSimpleWave.vis_Init(Width, Height: Integer): HRESULT;
begin
showTextTime:=0;
Result:=inherited vis_Init(Width, Height);
end;
procedure TSimpleWave.vis_AIMP_Message(Message: DWORD; Param1: Integer;
Param2: Pointer; var Result: HRESULT);
begin
if Message = AIMP_MSG_EVENT_STREAM_START then begin
showTextTime:=60;
end;
end;
procedure TSimpleWave.vis_Click(X, Y: Integer; Button: Integer);
var s: string;
begin
s:= 'WIN_DLL_Path: ' + AIMP_SimpleVisual.GET_WIN_DLL_Path + #13#10 +
'APPDATA PATH: ' + self.visAPPDataPath ;
Windows.MessageBoxW(0, PWideChar(s) , 'AIMP Click Event', 0);
end; ;
function f_Clicked(x,y,buttons: Integer): BOOL; cdecl;
var
path: array [0 .. MAX_PATH-1] of WideChar;
pathLength: integer;
pf: WideString;
ps: UTF8String;
begin
if (y<30) AND (LAST_DS.Width-x<30) then begin
pathLength:=windows.GetModuleFileNameW(HInstance, @path[0], MAX_PATH);
// windows отвечает Unicode кодировкой
// Lazarus Использует UTF8 кодировку в строках
SetLength(pf,pathLength);
Move(path[0],pf[1],pathLength*sizeOf(WideChar)); // копируем низкоуровневую строку в нормальную строку
ps:=UTf8Encode(pf);
ps:=ExtractFilePath(ps);
pf:=UTF8Decode(ps);
ps:=ps + 'OpenSpectrumLazarus2_editor.exe';
if FileExistsUTF8( ps ) then begin // UTF8
// Для Windows отправляем уже в Unicode
// pf - Unicode строка
ShellExecuteW(0,'open','OpenSpectrumLazarus2_editor.exe','', PWideChar(pf), SW_SHOWNORMAL);
end;
end;
result:=true;
end;
АИМП 3.60