Цена разработки, порядок контроля и приемки
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;