Цена разработки, порядок контроля и приемки

7.1. Цена разработки

Цена договорная.

7.2. Общие требования к приемке работы

На основании Протокола проведения испытаний Исполнитель совместно с Заказчиком подписывает Акт приемки-сдачи программы в эксплуатацию.

ОТ ИСПОЛНИТЕЛЯ ОТ ЗАКАЗЧИКА

 

"__" __________ 20013 Г. "__" __________ 20013 Г.


ПРОЕКТИРОВАНИЕ АУДИО ПЛЕЕРА "3PMPLAYER"

Проектирование аудио плеера — процесс создания структуры аудио плеера и определения необходимых ограничений целостности.

ОСНОВНЫЕ ЗАДАЧИ ПРОЕКТИРОВАНИЯ:

· Обеспечение хранения в аудио плеере всей необходимой информации о треке.

· Обеспечение возможности получения данных по всем необходимым запросам.

· Обеспечение целостности аудио плеера.

 

При проектировании типов данных учитывались возможные виды входящей информации, а также с целью облегчить последующее сопровождение аудио плеера, поэтому по умолчанию были применены 5 типов данных: string, integer, byte, boolean, datetime.

Исходя из требований (стр.5), которые были предоставлены в Техническом Задании (ТЗ), было принято создать классический аудио плеер, содержащий в себе: плейлист, кнопки управления, визуализацию, эквалайзер, регулятор громкости, регулятор баланса.


 

 

РАЗРАБОТКА АУДИО ПЛЕЕРА "3PMPLAYER"

Разработка аудио плеера - это этап реализации проектных решений в выбранной среде программирования, с использование описанных средств, методов и предпочтений заказчика, утверждённых техническим заданием.

Так как по желанию заказчика, аудио плеер должен иметь самостоятельную программную оболочку, было принято решение использовать при создании интегрированную среду разработки Embarcadero Delphi XE2. Программный продукт аудио плеера "3PMPLAYER" создавался в среде MS Windows 7.

Разработку аудио плеер можно разделить на этапы:

· Поиск и сбор необходимой информации;

· Создание бумажного варианта интерфейса;

· примерные наброски кода;

· Создание проекта в Embarcadero Delphi XE2;

Ø Создание необходимого количества форм;

Ø Расположение на формах всех необходимых объектов и их подгонка;

Ø Уникальная настройка всех объектов на формах;

Ø Написание программного кода;

Ø Тестирование правильности работы программного кода;

· Тестирование аудио плеера на наличие ошибок и совместимость с ОС Windows 8, Windows 7 и Windows XP;

· Создание резервных копий на различных электронных носителях.

Каждый этап разработки выполнялся с учетом календарного плана работ и был успешно выполнен в срок, тестирование дало положительные результаты.

Ниже представлены изображения готовых объектов аудио плеера "3PMPLAYER"

При запуске программного продукта открывается, в центре экрана, стартовая форма плеер.

На данной вкладке расположено:

· 10 активных кнопок - плей/пауза, стоп, пред. трек, след. трек, повтор трека/плейлиста/без повтора, добавление трека/папки с трека, удаление трека/всего плейлиста, кнопка шестерёнки(настройки), загрузка плейлиста, сохранение плейлиста;

· 4 компонента Panel: 2 для отображения времени трека, 2 для визуальной красоты;

· Компонент TrackBar - регулятор громкости.

· Компонент ListBox- плейлист

· 3 компонента Label-"Уровень звука:",громкость в процентах, с двигающимся текстом в самом верху окна плеера.

рис. 2.2.1. - Стартовая форма "3PM Player".

 

На данной вкладке расположено:

· 2 активных кнопок -закрыть, сброс эквалайзера и баланса звука;

· фотография выбранного номера;

· 11 TrackBar - 10 для эквалайзера, 1 для баланса звука;

· 29 Label.

рис.2.2.2.-модальная форма настроек плеера.

Исходный код Unit_1:

interface

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Bass, StdCtrls, Buttons, ExtCtrls, ComCtrls, ShellApi, Winapi.MMSystem,

RzStatus, Vcl.Menus, RzSelDir, cm_LSVGauges, RzCommon; //RzSelDir - убрать чтобы памяти поменьше жрало...http://www.cyberforum.ru/delphi-beginners/thread816542.html#post4298051

type

TTrackBar = class(ComCtrls.TTrackBar)

protected

function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override;

end;

TFFTData = array [0..512] of Single;

TForm1 = class(TForm)

OpenDialog1: TOpenDialog;

Timer2_Play: TTimer;

Panel3: TPanel;

Panel4: TPanel;

ListBox1: TListBox;

ListBox2: TListBox;

TrackBar1: TTrackBar;

SpeedButton1: TSpeedButton;

SpeedButton2: TSpeedButton;

SpeedButton3: TSpeedButton;

SpeedButton4: TSpeedButton;

SaveDialog1: TSaveDialog;

Label1: TLabel;

BitBtn3: TBitBtn;

BitBtn2: TBitBtn;

Panel6: TPanel;

Panel7: TPanel;

Timer3_Time: TTimer;

Label4: TLabel;

Timer4_Visual: TTimer;

BitBtn5: TBitBtn;

BitBtn6: TBitBtn;

BitBtn4: TBitBtn;

RzMarqueeStatus1: TRzMarqueeStatus;

PopupMenu4: TPopupMenu;

N31: TMenuItem;

N32: TMenuItem;

N1: TMenuItem;

RzSelDirDialog1: TRzSelDirDialog;

PopupMenu2: TPopupMenu;

N2: TMenuItem;

N3: TMenuItem;

LSVGauge7: TLSVGauge;

Label2: TLabel;

Button1: TButton;

PopupMenu1: TPopupMenu;

N4: TMenuItem;

Image1: TImage;

PopupTrack: TPopupMenu;

N5: TMenuItem;

N6: TMenuItem;

procedure FormCreate(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure BitBtn2Click(Sender: TObject);

procedure BitBtn3Click(Sender: TObject);

procedure Timer2_PlayTimer(Sender: TObject);

procedure ListBox1DblClick(Sender: TObject);

procedure ListBox1KeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

procedure SpeedButton4Click(Sender: TObject);

procedure SpeedButton3Click(Sender: TObject);

procedure Timer3_TimeTimer(Sender: TObject);

procedure BitBtn4Click(Sender: TObject);

procedure TrackBar1Change(Sender: TObject);

procedure Draw(FFTData : TFFTData; X, Y : Integer);

procedure Timer4_VisualTimer(Sender: TObject);

procedure BitBtn5Click(Sender: TObject);

procedure BitBtn6Click(Sender: TObject);

procedure Panel6Click(Sender: TObject);

procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;

Rect: TRect; State: TOwnerDrawState);

procedure ListBox1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure LSVGauge7MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure LSVGauge7MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

procedure LSVGauge7MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure N31Click(Sender: TObject);

procedure N1Click(Sender: TObject);

procedure SpeedButton1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure SpeedButton2MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure N2Click(Sender: TObject);

procedure N3Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure N4Click(Sender: TObject);

procedure FormShow(Sender: TObject);

procedure FocusPlayList;

procedure N5Click(Sender: TObject);

procedure ListBox1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure N6Click(Sender: TObject);//при нажатии на кнопки фокус переходит на громкость, TrackBar1

private

_tray1: TNotifyIconData; // структура для иконки трея

tray_icon: HIcon;

hFileMapObj: THandle; //описатель FaleMapping

lpBaseAddress: PChar; //"указатель" на начальный адрес данных

procedure AddFiles(FileName : String);

procedure PlayItem;// (Item : String)

procedure DropFile(Var Msg:TWMDropFiles); message WM_DropFiles;

public

Stream:HStream; //поток

{ Public declarations }

// обработчик событий значка:

procedure TrayEvent(var Msg: TMessage); message WM_User + 2;

// обработчик событий формы:

procedure ControlWindow(var Msg: TMessage); message WM_SysCommand;

end;

//2. ogg

var

l:Tpanel; //для норм перематывания lsvgauge7

Form1: TForm1;

PAP :String; //Условие для Play и Pause

Stop,//для стопа

repeattrack, //для повтора трека

repeatPlayList :Boolean;//для повтора плейлиста

Buttonbar: TMouseButton; //Для нормальной работы ProgressBar'а

p: BASS_DX8_PARAMEQ; //для эквалайзера

fx: array[1..10] of integer; //для эквалайзера

FFTPeacks : array [0..128] of Integer; //переменные визуализации

FFTFallOff : array [0..128] of Integer; //переменные визуализации

implementation

 

{$R *.dfm}

 

uses Unit2;

 

 

procedure ShowPropertiesDialog(FName: string);

var

SExInfo: TSHELLEXECUTEINFO;

Error: LongInt;

begin

ZeroMemory(Addr(SExInfo),SizeOf(SExInfo));

SExInfo.cbSize := SizeOf(SExInfo);

SExInfo.lpFile := PChar(FName);

SExInfo.lpVerb := 'properties';

SExInfo.fMask := SEE_MASK_INVOKEIDLIST;

ShellExecuteEx(Addr(SExInfo));

end;

 

 

procedure TForm1.TrayEvent(var Msg: TMessage);

var

_cur: TPoint; // координаты курсора

begin

GetCursorPos(_cur); // определяем координаты курсора

Case msg.LParam of

WM_LButtonUp, WM_LButtonDBLCLK: // если нажата ЛКМ или двойной ЛКМ

begin

// посылаем сообщение форме о том, что ей надо отобразиться

//postMessage(Self.Handle, WM_SysCommand, SC_Restore, 123456);

BitBtn2.Click;

end;

WM_RButtonUp:

begin

popupmenu1.Popup(_cur.X, _cur.Y); // показываем меню

end;

end;

end;

 

//procedure TForm1.FocusPlayList;

 

procedure TForm1.ControlWindow(var Msg: TMessage);

begin

// если это сообщение - "свернуть форму" - перехватываем его

If Msg.WParam = SC_MINIMIZE then

begin

Shell_NotifyIcon(nim_add, @_tray1); // добавляем в трей значок

Self.Hide; // скрываем форму

end

else if Msg.WParam = SC_Restore then

begin

If msg.LParam = 123456 then // если это наше сообщение, то покажем форму

begin

Self.Show; // показать форму

SetForegroundWindow(Self.Handle);

//Shell_NotifyIcon(nim_delete, @_tray1); // скрываем (удаляем) значок

end

else if msg.LParam = 123457 then // если это сообщение от запущенной второй копии проги

begin

Self.Show; // показать форму

SetForegroundWindow(Self.Handle);

Shell_NotifyIcon(nim_delete, @_tray1); // скрываем (удаляем) значок

MessageBox(handle, 'Нельзя запускать более одной копии программы!',

'3PMPlayer', mb_IconInformation);

end

else // иначе, пусть форма сама решает, что ей делать :)

inherited;

end

else // иначе

inherited; // не перехватываем сообщение

end;

 

 

function TTrackBar.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean;

begin

Position := Position + WheelDelta div 30;

Result := True;

end;

 

procedure FindFile(Dir: String);

var sr: TSearchRec;

begin

dir:=Dir + '\';

if FindFirst(Dir + '*.*', faAnyFile, sr) = 0 then

begin

repeat

if (sr.Name <> '..') and (sr.Name <> '.') then

if (sr.Attr and faDirectory) <> 0 then

begin

FindFile(Dir + sr.Name);

end

else

if (ExtractFileExt(sr.Name)='.mp3') or (ExtractFileExt(sr.Name)='.mp4') or (ExtractFileExt(sr.Name)='.wma') or (ExtractFileExt(sr.Name)='.wav') then // ['.mp3','.mp4','.wma','.wav']

form1.addfiles(Dir + sr.Name);

until FindNext(sr) <> 0;

FindClose(sr);

end;

end;

 

 

function MyTrackBarProc(myWnd : HWND; Msg : UINT;

myWParam : WPARAM; myLParam:LPARAM) : LRESULT; stdcall;

var

DC, hPen, hOldPen, hOldBrush : DWORD;

cxBorder : integer;

rc : TRect;

cr : integer;

begin

result := CallWindowProc(Pointer(GetWindowLong(myWnd,GWL_USERDATA)),

myWnd, Msg, myWParam, myLParam);

if Msg = WM_PAINT then

begin

cxBorder := GetSystemMetrics(SM_CXBORDER);

GetWindowRect(myWnd,rc);

DC := GetWindowDC(myWnd);

cr :=GetSysColor(COLOR_BTNFACE);

hPen := CreatePen(PS_INSIDEFRAME, cxBorder, cr);

hOldPen := SelectObject(DC, hPen);

hOldBrush := SelectObject(DC, GetStockObject(NULL_BRUSH));

Rectangle(DC, 0, 0,rc.Right - rc.Left, rc.Bottom - rc.Top);

SelectObject(DC, hOldBrush);

SelectObject(DC, hOldPen);

ReleaseDC(myWnd,DC);

DeleteObject(hPen)

end;

end;

 

 

function GetFileFormat(St: string): string; //получить расширение файла

var

//z: integer;

n: byte;

begin

for n := length(St) -1 downto 0 do

if (St[n] = '.') then

begin

//n := z;

st:=Copy(St,n+1,length(St)-n);

break;

end;

//Delete(St, 1, n);

Result := St;

end;

 

procedure TForm1.LSVGauge7MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

if LSVGauge7.Enabled=false then Exit;

buttonBar:=button;

LSVGauge7.Progress := Round(x * (LSVGauge7.Maxvalue / L.Width));

Bass_ChannelSetPosition(Stream, LSVGauge7.progress, 0);

end;

 

procedure TForm1.LSVGauge7MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if LSVGauge7.Enabled=false then Exit;

buttonBar:=mbright;

end;

 

procedure TForm1.LSVGauge7MouseMove(Sender: TObject; Shift: TShiftState;

X, Y: Integer);

begin

if LSVGauge7.Enabled=false then Exit;

if buttonbar=mbleft then

Begin

LSVGauge7.Progress :=Round((Bass_ChannelGetLength(Stream, 0)/lsvgauge7.width*x));

Bass_ChannelSetPosition(Stream, LSVGauge7.Progress, 0);

end;

end;

 

 

procedure TForm1.FocusPlayList;

begin

if form1.Visible then

form1.trackbar1.setfocus;

end;

 

procedure TForm1.FormCreate(Sender: TObject);

var ProgDir:String; //Путь в exe'шнику (плеер)

s: String;

HandlePrev: HWnd;

begin

{Трей}

// === подготовка к работе с Page File (File Mapping) === === === === === ===

hFileMapObj:=CreateFileMapping(MAXDWORD, nil, PAGE_READWRITE, 0, 4,

'10D964863CFB45C9A2F76BA91FB4C7E3666');

{

10D964863CFB45C9A2F76BA91FB4C7E3666

Это левое число. Точнее строка, и вместо неё в функции выше можешь писать

что угодно - это по-моему имя проецированного файла. Такое имя (большое

шестнадцатиричное число) я ему дал в надежде, что никогда другая программа не

будет пыаться создать файл с таким же именем; во избедание совпадений :)

}

If (hFileMapObj = 0) Then

MessageBox(0, 'Не могу создать FileMapping!', '', mb_IconError)

else

lpBaseAddress := MapViewOfFile(hFileMapObj,FILE_MAP_WRITE, 0, 0, 0);

If lpBaseAddress = nil Then

MessageBox(0, 'Не могу создать FileMapping!', '', mb_IconError);

// === проверка содержимого файла === === === === === === === === === === ===

s := PChar(lpBaseAddress);

If Length(s) > 2 then

begin

HandlePrev := THandle(StrToInt(s));

postMessage(HandlePrev, WM_SysCommand, SC_Restore, 123457);

UnMapViewOfFile(lpBaseAddress);

CloseHandle(hFileMapObj);

halt;

end

else

begin

s := IntToStr(Integer(Self.Handle));

StrPCopy(lpBaseAddress, s);

end;

// далее, если прога не завершилась, т.е. - это первая запущенная копия,

// то выполняем инициализацию и всё:

// загружаем иконку

tray_icon := Application.Icon.Handle;

// Заполняем структуру значка:

_tray1.cbSize := SizeOf(_tray1); // размер

_tray1.Wnd := Self.Handle; // форма, которой отправлять события (типа нажатие)

_tray1.uID := 1; // номер значка

_tray1.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP; // флаги отображения

_tray1.uCallbackMessage := WM_User + 2; // код сообщения, которое посылать при событиях значка

_tray1.hIcon := tray_icon; // идентификатор иконки

_tray1.szTip := 'Кликните, чтобы взорвать компьютер!';

// показываем значок:

Shell_NotifyIcon(nim_add, @_tray1);

{Трей}

if (HIWORD(BASS_GetVersion) <> BASSVERSION) then

begin

MessageBox(0,'Не корректная версия BASS.DLL',nil,MB_ICONERROR);

Halt;

end;

// Инициализация аудио - по умолчанию, 44100hz, stereo, 16 bits

if not BASS_Init(-1, 44100, 0, Handle, nil) then

begin

MessageBox(0,'Ошибка инициализация аудио',nil,MB_ICONERROR);

Halt;

end;

//панель нужна чтобы мышь функционировала на LSVGauge7

L := Tpanel.Create(Self);

L.Parent := LSVGauge7;

L.AutoSize := False;

L.Align := alClient;

L.Alignment := taCenter;

L.OnMouseDown := LSVGauge7MouseDown;

l.OnMouseMove:=LSVGauge7MouseMove;

l.OnMouseUp:= LSVGauge7MouseUP;

l.DoubleBuffered:= true;

//////

LSVGauge7.Enabled:=false;

LSVGauge7.Text:='00:00/00:00';

Panel6.Caption:='00:00';

Panel7.Caption:='00:00';

OpenDialog1.Options:=OpenDialog1.Options+[ofAllowMultiSelect];

SetWindowLong(TrackBar1.Handle, GWL_USERDATA,SetWindowLong(TrackBar1.Handle, GWL_WNDPROC, LPARAM(@MyTrackBarProc))); // для трекбара

DragAcceptFiles(Handle, True);

ProgDir:=ExtractFileDir(ParamStr(0))+'\';

SaveDialog1.InitialDir:=ProgDir;

OpenDialog1.InitialDir:='';

TrackBar1.Position:=Round(127.5);

WaveOUtSetVolume(0,MakeLong(TrackBar1.Position*255,TrackBar1.Position*255));//громкость плеера

//Bass_SetVolume(TrackBar1.Position/100); //основная громкость

buttonBar:=mbright;

label2.Caption:=IntToStr(Round(TrackBar1.Position/2.55)) + '%';

RzMarqueeStatus1.Caption:='Made By PaXaN86';

PAP:='Play';

SpeedButton1.Glyph.LoadFromFile(ProgDir+'pic\add.BMP');

SpeedButton2.Glyph.LoadFromFile(ProgDir+'pic\del.BMP');

SpeedButton3.Glyph.LoadFromFile(ProgDir+'pic\openlist.BMP');

SpeedButton4.Glyph.LoadFromFile(ProgDir+'pic\save.BMP');

BitBtn2.Glyph.LoadFromFile(ProgDir+'pic\play.BMP');

BitBtn3.Glyph.LoadFromFile(ProgDir+'pic\stop.BMP');

BitBtn5.Glyph.LoadFromFile(ProgDir+'pic\prev.BMP');

BitBtn6.Glyph.LoadFromFile(ProgDir+'pic\next.BMP');

BitBtn4.Glyph.LoadFromFile(ProgDir+'pic\options.BMP');

repeatTrack:=false;

repeatPlayList:=false;

 

Form1.Position:=poDesktopCenter;

end;

 

procedure TForm1.FormDestroy(Sender: TObject);

begin

Bass_Stop(); //останавливаем проигрывание

BASS_StreamFree(Stream);

bass_free();

Shell_NotifyIcon(nim_delete, @_tray1); //удаляем иконку

UnMapViewOfFile(lpBaseAddress); // закрываемся в Page File

CloseHandle(hFileMapObj);

end;

 

 

procedure TForm1.FormShow(Sender: TObject);

var FFTFata : TFFTData;

begin

if ParamCount > 0 then

AddFiles(ParamStr(1));

if ListBox1.Count > 0 then

playitem;

 

BASS_ChannelGetData(stream, @FFTFata, BASS_DATA_FFT1024); //отрисовка пустой визуализации

FillChar(FFTFata [0],SizeOf(TFFTData),0);

Draw(FFTFata, 2, -5);

end;

 

procedure TForm1.BitBtn2Click(Sender: TObject);

begin

FocusPlayList;

if PAP='Play' then

begin

If (Bass_ChannelIsActive(Stream) = Bass_Active_Stopped) then

Begin

If ListBox1.Items.Count = 0 then

begin

Showmessage('Файлов в плейлисте нет!');

RzMarqueeStatus1.Caption:='Файлов в плейлисте нет!';

exit;

end;

stop:=false;

PlayItem;

exit;

End;

 

If Bass_ChannelIsActive(Stream) = Bass_Active_Paused then

begin

stop:=false;

Bass_ChannelPlay(Stream, False);

PAP:='Pause';

bitbtn2.Glyph.LoadFromFile(ExtractFileDir(ParamStr(0))+'\'+'pic\pause.BMP');

exit;

end;

end;

if PAP='Pause' then

Begin

Bass_ChannelPause(Stream); //воспроизведение

PAP:='Play';

bitbtn2.Glyph.LoadFromFile(ExtractFileDir(ParamStr(0))+'\'+'pic\play.BMP');

end;

Stop:=False;

end;

 

 

procedure TForm1.BitBtn3Click(Sender: TObject);

var FFTFata : TFFTData;

begin

FocusPlayList;

PAP:='Play';

Stop:=true;

bitbtn2.Glyph.LoadFromFile(ExtractFileDir(ParamStr(0))+'\'+'pic\play.BMP');

if Stream <> 0 then

begin

RzMarqueeStatus1.Caption:='Stop';

Bass_StreamFree(Stream); //очистка потока если не пустой

end;

end;

 

 

procedure TForm1.BitBtn4Click(Sender: TObject);

begin

FocusPlayList;

form2.showmodal;

end;

 

 

procedure TForm1.BitBtn5Click(Sender: TObject);

begin

FocusPlayList;

if listbox2.ItemIndex > 0 then

begin

Listbox2.ItemIndex:=Listbox2.ItemIndex-1;

PlayItem;

Listbox1.ItemIndex:=Listbox2.ItemIndex;

end;

end;

 

 

procedure TForm1.BitBtn6Click(Sender: TObject);

begin

FocusPlayList;

if listbox2.ItemIndex < listbox2.Count-1 then

begin

Listbox2.ItemIndex:=Listbox2.ItemIndex+1;

PlayItem;

Listbox1.ItemIndex:=Listbox2.ItemIndex;

end;

end;

 

 

procedure TForm1.Button1Click(Sender: TObject);

begin

FocusPlayList;

if Button1.Caption='Без повтора' then

begin

Button1.Caption:='Повтор трека';

repeatTrack:=true;

Exit;

end;

if Button1.Caption='Повтор трека' then

begin

Button1.Caption:='Повтор плейлиста';

repeatTrack:=false;

repeatPlayList:=true;

Exit;

end;

if Button1.Caption='Повтор плейлиста' then

begin

Button1.Caption:='Без повтора';

repeatTrack:=false;

repeatPlayList:=false;

Exit;

end;

end;

 

 

procedure TForm1.Timer2_PlayTimer(Sender: TObject);

begin

if (Bass_ChannelIsActive(stream) = BASS_ACTIVE_STOPPED) then

Begin

PAP:='Play';

bitbtn2.Glyph.LoadFromFile(ExtractFileDir(ParamStr(0))+'\'+'pic\play.BMP');

LSVGauge7.Enabled:=false;

LSVGauge7.progress:=0;

//Bass_ChannelStop(Stream);

Bass_ChannelSetPosition(Stream, 0 ,0);

 

if Stop=true then //если была нажата кнопка стоп

begin

Timer3_Time.Enabled:=false;

Timer2_Play.Enabled:=false;

Timer4_Visual.Enabled:=false;

Panel6.Caption:='00:00';

Panel7.Caption:='00:00';

LSVGauge7.Text:='00:00/00:00';

exit;

end;

 

if RepeatTrack=true then

begin

PlayItem; //(listbox2.items[listbox2.ItemIndex])

LSVGauge7.Enabled:=True;

exit;

end;

 

if (ListBox2.itemindex < ListBox2.Items.Count-1) then

begin

Listbox2.ItemIndex:=Listbox2.ItemIndex+1;

PlayItem; //(IntToStr(ListBox2.itemindex))

end

else

if RepeatPlayList=true then

begin

Listbox2.ItemIndex:=0;

Listbox1.ItemIndex:=0;

PlayItem; // (IntToStr(ListBox2.itemindex))

end

else//эксперимент

begin

RzMarqueeStatus1.Caption:='Конец списка воспроизведения!';

Listbox2.ItemIndex:=0;

Listbox1.ItemIndex:=0;

Bass_StreamFree(Stream);

stop:=True;

end;

end;

end;

 

 

procedure TForm1.AddFiles(FileName: String);

begin

ListBox2.Items.Add(FileName);

ListBox1.Items.Add(ExtractFileName(FileName));

 

If ListBox1.ItemIndex = -1 then

begin

listBox1.ItemIndex:=ListBox1.Count-1;

Listbox2.ItemIndex:=Listbox1.ItemIndex;

end;

end;

 

 

procedure TForm1.SpeedButton1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var

P: TPoint;

begin

P.X:=SpeedButton1.Left;

P.Y:=SpeedButton1.Top;

P:=ClientToScreen(P);

PopupMenu4.Popup(P.X, P.Y+185);

end;

 

 

procedure TForm1.Panel6Click(Sender: TObject);

begin

FocusPlayList;

if Panel6.BevelWidth=1 then

begin

Panel6.BevelWidth:=2;

Panel6.Hint:='Осталось времени';

exit

end;

if Panel6.BevelWidth=2 then

begin

Panel6.BevelWidth:=1;

Panel6.Hint:='Прошло времени';

exit

end;

end;

 

 

procedure TForm1.PlayItem; // (Item: String)

Var TrackLen:string;

begin

if Stream <> 0 then

Bass_channelStop(Stream);

Bass_StreamFree(Stream);

listbox1.Repaint;

if not FileExists(ListBox2.Items[ListBox2.ItemIndex]) then

begin

ShowMessage('Ошибка! Файл не существует');

RzMarqueeStatus1.Caption:='Ошибка! Файл не существует';

exit;

end;

Stream:=Bass_StreamCreateFile(false, Pchar(ListBox2.Items[Listbox2.ItemIndex]), 0, 0, 0{$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}); //создание потока

if Stream=0 then //если выбран не звуковой файл/

begin

Showmessage('Ошибка! Файл не открыт');

RzMarqueeStatus1.Caption:='Ошибка! Файл не открыт';

exit;

end;

 

 

//настройка эквалайзера

fx[1] := BASS_ChannelSetFX(form1.Stream, BASS_FX_DX8_PARAMEQ, 1);//первый канал эквалайзера

fx[2] := BASS_ChannelSetFX(form1.Stream, BASS_FX_DX8_PARAMEQ, 1);//второй канал

fx[3] := BASS_ChannelSetFX(form1.Stream, BASS_FX_DX8_PARAMEQ, 1);

fx[4] := BASS_ChannelSetFX(form1.Stream, BASS_FX_DX8_PARAMEQ, 1);

fx[5] := BASS_ChannelSetFX(form1.Stream, BASS_FX_DX8_PARAMEQ, 1);

fx[6] := BASS_ChannelSetFX(form1.Stream, BASS_FX_DX8_PARAMEQ, 1);

fx[7] := BASS_ChannelSetFX(form1.Stream, BASS_FX_DX8_PARAMEQ, 1);

fx[8] := BASS_ChannelSetFX(form1.Stream, BASS_FX_DX8_PARAMEQ, 1);

fx[9] := BASS_ChannelSetFX(form1.Stream, BASS_FX_DX8_PARAMEQ, 1);

fx[10] := BASS_ChannelSetFX(form1.Stream, BASS_FX_DX8_PARAMEQ, 1);

 

//настройка первого канала эквалайзера

p.fGain :=15-form2.trackbar3.Position; //усиление

p.fBandwidth := 3; //ширина полосы пропускания

p.fCenter := 80; //частота регулирования

BASS_FXSetParameters(fx[1], @p);//применение заданных настроек

//настройка второго канала эквалайзера

 

p.fGain := 15-form2.trackbar4.Position;

p.fBandwidth := 3;

p.fCenter := 170;

BASS_FXSetParameters(fx[2], @p);

//и т.д.

p.fGain := 15-form2.trackbar5.Position;

p.fBandwidth := 3;

p.fCenter := 310;

BASS_FXSetParameters(fx[3], @p);

 

p.fGain := 15-form2.trackbar6.Position;

p.fBandwidth := 3;

p.fCenter := 600;

BASS_FXSetParameters(fx[4], @p);

 

p.fGain := 15-form2.trackbar7.Position;

p.fBandwidth := 3;

p.fCenter := 1000;

BASS_FXSetParameters(fx[5], @p);

 

p.fGain := 15-form2.trackbar8.Position;

p.fBandwidth := 3;

p.fCenter := 3000;

BASS_FXSetParameters(fx[6], @p);

 

p.fGain := 15-form2.trackbar9.Position;

p.fBandwidth := 3;

p.fCenter := 6000;

BASS_FXSetParameters(fx[7], @p);

 

p.fGain := 15-form2.trackbar10.Position;

p.fBandwidth :=3;

p.fCenter := 10000;

BASS_FXSetParameters(fx[8], @p);

 

p.fGain := 15-form2.trackbar11.Position;

p.fBandwidth := 3;

p.fCenter := 12000;

BASS_FXSetParameters(fx[9], @p);

 

p.fGain := 15-form2.trackbar12.Position;

p.fBandwidth := 3;

p.fCenter := 14000;

BASS_FXSetParameters(fx[10], @p);

 

PAP:='Pause';

bitbtn2.Glyph.LoadFromFile(ExtractFileDir(ParamStr(0))+'\'+'pic\pause.BMP');

LSVGauge7.Enabled:=True;

LSVGauge7.Progress:=0;

LSVGauge7.MaxValue:=Bass_ChannelGetLength(Stream, 0)-1;

 

if not BASS_ChannelPlay(Stream, False) then

begin

ShowMessage('Ошибка! не возможно воспроизвести файл');

RzMarqueeStatus1.Caption:='Ошибка! не возможно воспроизвести файл';

exit;

end;

timer2_Play.Enabled:=true;

timer4_Visual.Enabled:=true;

Timer3_Time.Enabled:=true;

 

RzMarqueeStatus1.Caption:=' ** '+copy(ExtractFileName(StringReplace(ListBox2.Items.Strings[Listbox2.ItemIndex], '&', '&&', [rfReplaceAll, rfIgnoreCase])),0,Length(ExtractFileName(StringReplace(ListBox2.Items.Strings[Listbox2.ItemIndex], '&', '&&', [rfReplaceAll, rfIgnoreCase])))-4)+' :: '+AnsiUpperCase(GetFileFormat(extractfilename(ListBox2.Items.Strings[ListBox2.itemindex])))+' :: '+

IntToStr(trunc((BASS_StreamGetFilePosition(stream, BASS_FILEPOS_END)/(125*BASS_ChannelBytes2Seconds(stream, BASS_ChannelGetLength(stream,BASS_POS_BYTE))))+0.5)) + 'Kbps' +' ** ';

TrackLen:=FormatDateTime('hh:mm:ss',BASS_ChannelBytes2Seconds(stream,Bass_ChannelGetLength(Stream, 0))/ (24 * 3600));

if TrackLen[2]='0' then

Panel7.Caption:=Copy(TrackLen,4,5)

else

Panel7.Caption:=TrackLen;

PAP:='Pause'; //чтобы кнопка плей пауза работала корректно

end;

 

 

procedure TForm1.ListBox1DblClick(Sender: TObject);

begin

if Listbox1.ItemIndex < 0 then Exit;

stop:=False;

ListBox2.ItemIndex:=Listbox1.ItemIndex;

PlayItem;

end;

 

 

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;

Rect: TRect; State: TOwnerDrawState);

begin

with TListBox(Control) do

begin

if index=ListBox2.ItemIndex then

if ListBox2.ItemIndex=ListBox1.ItemIndex then

Canvas.font.Color:=clBlue

else

Canvas.font.Color:=clred

else

Canvas.font.Color:=clblack;

Canvas.FillRect(rect);

Canvas.TextOut(rect.Left,rect.Top,items[index]);

end;

end;

 

 

procedure TForm1.SpeedButton2MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

Var P:TPoint;

begin

P.X:=SpeedButton2.Left;

P.Y:=SpeedButton2.Top;

P:=ClientToScreen(P);

PopupMenu2.Popup(P.X, P.Y+185);

end;

 

 

procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if key=VK_Delete then

Form1.N2Click(self);

end;

 

 

procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if Button=mbright then //для норм выделения трека правой кнопкой

if ListBox1.ItemAtPos(Point(X, Y), True) = -1 then

ListBox1.ItemIndex := -1

else

ListBox1.ItemIndex:=ListBox1.ItemAtPos(Point(X, Y), True);

 

if ListBox1.ItemIndex = -1 then

begin

PopupTrack.Items[0].Enabled:=False;

PopupTrack.Items[1].Enabled:=False;

end

else

begin

PopupTrack.Items[0].Enabled:=True;

PopupTrack.Items[1].Enabled:=True;

end;

 

end;

 

procedure TForm1.ListBox1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

ListBox1.Repaint;

// Клик по пустому месту в ЛистБокс снимает выделение

if ListBox1.ItemAtPos(Point(X, Y), True) = -1 then

ListBox1.ItemIndex := -1;

end;

 

 

procedure TForm1.N1Click(Sender: TObject);

begin

if RzSelDirDialog1.Execute then

FindFile(RzSelDirDialog1.Directory);

end;

 

 

procedure TForm1.N2Click(Sender: TObject);

var b:integer;

begin

b:=ListBox1.ItemIndex;

if (ListBox1.ItemIndex=ListBox2.Items.count-1) then

ListBox1.ItemIndex:=ListBox1.ItemIndex-1

else

if ListBox1.ItemIndex<ListBox2.Items.count-1 then

ListBox1.ItemIndex:=ListBox1.ItemIndex+1;

 

ListBox1.Items.Delete(b);

ListBox2.Items.Delete(b);

end;

 

 

procedure TForm1.N31Click(Sender: TObject);

var i:integer;

begin

OpenDialog1.Filter:='music files|*.mp3;*.wma;*.wav;*.mp4'; //All Audio Files|*.mp3;*.mp4

OpenDialog1.InitialDir:='';

SpeedButton1.Down:=False;

if opendialog1.Execute then

for i := 0 to OpenDialog1.Files.Count-1 do

AddFiles(OpenDialog1.Files[i])

else

exit;

end;

 

 

procedure TForm1.N3Click(Sender: TObject);

begin

ListBox1.Clear;

ListBox2.Clear;

end;

 

 

procedure TForm1.N4Click(Sender: TObject);

begin

{это меню "развернуть" в компоненте PopupMenu }

postMessage(Self.Handle, WM_SysCommand, SC_Restore, 123456); // показываем форму

end;

 

procedure TForm1.N5Click(Sender: TObject);

var path:string;

begin

path:= Form1.ListBox2.Items[ListBox1.ItemIndex]; // ExtractFilePath(

ShellExecute(0, 'open', 'explorer.exe', PChar('/select,' + path), nil, SW_SHOWNORMAL);

end;

 

procedure TForm1.N6Click(Sender: TObject);

begin

ShowPropertiesDialog(Form1.ListBox2.Items[ListBox1.ItemIndex]);

 

end;

 

procedure TForm1.SpeedButton4Click(Sender: TObject);

begin

if SaveDialog1.Execute then

ListBox2.Items.SaveToFile(SaveDialog1.FileName);

end;

 

 

procedure TForm1.SpeedButton3Click(Sender: TObject);

Var

I:Integer;

begin

OpenDialog1.Filter:='Text File|*.txt';

OpenDialog1.InitialDir:=ExtractFileDir(ParamStr(0))+'\';

if OpenDialog1.Execute = false then exit;

ListBox2.Items.LoadFromFile(OpenDialog1.FileName);

ListBox1.Items.LoadFromFile(OpenDialog1.FileName);

For i:=0 to ListBox1.items.Count-1 do

ListBox1.items[i]:=Extractfilename(ListBox1.items[i]);

listBox1.ItemIndex:=0;

end;

 

 

procedure TForm1.Draw(FFTData: TFFTData; X, Y: Integer);

var i, YPos : LongInt; YVal : Single;

begin

//очистка области визуализации

Image1.Canvas.Pen.Color := clBlack;

Image1.Canvas.Brush.Color := RGB(255,127,80);

Image1.Canvas.Rectangle(0, 0, Image1.Width, Image1.Height);

//визуализация

Image1.Canvas.Pen.Color := clRed;

for i := 0 to 86 do //127

begin // количество столбиков

YVal := Abs(FFTData[i]);

YPos := trunc((YVal) * 500);

if YPos > Image1.Height then YPos := Image1.Height;

 

if YPos >= FFTPeacks[i] then FFTPeacks[i] := YPos

else FFTPeacks[i] := FFTPeacks[i] - 1;

 

if YPos >= FFTFallOff[i] then FFTFallOff[i] := YPos

else FFTFallOff[i] := FFTFallOff[i] - 3;

//рисование пика

Image1.Canvas.Pen.Color := clYellow;

Image1.Canvas.MoveTo(X + i*(3+1) , Y + Image1.Height - FFTPeacks[i]);

Image1.Canvas.LineTo(X + i*(3+1) + 3, Y + Image1.Height - FFTPeacks[i]);

//рисование столбика

Image1.Canvas.Pen.Color := clBlue;

Image1.Canvas.Brush.Color := clBlue;

Image1.Canvas.Rectangle(X + i*(3+1) , Y + Image1.Height - FFTFallOff[i], X + i*(3+1) + 3, Y + Image1.Height);

end;

end;

 

 

procedure TForm1.DropFile(var Msg: TWMDropFiles);

Var

CFileName: array [0..MAX_Path] of Char;

numFiles,i, attr:integer;

s : set of Char;

g: string;

begin

s:=['m','p','3','4','w','a','v'];

try

numFiles := DragQueryFile(Msg.Drop, $FFFFFFFF, nil, 0);//узнать кол-во файлов

if numFiles = 0 then Exit;//если 0 файлов

for i := 0 to numFiles - 1 do//кол-во файлов

if DragQueryFile(Msg.Drop, i, CFileName, Max_Path)>0 then//добавить аудио файл

begin

attr:=FileGetAttr(CFileName);//узнать атрибуты

if attr and faDirectory > 0 then//если директория

FindFile( CFileName ) //то через функция файлы добавить

else

begin

g:=ExtractFileExt(CFileName);

if (g[2] in s) and (g[3] in s) and (g[4] in s) then //1)case 2)array+for

begin

AddFiles(CFileName);

Msg.Result:=0;

end;

end;

end;

Finally;

DragFinish(Msg.Drop);

end;

end;

 

 

procedure TForm1.Timer3_TimeTimer(Sender: TObject);

var

TrackLen,TrackPos:string;

Begin

LSVGauge7.progress:=Bass_ChannelGetPosition(Stream, 0);

TrackLen:=FormatDateTime('hh:mm:ss',BASS_ChannelBytes2Seconds(stream,Bass_ChannelGetLength(Stream, 0))/ (24 * 3600));

if BASS_ChannelBytes2Seconds(stream,BASS_ChannelGetPosition(stream,0)) = -1 then //позиция трека(время)

Panel6.Caption:='00:00'

else

begin

if Panel6.BevelWidth=1 then //сколько прошло времени

TrackPos:=FormatDateTime('hh:mm:ss',BASS_ChannelBytes2Seconds(stream,BASS_ChannelGetPosition(stream,0)) / (24 * 3600))

else // BevelWidth=2 //осталось

TrackPos:=FormatDateTime('hh:mm:ss',BASS_ChannelBytes2Seconds(stream,Bass_ChannelGetLength(Stream, 0))/ (24 * 3600) - BASS_ChannelBytes2Seconds(stream,BASS_ChannelGetPosition(stream,0)) / (24 * 3600));

if TrackLen[2]='0' then //если в длина трека меньше часа

begin

Panel6.Caption:=Copy(TrackPos,4,5);

lsvgauge7.text:=Copy(TrackPos,4,5)+'/'+panel7.Caption;

end

else

begin

Panel6.Caption:=TrackPos;

lsvgauge7.text:=TrackPos+'/'+panel7.Caption;

end;

end;

End;

 

 

procedure TForm1.Timer4_VisualTimer(Sender: TObject);

var FFTFata : TFFTData;

begin

if BASS_ChannelIsActive(Stream) = BASS_ACTIVE_PLAYING then

begin

BASS_ChannelGetData(stream, @FFTFata, BASS_DATA_FFT1024);

Draw(FFTFata, 2, -5);

end;

end;

 

 

procedure TForm1.TrackBar1Change(Sender: TObject);

begin

//Bass_SetVolume(TrackBar1.Position/100);

WaveOUtSetVolume(0,MakeLong(TrackBar1.Position*255,TrackBar1.Position*255));

label2.Caption:=IntToStr(Round(TrackBar1.Position/2.55)) + '%'

end;

 

end.

Исходный код Unit_2:

unit Unit2;

 

interface

 

uses

Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,

Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls, bass, Vcl.ExtCtrls, Registry;

 

type

TForm2 = class(TForm)

Label2: TLabel;

Label4: TLabel;

TrackBar111: TTrackBar;

TrackBar3: TTrackBar;

Label1: TLabel;

TrackBar4: TTrackBar;

Label3: TLabel;

TrackBar5: TTrackBar;

Label5: TLabel;

TrackBar6: TTrackBar;

Label6: TLabel;

TrackBar7: TTrackBar;

Label7: TLabel;

TrackBar8: TTrackBar;

Label8: TLabel;

TrackBar9: TTrackBar;

Label9: TLabel;

TrackBar10: TTrackBar;

Label10: TLabel;

TrackBar11: TTrackBar;

Label11: TLabel;

TrackBar12: TTrackBar;

Label12: TLabel;

Label13: TLabel;

Label14: TLabel;

Label15: TLabel;

Button1: TButton;

Shape1: TShape;

Shape2: TShape;

Label16: TLabel;

Label17: TLabel;

Label18: TLabel;

Label19: TLabel;

Label20: TLabel;

Label21: TLabel;

Label22: TLabel;

Label23: TLabel;

Label24: TLabel;

Label25: TLabel;

Label26: TLabel;

Label27: TLabel;

Label28: TLabel;

Label29: TLabel;

Label30: TLabel;

Button2: TButton;

CheckBox1: TCheckBox;

Button3: TButton;

procedure TrackBar111Change(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure TrackBar3Change(Sender: TObject);

procedure TrackBar12Change(Sender: TObject);

procedure TrackBar4Change(Sender: TObject);

procedure TrackBar5Change(Sender: TObject);

procedure TrackBar6Change(Sender: TObject);

procedure TrackBar7Change(Sender: TObject);

procedure TrackBar8Change(Sender: TObject);

procedure TrackBar9Change(Sender: TObject);

procedure TrackBar10Change(Sender: TObject);

procedure TrackBar11Change(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure FormShow(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure CheckBox1Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

 

 

private

{ Private declarations }

public

{ Public declarations }

end;

 

var

Form2: TForm2;

//переменные для настройки эквалайзера

 

implementation

 

uses Unit1;

 

 

{$R *.dfm}

 

function MyTrackBarProc(myWnd : HWND; Msg : UINT;

myWParam : WPARAM; myLParam:LPARAM) : LRESULT; stdcall;

var

DC, hPen, hOldPen, hOldBrush : DWORD;

cxBorder : integer;

rc : TRect;

cr : integer;

begin

result := CallWindowProc(Pointer(GetWindowLong(myWnd,GWL_USERDATA)),

myWnd, Msg, myWParam, myLParam);

if Msg = WM_PAINT then

begin

cxBorder := GetSystemMetrics(SM_CXBORDER);

GetWindowRect(myWnd,rc);

DC := GetWindowDC(myWnd);

cr :=GetSysColor(COLOR_BTNFACE); // rgb(226,234,241)

hPen := CreatePen(PS_INSIDEFRAME, cxBorder, cr);

hOldPen := SelectObject(DC, hPen);

hOldBrush := SelectObject(DC, GetStockObject(NULL_BRUSH));

Rectangle(DC, 0, 0,rc.Right - rc.Left, rc.Bottom - rc.Top);

SelectObject(DC, hOldBrush);

SelectObject(DC, hOldPen);

ReleaseDC(myWnd,DC);

DeleteObject(hPen)

end;

end;

 

procedure TForm2.Button1Click(Sender: TObject);

begin

TrackBar3.Position:=15;

TrackBar4.Position:=15;

TrackBar5.Position:=15;

TrackBar6.Position:=15;

TrackBar7.Position:=15;

TrackBar8.Position:=15;

TrackBar9.Position:=15;

TrackBar10.Position:=15;

TrackBar11.Position:=15;

TrackBar12.Position:=15;

TrackBar111.Position:=0;

end;

 

procedure TForm2.Button2Click(Sender: TObject);

begin

close;

end;

 

 

procedure TForm2.Button3Click(Sender: TObject);

begin

//SaveOldReg('.mp3');

//SaveOldReg('.mp4');

//SaveOldReg('.wma');

//SaveOldReg('.wav');

end;

 

 

procedure TForm2.CheckBox1Click(Sender: TObject);

var reg : TRegistry ;

begin

if CheckBox1.Checked then

begin

// RegFileExt('.mp3','3pmPlayer',':Жопа');

//Registration( 'mp3','3pmPlayer.exe','3pmPlayer',extractfilepath(Application.ExeName)+'3pmPlayer.exe','1');

// Registration( 'mp4','3pmPlayer.exe','3pmPlayer',extractfilepath(Application.ExeName)+'3pmPlayer.exe','1');

// Registration( 'wma','3pmPlayer.exe','3pmPlayer',extractfilepath(Application.ExeName)+'3pmPlayer.exe','1');

// Registration( 'wav','3pmPlayer.exe','3pmPlayer',extractfilepath(Application.ExeName)+'3pmPlayer.exe','1');

end;

end;

 

procedure TForm2.FormCreate(Sender: TObject);

var i:Byte;

handle1:HWND;

begin

//для трекбара

SetWindowLong(TrackBar111.Handle, GWL_USERDATA,

SetWindowLong(TrackBar111.Handle, GWL_WNDPROC, LPARAM(@MyTrackBarProc)));

SetWindowLong(TrackBar3.Handle, GWL_USERDATA,

SetWindowLong(TrackBar3.Handle, GWL_WNDPROC, LPARAM(@MyTrackBarProc)));

SetWindowLong(TrackBar4.Handle, GWL_USERDATA,

SetWindowLong(TrackBar4.Handle, GWL_WNDPROC, LPARAM(@MyTrackBarProc)));

SetWindowLong(TrackBar5.Handle, GWL_USERDATA,

SetWindowLong(TrackBar5.Handle, GWL_WNDPROC, LPARAM(@MyTrackBarProc)));

SetWindowLong(TrackBar6.Handle, GWL_USERDATA,

SetWindowLong(TrackBar6.Handle, GWL_WNDPROC, LPARAM(@MyTrackBarProc)));

SetWindowLong(TrackBar7.Handle, GWL_USERDATA,

SetWindowLong(TrackBar7.Handle, GWL_WNDPROC, LPARAM(@MyTrackBarProc)));

SetWindowLong(TrackBar8.Handle, GWL_USERDATA,

SetWindowLong(TrackBar8.Handle, GWL_WNDPROC, LPARAM(@MyTrackBarProc)));

SetWindowLong(TrackBar9.Handle, GWL_USERDATA,

SetWindowLong(TrackBar9.Handle, GWL_WNDPROC, LPARAM(@MyTrackBarProc)));

SetWindowLong(TrackBar10.Handle, GWL_USERDATA,

SetWindowLong(TrackBar10.Handle, GWL_WNDPROC, LPARAM(@MyTrackBarProc)));

SetWindowLong(TrackBar11.Handle, GWL_USERDATA,

SetWindowLong(TrackBar11.Handle, GWL_WNDPROC, LPARAM(@MyTrackBarProc)));

SetWindowLong(TrackBar12.Handle, GWL_USERDATA,

SetWindowLong(TrackBar12.Handle, GWL_WNDPROC, LPARAM(@MyTrackBarProc)));

 

label2.Caption:=FloatToStr(Trackbar111.Position);

 

//Для трекболаов в экволайзере

label16.Caption:=FloatToStrF(TrackBar3.Position/3*10,ffGeneral,3,0) + '%';

label17.Caption:=FloatToStrF(TrackBar4.Position/3*10,ffGeneral,3,0) + '%';

label18.Caption:=FloatToStrF(TrackBar6.Position/3*10,ffGeneral,3,0) + '%';

label19.Caption:=FloatToStrF(TrackBar5.Position/3*10,ffGeneral,3,0) + '%';

label20.Caption:=FloatToStrF(TrackBar7.Position/3*10,ffGeneral,3,0) + '%';

label21.Caption:=FloatToStrF(TrackBar8.Position/3*10,ffGeneral,3,0) + '%';

label22.Caption:=FloatToStrF(TrackBar9.Position/3*10,ffGeneral,3,0) + '%';

label23.Caption:=FloatToStrF(TrackBar10.Position/3*10,ffGeneral,3,0) + '%';

label24.Caption:=FloatToStrF(TrackBar11.Position/3*10,ffGeneral,3,0) + '%';

label25.Caption:=FloatToStrF(TrackBar12.Position/3*10,ffGeneral,3,0) + '%';

 

Form2.Position:=poDesktopCenter;

end;

 

 

procedure TForm2.FormShow(Sender: TObject);

begin

 

 

{for i := 3 to 12 do //не арбайтен

begin

with findcomponent('TrackBar'+IntToStr(i))as ttrackbar do

handle1:=handle;

SetWindowLong(handle1, GWL_USERDATA,SetWindowLong(handle1, GWL_WNDPROC, LPARAM(@MyTrackBarProc)));

end; }

end;

 

procedure TForm2.TrackBar111Change(Sender: TObject);

begin

BASS_ChannelSetAttribute(form1.Stream,BASS_ATTRIB_PAN, Trackbar111.Position/100);

form2.label2.Caption:=FloatToStr(Trackbar111.Position);

end;

 

procedure TForm2.TrackBar10Change(Sender: TObject);

begin

BASS_FXGetParameters(fx[8], @p);//считываем параметры канала

p.fgain := 15-TrackBar10.position;//задаем усиление в зависимости от позиции TrackBar

BASS_FXSetParameters(fx[8], @p);//устанавливаем измененные параметры

 

label23.Caption:=FloatToStrF(TrackBar10.Position/3*10,ffGeneral,3,0) + '%';//для просмотра результьта трекбола

 

end;

 

procedure TForm2.TrackBar11Change(Sender: TObject);

begin

BASS_FXGetParameters(fx[9], @p);//считываем параметры канала

p.fgain := 15-TrackBar11.position;//задаем усиление в зависимости от позиции TrackBar

BASS_FXSetParameters(fx[9], @p);//устанавливаем измененные параметры

 

label24.Caption:=FloatToStrF(TrackBar11.Position/3*10,ffGeneral,3,0) + '%';//для просмотра результьта трекбола

 

end;

 

procedure TForm2.TrackBar12Change(Sender: TObject);

begin

BASS_FXGetParameters(fx[10], @p);//считываем параметры канала

p.fgain := 15-TrackBar12.position;//задаем усиление в зависимости от позиции TrackBar

BASS_FXSetParameters(fx[10], @p);//устанавливаем измененные параметры

 

label25.Caption:=FloatToStrF(TrackBar12.Position/3*10,ffGeneral,3,0) + '%';//для просмотра результьта трекбола

 

end;

 

procedure TForm2.TrackBar3Change(Sender: TObject);

begin

BASS_FXGetParameters(fx[1], @p);//считываем параметры канала

p.fgain := 15-TrackBar3.position;//задаем усиление в зависимости от позиции TrackBar

BASS_FXSetParameters(fx[1], @p);//устанавливаем измененные параметры

 

label16.Caption:=FloatToStrF(TrackBar3.Position/3*10,ffGeneral,3,0) + '%'; //для просмотра результьта трекбола

 

end;

 

procedure TForm2.TrackBar4Change(Sender: TObject);

begin

BASS_FXGetParameters(fx[2], @p);//считываем параметры канала

p.fgain := 15-TrackBar4.position;//задаем усиление в зависимости от позиции TrackBar

BASS_FXSetParameters(fx[2], @p);//устанавливаем измененные параметры

 

 

label17.Caption:=FloatToStrF(TrackBar4.Position/3*10,ffGeneral,3,0) + '%';//для просмотра результьта трекбола

 

end;

 

procedure TForm2.TrackBar5Change(Sender: TObject);

begin

BASS_FXGetParameters(fx[3], @p);//считываем параметры канала

p.fgain := 15-TrackBar5.position;//задаем усиление в зависимости от позиции TrackBar

BASS_FXSetParameters(fx[3], @p);//устанавливаем измененные параметры

 

 

label19.Caption:=FloatToStrF(TrackBar5.Position/3*10,ffGeneral,3,0) + '%';//для просмотра результьта трекбола

 

end;

 

procedure TForm2.TrackBar6Change(Sender: TObject);

begin

BASS_FXGetParameters(fx[4], @p);//считываем параметры канала

p.fgain := 15-TrackBar6.position;//задаем усиление в зависимости от позиции TrackBar

BASS_FXSetParameters(fx[4], @p);//устанавливаем измененные параметры

 

label18.Caption:=FloatToStrF(TrackBar6.Position/3*10,ffGeneral,3,0) + '%';//для просмотра результьта трекбола

 

end;

 

procedure TForm2.TrackBar7Change(Sender: TObject);

begin

BASS_FXGetParameters(fx[5], @p);//считываем параметры канала

p.fgain := 15-TrackBar7.position;//задаем усиление в зависимости от позиции TrackBar

BASS_FXSetParameters(fx[5], @p);//устанавливаем измененные параметры

 

label20.Caption:=FloatToStrF(TrackBar7.Position/3*10,ffGeneral,3,0) + '%';//для просмотра результьта трекбола

 

end;

 

procedure TForm2.TrackBar8Change(Sender: TObject);

begin

BASS_FXGetParameters(fx[6], @p);//считываем параметры канала

p.fgain := 15-TrackBar8.position;//задаем усиление в зависимости от позиции TrackBar

BASS_FXSetParameters(fx[6], @p);//устанавливаем измененные параметры

 

label21.Caption:=FloatToStrF(TrackBar8.Position/3*10,ffGeneral,3,0) + '%';//для просмотра результьта трекбола

 

end;

 

procedure TForm2.TrackBar9Change(Sender: TObject);

begin

BASS_FXGetParameters(fx[7], @p);//считываем параметры канала

p.fgain := 15-TrackBar9.position;//задаем усиление в зависимости от позиции TrackBar

BASS_FXSetParameters(fx[7], @p);//устанавливаем измененные параметры

 

label22.Caption:=FloatToStrF(TrackBar9.Position/3*10,ffGeneral,3,0) + '%';//для просмотра результьта трекбола

 

end;

 

end.


ТЕСТИРОВАНИЕ АУДИО ПЛЕЕРА

Основной задачей тестирования ПП является получение информации о статусе готовности заявленной функциональности системы или приложения.

С точки зрения ISO 9126, качество программного обеспечения можно определить как совокупную характеристику исследуемого ПО с учётом следующих составляющих:

1. Надёжность

2. Сопровождаемость

3. Практичность

4. Эффективность

5. Мобильность

6. Функциональность

Системное тестирование сайта:

1. Полное соответствие аудио плеера с требованиями ТЗ;

2. Проверка на работоспособность отдельных элементов аудио плеера (кнопок, поля с текстом, надписи, кнопки, рисунка и др.), путем тестирования "Белого ящика", с получением положительных результатов;

3. При проверки программного кода на наличие ошибок не было обнаружено таковых.

4. Запуск аудио плеера на различных ПК с установленными ОС семейства Windows XP, 7 и 8. Тестирование дало положительный результат в работе системы;

5. Проведение оценки интерфейса, путем независимых пользователей моей группы, которым была предложена финальная версия с полностью работоспособным функционалом;

6. Тестирование безопасности;

7. Создание резервных копий на различных носителях электронной информации (HDD, CD/DVD, Blu-Ray, USB-накопитель).

РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ «АУДИО ПЛЕЕР "3PMPLAYER"»

Данное программное обеспечение предоставляет пользователю спектр возможностей по работе с «Аудио плеер "3pmPlayer"» - воспроизведение аудио файлов, подстройка частот воспроизводимого трека, красивая визуализация.

Программная оболочка имеет активные кнопки быстрого перехода между формами;

Также аудио плеер создаёт отдельным файлом (любого Формата "*.*") сохраненных треков в плейлисте, в которой содержится информация о треках которые были загружено в плейлист, который можно перенести на какой-нибудь носитель информации (Будь то USB-накопитель или бумажный лист, при наличии принтера).

Пользование аудио плеером может осуществляться как специалистом в области компьютерной техники, так и рядовым пользователем, имеющим базовые навыки владения ПК.

ЗАКЛЮЧЕНИЕ

В результате выполнения курсовой работы мной был создан программный продукт («Аудио плеер "3pmPlayer"») и сопровождающая его документация.

Итогом работы стало выполнение следующих поставленных задач:

ü ознакомление с принципами создания работы с библиотекой Bass.dll;

ü ознакомление с принципами создания работы с медиа-плеером;

ü ознакомление с принципом создания программного обеспечения при помощи языка программирования DELPHI.

ü ознакомление с принципами разработки программной документации к программному обеспечения и аудио плеерам в целом;

ü построение моделей будущего программного средства;

ü подробное описание компонентов аудио плеера и программной оболочки в процессе разработки прототипа;

ü окончательная разработка аудио плеера и программной оболочки, а также соответствующей документации.

«Аудио плеер "3pmPlayer"» прошла ряд тестов на работоспособность и поступила в эксплуатацию согласно срокам оговоренных в техническом задание.

Данный программный продукт оказался незаменимым помощником в организации «Колледж», решив ряд проблем, такие как хранение и обработка большого количества загруженных аудио файлов.

Простой и понятный интерфейс пользователя облегчил работу сотрудникам, повысив тем самым общую производительность

Разработанная документация, а также руководство пользователя облегчили работу персонала.

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

1. Сайт ://ru.wikipedia.org/wiki/

2. Сайт ://programmersclub.ru/help/

3. Сайт: ://cyberforum.ru/delphi/

4. Гражданский кодекс РФ от 30.11.1994 N-51 ФЗ;

5. Государственный стандарт Российской Федерации от 20 декабря 1993 г. № 260 (ГОСТ Р ИСО/МЭК ТО 9294-93);

6. Васильев Д.В. «Делопроизводство на компьютере», Москва: Приор, 1998;