Универсальный проигрыватель WinMedia

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 03.12.2010
Размер файла 496,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

  • Содержание
  • Введение.
  • 1 Разработка системного проекта.
    • 1.1 Назначение разработки.
    • 1.2 Требования к функциональным характеристикам.
    • 1.3 Требования к надежности и безопасности.
    • 1.4 Требования к составу и параметрам технических средств.
    • 1.5 Требования к информационной и программной совместимости.
  • 2 Разработка технического проекта.
    • 2.1 Построение диаграммы потоков данных.
    • 2.2 Проектирование модели данных.
    • 2.3 Детальное проектирование программного обеспечения.
  • 3 Реализация.
    • 3.1 Обоснование выбора средств разработки.
    • 3.2 Описание основных программных модулей.
  • 4 Тестирование программного продукта.
  • Заключение.
  • Приложение А
  • Приложение Б.
  • Библиография.6
  • Введение
  • На сегодняшний день деятельность людей всё в большей степени зависит от их информированности, способности эффективно использовать информацию. Наступило время, когда профессионал - юрист, инженер, экономист, социолог, журналист - уже с трудом справляются с потоком информации. Специалисту, чтобы на должном уровне выполнять свои обязанности, необходимы инструментарии и методология его применения для обработки информации. Это сравнимо с использованием средств передвижения: человек может пешком преодолевать любое расстояние, но современный темп жизни просто немыслим без применения автомобиля, поезда, самолёта и т.д. То же самое происходит в области информации: теоретически человек может сам переработать без компьютера любую информацию, но сделает это эффективнее с использованием специальных компьютерных технологий.
  • Развитие эффективных способов воспроизведения музыкальной информации(без потери качества) тоже не стояло на месте: появившиеся виниловые пластинки были вскоре заменены на магнитные кассеты, последние в свою очередь быстро сменились оптическими дисками. Все это никак несмогло обойти персональный компьютер. Существует множество форматов хранения музыки и видео(mp3,wav,avi самые популярные из них). В данном курсовом проекте создается программа Универсальный проигрыватель Win media для воспроизведения аудио-, видео-форматов на компьютере.
  • 1 Разработка системного проекта
  • 1.1 Назначение разработки

Универсальный проигрыватель Win media позволяет воспроизвести аудио-, видео-форматы, вести мультимедиа библиотеку, сохранять плейлисты. Проигрыватель обладает интуитивно понятным интерфейсом и прост в эксплуатации.

На рисунке 1 Программа представлена виде начальной контекстной диаграммы потоков данных:

Рисунок 1 - Диаграмма потоков данных

1.2 Требования к функциональным характеристикам

Универсальный проигрыватель Win media должен воспроизводить популярные мультимедиа форматы (wav, mp3, mpg, wma, avi, mpeg).

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

1.3 Требования к надежности

Универсальный проигрыватель Win media должен корректно воспроизводить мультимедиа файлы и бесперебойно работать на протяжении всего сеанса работы(воспроизведение мультимедиа файла)

1.4 Требования к составу и параметрам технических средств

Для нормального функционирования Универсальный проигрыватель Win media необходима следующая минимальная конфигурация ПК:

- частота процессора: 800 Мгц

- объем оперативной памяти: 64 мб

- необходимый объем свободного дискового пространства: 10 мб и размер базы данных.

- разрешение монитора: 800x600

- наличие CD-ROM или FDD.

1.5 Требования к информационной и программной совместимости

Данная программа предназначена для работы в следующих операционных системах: Windows 98 SE/2000/XP.

2. Разработка технического проекта

2.1 Построение диаграммы потоков данных

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

Основные элементы диаграммы потоков данных:

- Внешняя сущность - представляющая собой материальный предмет или физическое лицо, который является источником или приемником данных. Определение некоторого объекта в качестве внешней сущности указывает на то, что она находится за пределами границ анализируемой ИС.

- Система и подсистема. При построении модели сложной ИС она может быть представлена в самом общем виде на так называемой контекстной диаграмме в виде одной системы как единого целого, либо может быть декомпозирована на ряд подсистем.

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

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

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

Внешними сущностями в Универсальном проигрывателе Win media являются медиа файл, пользователь и сам плеер.

Задачей пользователя является: указание мультимедиа файла (процесс 1.2), занесение фалов в мультимедиа библиотеку(процесс 1.3).

Задачей плеера является открытие мультимедиа файла(процесс 1.5) и его воспроизведение (процесс 1.10).

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

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

Впоследствии файлы из базы данных можно добавить в текущий плейлист.

Диаграмма потоков данных изображена на рисунке 2.

2.2 Проектирование модели данных

На основании диаграммы потоков данных строится концептуальная модель данных. В ней отображается подробное описание структуры данных, связи между объектами данных, структура этих связей.

Структура модели данных универсального проигрывателя Win media:

Таблица “библиотека мультимедиа файлов” - содержит информацию о добавленных в библиотеку мультимедиа файлах

Поле “Код” - уникальный идентификатор записи таблицы (ключевое поле)

Поля “ Название композиции”, “Исполнитель”, “Альбом” - имеют строковый тип и используются для хранения Названия композиции, Исполнителя и альбома мультимедиа файла.

Поле “Жанр” имеет целочисленный тип и используется для хранения кода жанра к которому принадлежит композиция.

Таблица “Жанры” - содержит перечень жанров.

Поле “Код” - уникальный идентификатор каждой записи таблицы (ключевое поле)

Поле “Жанр” - имеет строковый тип и содержит наименование жанра.

Модель данных универсального проигрывателя Win media изображена на рисунке 3.

2.3 Детальное проектирование программного обеспечения

Программа состоит из нескольких основных окон: Главного окна (в которой производится воспроизведение аудио файлов) и Видео окна (в которой производится воспроизведение видео фалов).

На рисунке 4 представлена главная форма программы для воспроизведения аудио файлов

Рисунок 4 - Форма приложения для воспроизведения аудио файлов.

На рисунке 5 представлена форма программы для воспроизведения видео файлов

Рисунок 5 - Форма приложения для воспроизведения видео файлов.

На рисунке 6 представлена диаграмма последовательностей экранных форм.

Символом 1 обозначено действие по вызову главной формы.

Символом 2 обозначено действие по вызову файла справочной системы, для получения какой-либо справочной информации по программе.

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

Символом 4. действие по завершению работы программы

На рисунке 7 представлена форма программы для редактирования/создания/сохранения плейлистов.

Рисунок 7 - Форма приложения для редактирования/создания/сохранения плейлистов.

На рисунке 8 представлена форма программы для изменение настроек проигрывателя.

Рисунок 8 - форма программы для изменение настроек проигрывателя.

3. Реализация

3.1 Обоснование выбора средств разработки

Для написания курсового проекта, я выбрал систему программирования Delphi 7.0.

Delphi - объектно-ориентированная, визуальная среда программирования, относящаяся к классу RAD - (Rapid Application Development _ «Средство быстрой разработки приложений») средств CASE - технологии. Delphi сделала разработку мощных приложений быстрым процессом.

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

Отличительной особенностью Delphi является богатая библиотека визуальных компонентов (VCL). Эта библиотека объектов включает в себя стандартные объекты построения пользовательского интерфейса, объекты управления данными, графические объекты, объекты мультимедиа, диалоги и объекты управления файлами.

Еще Delphi позволяет добавить различные сторонние компоненты созданные сторонними разработчиками. В данной программе использовался компонент MMTOOL версии 7.0. Этот компонент позволяет облегчить создание программы для работы со звуком/видео.

Так же плюсом в пользу использования Delphi является удобный отладчик, который позволяет анализировать работу программы во время ее исполнения. С его помощью можно последовательно выполнять отдельные операторы исходного текста последовательно, наблюдая при этом, как меняются значения различных переменных.

3.2 Описание основных программных модулей

На рисунке 9 представлен алгоритм открытие файла

Символом 1 обозначено начало процедуры.

Символом 2 обозначены операторы открытия файла.

Символом 3 обозначен оператор условия принадлежности мультимедиа файла к видео файлу.

Символом 4 обозначен оператор воспроизведения файла в главной форме при значении «нет» в цикле под номером 3.

Символом 5 обозначен оператор открытия файла в специальной форме для видео файлов при значении «да» в цикле под номером 3.

Символом 5 обозначен оператор выхода из программы

На рисунке 10 представлен алгоритм занесения файла в библиотеку

Символом 1 обозначено начало процедуры.

Символом 2 обозначен открытие файла

Символом 3 обозначен цикл с предусловием выдающий запрос записывать ли файл в базу данных.

Символом 4 обозначен оператор, читающий информацию о файле.

Символом 5 обозначен условный оператор, заносящий полученную информацию в библиотеку.

Символом 6 обозначен оператор выхода из процедуры.

4 Тестирование программного продукта

Целью проведения тестирования является проверка правильности работы универсального проигрывателя Win Media.

Тестирование программы проводилось по мере написания ее модулей в процессе отладки, при стыковке написанных модулей и после окончания написания программы.

Тестирование программы осуществлялось на следующей аппаратной платформе:

Процессор: 2 Ггц

Объем оперативной памяти 512 Мб

Размер свободного дискового пространства 500 Мб

Для тестирования программы использовались операционные системы:

Windows XP SP2.

Тестирование программы проводилось в следующем порядке:

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

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

3. Проверка работы программы с граничными значениями. Для этого при работе программы вводились граничные данные, на что в ответ от программы были получены сообщения о некорректности введенных данных и просьбе ввести их заново.

4. Определение времени выполнения программой расчетов. При этом тестировались наиболее ресурсоемкие задачи - непосредственное проведение тестирования и построение отчетов. При этом программа показала хорошие показатели.

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

6. Проверка работы всех пунктов меню и вызова всех экранных форм. При этом были проверены пункты меню на соответствие функций выполняемых ими их описанию.

7. Проверка работы программы на компьютерах различной конфигурации. Помимо указанной выше тестовой конфигурации программа была протестирована на следующей платформе:

- Процессор: 1200 Мгц

- Объем оперативной памяти 256 Мб

- Размер свободного дискового пространства 300 Мб

- Для тестирования программы использовалась операционная система: Windows 2000.

Заключение

На курсовое проектирование мне была предложена задача: создание Универсального проигрывателя win media

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

Универсальный проигрыватель win media позволяет:

- Воспроизводить мультимедиа файлы различных форматов.

- Создавать плейлисты.

- Вести базу данных мультимедиа файлов.

Приложение А (обязательное)

Листинг программы.

Программа RadLe

unit UMain;

interface

uses

Windows,

Messages,

ShellAPI,

SysUtils,

Classes,

Graphics,

Controls,

Forms,

Dialogs,

Buttons,

ComCtrls,

StdCtrls,

ExtCtrls,

Menus,

MMSystem,

MMUtils,

MMAbout,

MMObj,

MMDSPObj,

MMWaveIO,

MMMPType,

MMMPEG,

MMDesign,

MMWavOut,

MMDIBCv,

MMLevel,

MMConect,

MMSpectr,

MMHTimer,

MMSlider,

MMLEDS,

MMPanel,

MMSpin,

MMLEDLbl,

MMButton,

MMWave,

MMLabel,

MMVolume,

MMHook, MMPitch, MMAudio, MMWheel, MMAVI;

type

TMainForm = class(TForm)

OpenDialog: TOpenDialog;

WaveOut: TMMWaveOut;

MMDesigner1: TMMDesigner;

MMConnector1: TMMConnector;

HiTimer: TMMHiTimer;

MMPanel2: TMMPanel;

ButtonPanel: TMMPanel;

DisplayPanel: TMMPanel;

MMPanel7: TMMPanel;

MMLevelScale1: TMMLevelScale;

digit: TMMLEDDigit;

MMLevel2: TMMLevel;

MMLevel1: TMMLevel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

MMSpectrum1: TMMSpectrum;

ss1: TMMLEDDigit;

ss2: TMMLEDDigit;

mm1: TMMLEDDigit;

mm2: TMMLEDDigit;

btnStop: TMMSpeedButton;

btnPlay: TMMSpeedButton;

btnPause: TMMSpeedButton;

btnOpen: TMMSpeedButton;

btnPrev: TMMSpeedButton;

btnSkipL: TMMSpeedButton;

btnSkipR: TMMSpeedButton;

btnNext: TMMSpeedButton;

btnClose: TMMSpeedButton;

btnMenu: TMMSpeedButton;

btnIncVolume: TMMSpeedButton;

btnDecVolume: TMMSpeedButton;

Bevel1: TBevel;

btnPlayList: TMMSpeedButton;

Gauge: TMMLevel;

Bevel2: TBevel;

ledMode: TMMLEDMode;

ledRate: TMMLEDPanel;

Label18: TLabel;

lblBitRate: TLabel;

ledBitRate: TMMLEDPanel;

lblLayer: TLabel;

lblLayer2: TLabel;

lblFile: TMMLEDLABEL;

PopupMenu: TPopupMenu;

Preferences1: TMenuItem;

N1: TMenuItem;

Play1: TMenuItem;

Stop1: TMenuItem;

Pause1: TMenuItem;

N2: TMenuItem;

Previous1: TMenuItem;

Next1: TMenuItem;

N3: TMenuItem;

PlayList1: TMenuItem;

WaveFile: TMMWaveFile;

N4: TMenuItem;

Info1: TMenuItem;

ImageEOF: TImage;

ImageState: TImage;

MPEGFile: TMMMPEGFile;

SpeedButton1: TSpeedButton;

N5: TMenuItem;

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure HiTimerTimer(Sender: TObject);

procedure WaveOutStop(Sender: TObject);

procedure btnCloseClick(Sender: TObject);

procedure btnOpenClick(Sender: TObject);

procedure btnStopClick(Sender: TObject);

procedure btnPauseClick(Sender: TObject);

procedure btnPlayClick(Sender: TObject);

procedure btnPrevClick(Sender: TObject);

procedure btnSkipLClick(Sender: TObject);

procedure btnSkipRClick(Sender: TObject);

procedure btnNextClick(Sender: TObject);

procedure btnDecVolumeClick(Sender: TObject);

procedure btnIncVolumeClick(Sender: TObject);

procedure btnPlayListClick(Sender: TObject);

procedure WaveOutStart(Sender: TObject);

procedure MMPanelMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

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

procedure MMPanelMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure GaugeMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

Приложение А (продолжение)

procedure FormCreate(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure btnMenuClick(Sender: TObject);

procedure PopupMenuPopup(Sender: TObject);

procedure PreferencesClick(Sender: TObject);

procedure Info1Click(Sender: TObject);

procedure FormShow(Sender: TObject);

procedure WaveOutPause(Sender: TObject);

procedure WaveOutRestart(Sender: TObject);

procedure SpeedButton1Click(Sender: TObject);

procedure N5Click(Sender: TObject);

public

oMin, oSec: Word;

Dragging: Boolean;

DragStart: TPoint;

Seeking: Boolean;

OldTime,CurTime: Longint;

PlayListName: TFileName;

PlayList : TStringList;

PlayIndex: integer;

IncPlayList: Boolean;

DisplayColor: TColor;

TimeCnt : Longint;

procedure LoadImage(Image: TImage; Name: PChar);

procedure DrawTime(Time: Longint);

procedure SetFileParams;

function LoadFile(FileName: TFileName): Boolean;

function AddFile(FileName: TFileName): Boolean;

procedure SelectFile(index: integer);

procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHitTest;

procedure WMDropFiles(var Msg: TMessage); message WM_DropFiles;

procedure LoadSettings;

procedure SaveSettings;

procedure DrawLevelBar(Sender: TObject; DIB: TMMDIBCanvas; Rect: TRect; nSpots,Peak: integer);

end;

var

MainForm: TMainForm;

implementation

{$R *.DFM}

{$R IMAGE.RES}

uses upref,ulist, UMe, UVideo;

const

REGBASENAME = 'Software\SwiftSoft\MPEGPlay';

procedure TMainForm.WMNCHitTest(var Msg: TWMNCHitTest);

begin

inherited; { is the click in the client area? }

if (Msg.Result = htClient) then { if so, make Windows think it's }

Msg.Result := htCaption; { on the caption bar. }

end;

procedure TMainForm.LoadImage(Image: TImage; Name: PChar);

begin

with Image.Picture do

begin

{ load the bitmap }

Bitmap.Handle := LoadBitmap(hInstance,Name);

Приложение А (продолжение)

{ change the black/white resource to a colored bitmap }

ChangeColors(Bitmap,False,DisplayColor,clBlack,clBlack);

end;

end;

procedure TMainForm.LoadSettings;

var

L,T: integer;

begin

try

L := (Screen.Width-Width) div 2;

T := (Screen.Height-Height) div 2;

Left := GetFromRegistry(HKEY_CURRENT_USER, REGBASENAME, 'Left', L);

Top := GetFromRegistry(HKEY_CURRENT_USER, REGBASENAME, 'Top', T);

WaveOut.NumBuffers := GetFromRegistry(HKEY_CURRENT_USER, REGBASENAME, 'Buffers', WaveOut.NumBuffers);

WaveOut.BufferSize := GetFromRegistry(HKEY_CURRENT_USER, REGBASENAME, 'BufferSize', WaveOut.BufferSize);

WaveOut.DeviceID := GetFromRegistry(HKEY_CURRENT_USER, REGBASENAME, 'DeviceID', WaveOut.DeviceID);

WaveOut.CallBackMode := GetFromRegistry(HKEY_CURRENT_USER, REGBASENAME, 'CBMode', WaveOut.CallBackMode);

except

end;

end;

procedure TMainForm.SaveSettings;

begin

SaveInRegistry(HKEY_CURRENT_USER, REGBASENAME, 'Left', Left);

SaveInRegistry(HKEY_CURRENT_USER, REGBASENAME, 'Top', Top);

SaveInRegistry(HKEY_CURRENT_USER, REGBASENAME, 'Buffers', WaveOut.NumBuffers);

SaveInRegistry(HKEY_CURRENT_USER, REGBASENAME, 'BufferSize', WaveOut.BufferSize);

SaveInRegistry(HKEY_CURRENT_USER, REGBASENAME, 'DeviceID', WaveOut.DeviceID);

SaveInRegistry(HKEY_CURRENT_USER, REGBASENAME, 'CBMode', WaveOut.CallBackMode);

end;

procedure TMainForm.FormCreate(Sender: TObject);

begin

MMLevel1.DIBCanvas.BackGroundBitmap.LoadFromResourceName(hInstance,'BM_BAR1');

MMLevel2.DIBCanvas.BackGroundBitmap.LoadFromResourceName(hInstance,'BM_BAR1');

MMSpectrum1.DIBCanvas.BackGroundBitmap.LoadFromResourceName(hInstance,'BM_BAR2');

MMLevel1.DIBCanvas.PaletteRealize := True;

MMLevel2.DIBCanvas.PaletteRealize := True;

MMSpectrum1.DIBCanvas.PaletteRealize := True;

DragAcceptFiles(Handle,True);

PlayListName := 'noname.m3u';

PlayList := TStringList.Create;

PlayIndex := 0;

DisplayColor := clLime;

LoadImage(ImageEOF,'BM_EOF');

LoadImage(ImageState,'BM_PLAY');

LoadSettings;

MMLevel1.OnDrawBar := DrawLevelBar;

MMLevel2.OnDrawBar := DrawLevelBar;

MMSpectrum1.OnDrawBar := DrawLevelBar;

end;

procedure TMainForm.FormDestroy(Sender: TObject);

begin

PlayList.Free;

end;

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);

begin

IncPlayList := False;

WaveOut.Close;

Приложение А (продолжение)

SaveSettings;

end;

procedure TMainForm.FormShow(Sender: TObject);

begin

if (ParamStr(1) <> '') then

if LoadFile(ParamStr(1)) then

begin

btnPlayClick(nil);

end

else MessageDlg(ParamStr(1)+' is not a valid Audiofile',mtError, [mbOK],0);

end;

procedure TMainForm.WMDropFiles(var Msg: TMessage);

var

i,cnt: integer;

Buf: array[0..255]of Char;

begin

try

cnt := DragQueryFile(Msg.wParam,$FFFFFFFF,@Buf,255);

if (cnt > 0) then

begin

IncPlayList := False;

WaveOut.Stop;

PlayList.Clear;

for i := 0 to cnt-1 do

begin

DragQueryFile(Msg.wParam,i,@Buf,255);

if not AddFile(StrPas(Buf)) then

MessageDlg(StrPas(Buf)+' is not a valid Audiofile',mtError, [mbOK],0);

end;

PlayIndex := 0;

SelectFile(0);

if (PlayList.Count > 0) then btnPlayClick(nil);

end;

finally

DragFinish(Msg.wParam);

end;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.DrawTime(Time: Longint);

Var

Hour, Min, Sec, MSec: Word;

begin

{ Display the "Time" }

TimeDecode(Time, Hour, Min, Sec, MSec);

if (oSec <> Sec) then

begin

ss1.Value := Sec;

oSec := Sec;

end;

if (oMin <> Min) then

begin

mm1.Value := Min;

oMin := Min;

end;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.SetFileParams;

begin

Приложение А (продолжение)

if not MpegFile.Empty then

with MpegFile do

begin

ss1.Enabled := True;

ss2.Enabled := True;

mm1.Enabled := True;

mm2.Enabled := True;

digit.Enabled:= True;

lblFile.Caption := IntToStr(PlayIndex+1)+':'+UpperCase(ExtractFileName(Filename));

ledRate.Value := PlaybackRate div 1000;

ledRate.Enabled := True;

lblLayer.Visible := True;

lblLayer2.Visible := True;

case Layer of

1: lblLayer2.Caption := 'I';

2: lblLayer2.Caption := 'II';

3: lblLayer2.Caption := 'III';

end;

if (Mode = smJointStereo) or (Mode = smStereo) then

ledMode.Mode := mStereo

else

ledMode.Mode := mMono;

ledMode.Enabled := True;

ledBitRate.Value := BitRate;

ledBitRate.Enabled := True;

lblBitRate.Caption := 'KBit/s';

end

else if not WaveFile.Wave.Empty then

with WaveFile.Wave do

begin

ss1.Enabled := True;

ss2.Enabled := True;

mm1.Enabled := True;

mm2.Enabled := True;

digit.Enabled:= True;

lblFile.Caption := IntToStr(PlayIndex+1)+':'+UpperCase(ExtractFileName(Filename));

ledRate.Value := SampleRate div 1000;

ledRate.Enabled := True;

lblLayer.Visible := False;

lblLayer2.Visible := False;

ledMode.Mode := Mode;

ledMode.Enabled := True;

ledBitRate.Value := BitLength;

ledBitRate.Enabled := True;

lblBitRate.Caption := 'Bit';

end

else

begin

ss1.Enabled := False;

ss2.Enabled := False;

mm1.Enabled := False;

mm2.Enabled := False;

digit.Enabled:= False;

lblFile.Caption := 'Нет Файла';

ledRate.Enabled := False;

lblLayer.Visible := False;

lblLayer2.Visible := False;

ledMode.Enabled := False;

ledBitRate.Enabled:= False;

end;

Приложение А (продолжение)

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.HiTimerTimer(Sender: TObject);

var

Time: Longint;

begin

MMConnector1.Trigger;

inc(TimeCnt);

if (TimeCnt mod 5 = 0) and (wosPlay in Waveout.State) and not Seeking then

begin

Time := WaveOut.Position;

inc(CurTime,Time-OldTime);

DrawTime(CurTime);

OldTime := Time;

if not MpegFile.Empty then

begin

Gauge.Value := MulDiv(MpegFile.Position, 100, MpegFile.Frames);

ImageEOF.Visible := MpegFile.Position >= MpegFile.Frames;

end

else

begin

Gauge.Value := MulDiv(WaveFile.Wave.Position, 100, WaveFile.Wave.DataSize);

ImageEOF.Visible := WaveFile.Wave.Position >= WaveFile.Wave.DataSize;

end;

end;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.WaveOutStart(Sender: TObject);

begin

TimeCnt := 0;

HiTimer.Enabled := True;

LoadImage(ImageState,'BM_PLAY');

ImageState.Visible := True;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.WaveOutStop(Sender: TObject);

begin

HiTimer.Enabled := False;

WaveOut.Close;

Seeking := False;

DrawTime(0);

Gauge.Value := 0;

ImageEOF.Visible := False;

ImageState.Visible := False;

if IncPlayList then

begin

if (PlayIndex < PlayList.Count-1) then

begin

inc(PlayIndex);

SelectFile(PlayIndex);

WaveOut.Start;

end

else

begin

PlayIndex := 0;

SelectFile(PlayIndex);

end;

end;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.WaveOutPause(Sender: TObject);

Приложение А (продолжение)

begin

LoadImage(ImageState,'BM_PAUSE');

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.WaveOutRestart(Sender: TObject);

begin

LoadImage(ImageState,'BM_PLAY');

end;

{-- TMainForm -----------------------------------------------------------}

function TMainForm.LoadFile(FileName: TFileName): Boolean;

begin

Result := False;

if (FileName <> '') and FileExists(FileName) then

begin

PlayIndex := 0;

PlayList.Clear;

MpegFile.FileName := '';

WaveFile.Wave.FileName := '';

if IsMpegFile(FileName) or wioIsWaveFile(FileName, RIFF_FILE) then

begin

PlayListName := 'noname.m3u';

PlayList.Add(FileName);

end

else

begin

PlayListName := FileName;

LoadPlayList(FileName,PlayList);

end;

Result := (PlayList.Count > 0);

SelectFile(0);

end;

caption := filename;

end;

{-- TMainForm -----------------------------------------------------------}

function TMainForm.AddFile(FileName: TFileName): Boolean;

begin

Result := False;

if (FileName <> '') and FileExists(FileName) then

begin

if IsMpegFile(FileName) or wioIsWaveFile(FileName, RIFF_FILE) then

begin

PlayList.Add(FileName);

Result := True;

end

else

begin

Result := LoadPlayList(FileName,PlayList);

end;

end;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.SelectFile(index: integer);

var

FileName: TFileName;

begin

MpegFile.FileName := '';

WaveFile.Wave.FileName := '';

if (index >= 0) and (index < PlayList.Count) then

begin

FileName := PlayList[index];

Приложение А (продолжение)

if (FileName <> '') and FileExists(FileName) then

begin

if IsMpegFile(FileName) then

begin

MpegFile.FileName := FileName;

WaveOut.Input := MpegFile;

end

else if wioIsWaveFile(FileName, RIFF_FILE) then

begin

WaveFile.Wave.FileName := FileName;

WaveOut.Input := WaveFile;

end

end;

CurTime := 0;

OldTime := 0;

end;

SetFileParams;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.PopupMenuPopup(Sender: TObject);

begin

{ adjust menu entrys }

PopupMenu.Items[6].Enabled := PlayList.Count > 1;

PopupMenu.Items[7].Enabled := PlayList.Count > 1;

if (wosPlay in WaveOut.State) then

begin

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

PopupMenu.Items[2].Caption := '&Рестарт';

PopupMenu.Items[3].Enabled := True;

PopupMenu.Items[4].Enabled := True;

end

else

begin

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

PopupMenu.Items[2].Caption := '&Воспроизвести';

PopupMenu.Items[3].Enabled := False;

PopupMenu.Items[4].Enabled := False;

end;

if (wosPause in WaveOut.State) then

PopupMenu.Items[3].Caption := '&Пауза'

else

PopupMenu.Items[3].Caption := '&Пауза';

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.PreferencesClick(Sender: TObject);

begin

with TPreferencesForm.Create(Self) do

try

ShowModal;

finally

Free;

end;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.btnOpenClick(Sender: TObject);

var

Idx: WORD;

begin

if (OpenDialog.Execute) and (opendialog.FileName = '*.avi') then

begin

Video.Show;

Video.Visible:=true;

mainform.Visible:=false;

if video.AVIOpenDialog.Execute then

Приложение А (продолжение)

begin

video.AVIFile.FileName := opendialog.FileName;

video.Caption := ExtractFileName(opendialog.FileName);

video.AVIFile.OpenFile;

video.AVIControl.FreeStreams;

video.AVIControl.AddFile(video.AVIFile);

video.AVIDisplay.Refresh;

video.Icon.Handle := ExtractassociatedIcon(0,PChar(opendialog.FileName),Idx);

end;

end

else

if OpenDialog.Execute then

begin

IncPlayList := False;

WaveOut.Stop;

if not LoadFile(OpenDialog.FileName) then

MessageDlg('Итс файл из нот карренли',mtWarning, [mbOK],0);

SetFileParams;

end;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.btnCloseClick(Sender: TObject);

begin

if (MessageDlg('ВЫ дестительно хотите выйте из программы??', mtConfirmation, [mbYes, mbNo], 0) = mrYes) then

Close;

end;

procedure TMainForm.btnMenuClick(Sender: TObject);

var

P: TPoint;

begin

P := ButtonPanel.ClientToScreen(Point(btnMenu.Left,btnMenu.Top+btnMenu.Height));

PopupMenu.Popup(P.X,P.Y);

end;

procedure TMainForm.btnPlayClick(Sender: TObject);

begin

if (PlayList.Count = 0) then

begin

btnOpenClick(nil);

Refresh;

end;

IncPlayList := False;

if (PlayList.Count > 0) then

begin

if not (wosPlay in WaveOut.State) then

begin

SelectFile(PlayIndex);

WaveOut.Start;

end

else if (wosPause in WaveOut.State) then

WaveOut.Restart

else

begin

WaveOut.Stop;

WaveOut.Start;

end;

end;

Приложение А (продолжение)

IncPlayList := True;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.btnPauseClick(Sender: TObject);

begin

if (wosPlay in WaveOut.State) then

begin

if (wosPause in WaveOut.State) then

WaveOut.Restart

else

WaveOut.Pause;

end;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.btnStopClick(Sender: TObject);

begin

IncPlayList := False;

WaveOut.Stop;

end;

//предыдущая композиция

procedure TMainForm.btnPrevClick(Sender: TObject);

begin

IncPlayList := False;

if (PlayIndex > 0) then

begin

dec(PlayIndex);

if (wosPlay in WaveOut.State) then

begin

WaveOut.Stop;

SelectFile(PlayIndex);

WaveOut.Start;

end

else SelectFile(PlayIndex);

end;

IncPlayList := True;

end;

////следующая композиция

procedure TMainForm.btnNextClick(Sender: TObject);

begin

IncPlayList := False;

if (PlayIndex < PlayList.Count-1) then

begin

inc(PlayIndex);

if (wosPlay in WaveOut.State) then

begin

WaveOut.Stop;

SelectFile(PlayIndex);

WaveOut.Start;

end

else SelectFile(PlayIndex);

end;

IncPlayList := True;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.GaugeMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var

aPos: Longint;

Приложение А (продолжение)

begin

if (wosOpen in WaveOut.State) then

begin

Seeking := True;

WaveOut.Pause;

if not MpegFile.Empty then

begin

with Gauge do

aPos := MulDiv(X-BevelExtend,MpegFile.Frames,(Width-2*BevelExtend)-1);

if aPos >= MpegFile.Frames then

begin

WaveOut.Stop;

exit;

end

else

begin

MpegFile.Position := aPos;

CurTime := MpegFile.Position*MpegFile.TimePerFrame;

end;

end

else

begin

with Gauge do

aPos := MulDiv(X-BevelExtend,WaveFile.Wave.DataSize,(Width-2*BevelExtend)-1);

if aPos > WaveFile.Wave.DataSize then

begin

WaveOut.Stop;

exit;

end

else

begin

WaveFile.Wave.Position := aPos;

CurTime := WaveFile.Wave.Position;

end;

end;

WaveOut.Reset;

WaveOut.Restart;

OldTime := 0;

Seeking := False;

end;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.btnSkipLClick(Sender: TObject);

begin

if (wosPlay in WaveOut.State) then

begin

Seeking := True;

WaveOut.Pause;

if not MpegFile.Empty then

begin

MpegFile.Position := MpegFile.Position-(5000 div MpegFile.TimePerFrame);

CurTime := MpegFile.Position*MpegFile.TimePerFrame;

end

else

begin

WaveFile.Wave.Position := WaveFile.Wave.Position-5000;

CurTime := WaveFile.Wave.Position;

end;

WaveOut.Reset;

WaveOut.Restart;

OldTime := 0;

Seeking := False;

end;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.btnSkipRClick(Sender: TObject);

Приложение А (продолжение)

begin

if (wosPlay in WaveOut.State) then

begin

if not MpegFile.Empty then

begin

if MpegFile.Position+(5000 div MpegFile.TimePerFrame) > MpegFile.Frames then

WaveOut.Stop;

end

else

begin

if WaveFile.Wave.Position+5000 > WaveFile.Wave.DataSize then

WaveOut.Stop;

end;

Seeking := True;

WaveOut.Pause;

if not MpegFile.Empty then

begin

MpegFile.Position := MpegFile.Position+(5000 div MpegFile.TimePerFrame);

CurTime := MpegFile.Position*MpegFile.TimePerFrame;

end

else

begin

WaveFile.Wave.Position := WaveFile.Wave.Position+5000;

CurTime := WaveFile.Wave.Position;

end;

WaveOut.Reset;

WaveOut.Restart;

OldTime := 0;

Seeking := False;

end;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.btnDecVolumeClick(Sender: TObject);

var

Volume,L,R: Longint;

begin

if (wosOpen in WaveOut.State) then

begin

WaveOutGetVolume(WaveOut.Handle,@Volume);

L := LoWord(Volume);

R := HiWord(Volume);

L := Max(L - 5000,0);

R := Max(R - 5000,0);

Volume := (R shl 16) + L;

WaveOutSetVolume(WaveOut.Handle,Volume);

end;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.btnIncVolumeClick(Sender: TObject);

var

Volume,L,R: Longint;

begin

if (wosOpen in WaveOut.State) then

begin

WaveOutGetVolume(WaveOut.Handle,@Volume);

L := LoWord(Volume);

R := HiWord(Volume);

L := Min(L + 5000,$FFFF);

R := Min(R + 5000,$FFFF);

Volume := (R shl 16) + L;

WaveOutSetVolume(WaveOut.Handle,Volume);

Приложение А (продолжение)

end;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.btnPlayListClick(Sender: TObject);

var

wasPlaying: Boolean;

begin

with TPlayListEditor.Create(Self) do

try

if ShowModal = mrOK then

begin

IncPlayList := False;

wasPlaying := (wosPlay in WaveOut.State);

WaveOut.Stop;

PlayList.Assign(TempPlayList);

PlayListName := ListName;

PlayIndex := 0;

SelectFile(0);

if wasPlaying then btnPlayClick(nil);

end;

finally

Free;

end;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.MMPanelMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if (Button = mbLeft) then

begin

Dragging := True;

DragStart := TControl(Sender).ClientToScreen(Point(X,Y));

end;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.MMPanelMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if (Button = mbLeft) then Dragging := False;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.MMPanelMouseMove(Sender: TObject; Shift: TShiftState;

X, Y: Integer);

var

Diff: TPoint;

begin

if Dragging then

begin

Diff := TControl(Sender).ClientToScreen(Point(X,Y));

Diff := Point(Diff.X-DragStart.X,Diff.Y-DragStart.Y);

SetBounds(Left+Diff.X,Top+Diff.Y,Width,Height);

DragStart.X := DragStart.X+Diff.X;

DragStart.Y := DragStart.Y+Diff.Y;

end;

end;

{-- TMainForm -----------------------------------------------------------}

procedure TMainForm.Info1Click(Sender: TObject);

begin

autor.show;

end;

{-- TMainForm -----------------------------------------------------------}

Приложение А (продолжение)

procedure TMainForm.DrawLevelBar(Sender: TObject; DIB: TMMDIBCanvas; Rect: TRect; nSpots,Peak: integer);

begin

with DIB,Rect do

begin

if Sender = MMSpectrum1 then

begin

DIB_CopyDIBBits(MMSpectrum1.DIBCanvas.BackSurface,Left,Bottom-nSpots,Right-Left-1,Bottom,0,Bottom-nSpots);

DIB_CopyDIBBits(MMSpectrum1.DIBCanvas.BackSurface,Left,Bottom-Peak,Right-Left-1,2,0,Bottom-Peak);

end

else if Sender = MMLevel1 then

begin

DIB_SetTColor(MMLevel1.Color);

DIB_Clear;

DIB_CopyDIBBits(MMLevel1.DIBCanvas.BackSurface,0,Top,2*nSpots,Bottom,0,0);

DIB_CopyDIBBits(MMLevel1.DIBCanvas.BackSurface,2*Peak-2,Top,2,Bottom,2*Peak,0);

end

else

begin

DIB_SetTColor(MMLevel2.Color);

DIB_Clear;

DIB_CopyDIBBits(MMLevel2.DIBCanvas.BackSurface,0,Top,2*nSpots,Bottom,0,0);

DIB_CopyDIBBits(MMLevel2.DIBCanvas.BackSurface,2*Peak-2,Top,2,Bottom,2*Peak,0);

end;

end;

end;

procedure TMainForm.SpeedButton1Click(Sender: TObject);

begin

Application.Minimize;

end;

procedure TMainForm.N5Click(Sender: TObject);

begin

video.Show;

mainform.Visible:=false;

end;

end.

unit UMe;

interface

uses

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

Dialogs, MMObj, MMLEDLbl, MMScroll, MMLEDS, ExtCtrls;

type

TAutor = class(TForm)

MMLEDLABEL1: TMMLEDLABEL;

MMLEDLABEL2: TMMLEDLABEL;

MMLEDLABEL3: TMMLEDLABEL;

MMLEDPanel1: TMMLEDPanel;

MMLEDLABEL4: TMMLEDLABEL;

MMLED1: TMMLED;

procedure MMLED1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Autor: TAutor;

implementation

Приложение А (продолжение)

{$R *.dfm}

procedure TAutor.MMLED1Click(Sender: TObject);

begin

close;

end;

end.

unit UML;

interface

uses

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

Dialogs, Menus, Grids, DBGrids;

type

TML = class(TForm)

DBGrid1: TDBGrid;

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

procedure N2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

ML: TML;

implementation

{$R *.dfm}

procedure TML.N2Click(Sender: TObject);

begin

close;

end;

end.

unit UDM;

interface

uses

SysUtils, Classes, DB, ADODB;

type

TDM = class(TDataModule)

DataSource1: TDataSource;

ADOCommand1: TADOCommand;

ADOConnection1: TADOConnection;

ADOQuery1: TADOQuery;

private

{ Private declarations }

public

{ Public declarations }

end;

var

DM: TDM;

implementation

{$R *.dfm}

end.

unit UList;

interface

uses

Windows,

SysUtils,

Messages,

Classes,

Graphics,

Controls,

Forms,

Dialogs,

StdCtrls,

ExtCtrls,

FileCtrl,

Menus,

ComCtrls,

MMMPType,

MMMpeg,

MMWaveIO,

MMRiff;

type

TPlaylistEditor = class(TForm)

OKButton: TButton;

CancelButton: TButton;

MainMenu1: TMainMenu;

File1: TMenuItem;

Label5: TLabel;

Label6: TLabel;

PlayListBox: TListBox;

AddButton: TButton;

RemoveButton: TButton;

ClearButton: TButton;

RandomizeButton: TButton;

FileListBox: TFileListBox;

DirectoryListBox1: TDirectoryListBox;

DriveComboBox1: TDriveComboBox;

Bevel1: TBevel;

NewPlaylist1: TMenuItem;

OpenPlaylist1: TMenuItem;

SavePlaylist1: TMenuItem;

SavePlaylistAs1: TMenuItem;

AppendPlaylist1: TMenuItem;

N1: TMenuItem;

Exit1: TMenuItem;

OpenDialog: TOpenDialog;

SaveDialog: TSaveDialog;

InfoLabel: TLabel;

procedure ListMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

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

Shift: TShiftState);

procedure FormShow(Sender: TObject);

procedure ListDrawItem(Control: TWinControl; Index: Integer;

Rect: TRect; State: TOwnerDrawState);

procedure FormCreate(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure ClearButtonClick(Sender: TObject);

procedure RandomizeButtonClick(Sender: TObject);

procedure AddButtonClick(Sender: TObject);

Приложение А (продолжение)

procedure RemoveButtonClick(Sender: TObject);

procedure ListDragOver(Sender, Source: TObject; X, Y: Integer;

State: TDragState; var Accept: Boolean);

procedure ListDragDrop(Sender, Source: TObject; X, Y: Integer);

procedure ListEndDrag(Sender, Target: TObject; X, Y: Integer);

procedure FormHide(Sender: TObject);

procedure Exit1Click(Sender: TObject);

procedure NewPlaylist1Click(Sender: TObject);

procedure OpenPlaylist1Click(Sender: TObject);

procedure SavePlaylist1Click(Sender: TObject);

procedure SavePlaylistAs1Click(Sender: TObject);

procedure AppendPlaylist1Click(Sender: TObject);

private

FListName : TFileName;

DragTarget: TListBox;

aTimer : TTimer;

aBitmap1 : TBitmap;

aBitmap2 : TBitmap;

aIcon : TIcon;

oldIndex : integer;

oldCaption: String;

procedure CreateParams(var Params: TCreateParams); override;

procedure SetListName(aValue: TFileName);

procedure SetButtons;

function FirstSelection(aList: TCustomListBox): Integer;

function LastSelection(aList: TCustomListBox): Integer;

function FindIndex(aList: TListBox; aPos: TPoint): integer;

procedure ClearSelected(aList: TCustomListBox);

procedure AddSelected(aIndex: integer);

procedure ResortSelected(aIndex: integer);

procedure RemoveSelected;

procedure DrawIndexPtr(oldIndex, newIndex: integer);

procedure DragTimerExpired(Sender: TObject);

procedure UpdatePlayListBox;

procedure SetFileInfo;

public

TempPlayList: TStringList;

ListChanged: Boolean;

property ListName: TFileName read FListName write SetListName;

end;

var

PlaylistEditor: TPlaylistEditor;

function LoadPlayList(FileName: TFileName; aPlayList: TStringList): Boolean;

function SavePlayList(FileName: TFileName; aPlayList: TStringList): Boolean;

implementation

uses umain;

{$R *.DFM}

const

crTrackDrag = 1;

crTrackAdd = 2;

crTrackDelete = 3;

{------------------------------------------------------------------------}

function LoadPlayList(FileName: TFileName; aPlayList: TStringList): Boolean;

var

i: integer;

F: TextFile;

S: String;

Приложение А (продолжение)

begin

i := 0;

if (FileName <> '') and FileExists(FileName) then

begin

AssignFile(F, FileName);

{$I+}

Reset(F);

try

while not EOF(F) do

begin

ReadLn(F, S);

if (S <> '') then

begin

if FileExists(S) then

begin

if IsMpegFile(S) or wioIsWaveFile(S, RIFF_FILE) then

begin

aPlayList.Add(S);

inc(i);

end

else

MessageDlg(S+' is not a valid Audiofile',mtError, [mbOK],0);

end;

end;

end;

finally

CloseFile(F);

end;

{$I+}

end;

Result := (i > 0);

end;

{------------------------------------------------------------------------}

function SavePlayList(FileName: TFileName; aPlayList: TStringList): Boolean;

var

i: integer;

F: TextFile;

begin

Result := True;

if (FileName <> '') then

begin

AssignFile(F, FileName);

{$I-}

Rewrite(F);

try

if (IOResult <> 0) then Result := False

else

begin

for i := 0 to aPlayList.Count-1 do

begin

WriteLn(F,aPlayList[i]);

if (IOResult <> 0) then

begin

Result := False;

break;

end;

end;

end;

finally

CloseFile(F);

end;

{$I+}

end;

end;

Приложение А (продолжение)

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlayListEditor.CreateParams(var Params: TCreateParams);

begin

inherited CreateParams(Params);

Params.Style := Params.Style and not WS_SIZEBOX;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.FormCreate(Sender: TObject);

begin

oldCaption := Caption;

TempPlayList := TStringList.Create;

ListName := 'noname.m3u';

aTimer := TTimer.Create(Self);

aTimer.Interval := 50;

aTimer.Enabled := False;

aTimer.OnTimer := DragTimerExpired;

aBitmap1 := TBitmap.Create;

aBitmap2 := TBitmap.Create;

aBitmap1.Handle := LoadBitmap(HInstance, 'BM_NOTE');

aBitmap2.Width := aBitmap1.Width;

aBitmap2.Height := aBitmap1.Height;

BitBlt(aBitmap2.Canvas.Handle, 0,0, aBitmap1.Width, aBitmap1.Height,

aBitmap1.Canvas.Handle, 0,0, NOTSRCCOPY);

aIcon := TIcon.Create;

aIcon.Handle := LoadIcon(HInstance, 'MARKERICON');

Icon.Handle := LoadIcon(HInstance, 'PLAYLISTICON');

oldIndex := -1;

Screen.Cursors[crTrackDrag] := LoadCursor(HInstance, 'CR_TRACKDRAG');

Screen.Cursors[crTrackAdd] := LoadCursor(HInstance, 'CR_TRACKADD');

Screen.Cursors[crTrackDelete] := LoadCursor(HInstance, 'CR_TRACKDELETE');

DragTarget := Nil;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.FormDestroy(Sender: TObject);

begin

aTimer.Free;

aBitmap1.Free;

aBitmap2.Free;

aIcon.Free;

TempPlayList.Free;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.FormShow(Sender: TObject);

begin

PlayListBox.Clear;

TempPlayList.Assign(MainForm.PlayList);

ListName := MainForm.PlayListName;

UpdatePlayListBox;

ListChanged := not ((ListName <> '') and (ListName <> 'noname.m3u'));

SetFileInfo;

SetButtons;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.FormHide(Sender: TObject);

begin

Приложение А (продолжение)

if ModalResult = mrOK then

begin

if ListChanged then

if MessageDlg('Сохранить изменения в плейлисте ?', mtConfirmation, [mbYes,mbNo],0) = mrYes then

begin

if (ListName <> 'noname.m3u') then

SavePlaylist1Click(nil)

else

SavePlaylistAs1Click(nil);

end;

end;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlayListEditor.SetListName(aValue: TFileName);

begin

FListName := aValue;

Caption := oldCaption;

if FListName <> '' then

Caption := Caption + ' - ' + FListName;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.SetButtons;

begin

AddButton.Enabled := (FileListBox.SelCount > 0);

RemoveButton.Enabled := (PlayListBox.SelCount > 0);

ClearButton.Enabled := (PlayListBox.Items.Count > 0);

RandomizeButton.Enabled := (PlayListBox.Items.Count > 0);

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlayListEditor.UpdatePlayListBox;

var

i: integer;

begin

PlayListBox.Clear;

for i := 0 to TempPlayList.Count-1 do

PlayListBox.Items.Add(ExtractFileName(TempPlayList[i]));

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlayListEditor.SetFileInfo;

var

FileName,S: String;

lpwio: PWaveIOCB;

MpegInfo: TMpegFileInfo;

begin

if (TempPlayList.Count > 0) and (PlayListBox.ItemIndex >= 0) then

begin

FileName := TempPlayList[PlayListBox.ItemIndex];

if IsMpegFile(FileName) then

begin

if GetMpegFileInfo(FileName, MpegInfo) then

begin

S := 'ISO MPEG ';

with MpegInfo do

begin

case Version of

v1 : S := S + '1 - ';

v2LSF: S := S + '2 - ';

end;

case Layer of

1: S := S + 'Layer I; ';

2: S := S + 'Layer II; ';

3: S := S + 'Layer III; ';

end;

S := S + Format('%2.3f kHz; %d KBit/s; ',[SampleRate/1000,BitRate]);

case SampleMode of

smStereo : S := S + 'Stereo;';

smJointStereo : S := S + 'Joint Stereo;';

smDualChannel : S := S + 'Dual Channel;';

smSingleChannel: S := S + 'Mono;';

end;

InfoLabel.Caption := S;

end;

exit;

end;

end

else if wioIsWaveFile(FileName, RIFF_FILE) then

begin

if wioReadFileInfo(lpwio, PChar(FileName),

mmioFOURCC('W', 'A', 'V', 'E'), RIFF_FILE) = 0 then

try

InfoLabel.Caption := 'WAVE - ';

wioGetFormatName(@lpwio.wfx, S);

InfoLabel.Caption := InfoLabel.Caption+' '+S;

wioGetFormat(@lpwio.wfx, S);

InfoLabel.Caption := InfoLabel.Caption+' '+S;

exit;

finally

wioFreeFileInfo(lpwio);

end;

end;

InfoLabel.Caption := 'Незнай че за файл...';

end

else InfoLabel.Caption := '';

end;

{-- TPlayListEditor -----------------------------------------------------}

function TPlaylistEditor.FirstSelection(aList: TCustomListBox): Integer;

begin

for Result := 0 to aList.Items.Count - 1 do

if aList.Selected[Result] then exit;

Result := LB_ERR;

end;

{-- TPlayListEditor -----------------------------------------------------}

function TPlaylistEditor.LastSelection(aList: TCustomListBox): Integer;

begin

for Result := aList.Items.Count - 1 downTo 0 do

if aList.Selected[Result] then exit;

Result := LB_ERR;

end;

{-- TPlayListEditor -----------------------------------------------------}

function TPlaylistEditor.FindIndex(aList: TListBox; aPos: TPoint): integer;

begin

with aList do

begin

Result := ItemAtPos(aPos, False);

if Items.Count > (Height div ItemHeight)-1 then

if Result = TopIndex + (Height div ItemHeight)-1 then

if aPos.Y > Height-(ItemHeight div 2) then

inc(Result);

end;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.ClearSelected(aList: TCustomListBox);

Var

aIndex: integer;

begin

aIndex := FirstSelection(aList);

Приложение А (продолжение)

if aIndex > LB_Err then

begin

while aIndex <= LastSelection(aList) do

begin

if aList.Selected[aIndex] then

begin

aList.Selected[aIndex] := False;

ListChanged := True;

end;

inc(aIndex);

end;

SetFileInfo;

end;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.AddSelected(aIndex: integer);

Var

i: Integer;

begin

with TempPlayList do

begin

if (aIndex = -1) then aIndex := Count;

for i := 0 to FileListBox.Items.Count - 1 do

begin

if FileListBox.Selected[i] then

begin

Insert(aIndex, FileListBox.Items[i]);

ListChanged := True;

inc(aIndex);

end;

end;

UpdatePlayListBox;

if aIndex >= PlayListBox.Height div PlayListBox.ItemHeight then

PlayListBox.TopIndex := aIndex-((PlayListBox.Height div PlayListBox.ItemHeight)-1);

end;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.ResortSelected(aIndex: integer);

Var

i: Integer;

begin

if (PlayListBox.Items.Count > 1) then

with PlayListBox do

begin

if (aIndex = -1) then aIndex := 0;

i := 0;

while i < Items.Count do

begin

if Selected[i] then

begin

Selected[i] := False;

ListChanged := True;

if aIndex > i then

begin

TempPlayList.Move(i, aIndex-1);

Items.Move(i, aIndex-1);

dec(i);

end

else

begin

Приложение А (продолжение)

TempPlayList.Move(i, aIndex);

Items.Move(i, aIndex);

inc(aIndex);

end;

end;

inc(i);

end;

if (Items.Count > 0) then

begin

TopIndex := 0;

Selected[0] := True;

Selected[0] := False;

end;

end;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.RemoveSelected;

Var

i: Integer;

begin

with PlayListBox do

begin

ItemIndex := 0;

for i := Items.Count - 1 downTo 0 do

if Selected[i] then

begin

Items.Delete(i);

TempPlayList.Delete(i);

ListChanged := True;

end;

if (Items.Count > 0) then

begin

TopIndex := 0;

Selected[0] := True;

Selected[0] := False;

end;

end;

end;

{-- TPlayListEditor -----------------------------------------------------}

procedure TPlaylistEditor.ListMouseUp(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

if Button = mbLeft then

begin

if (Sender = PlayListBox) then SetFileInfo;

SetButtons;

end;

end;

{-- TPlayListEditor -----------------------------------------------------}


Подобные документы

  • Требования к функциональным характеристикам, составу и параметрам технических средств, информационной и программной совместимости. Описание программы: общие сведения, логическая структура. Средства и порядок испытаний. Входные и выходные данные.

    курсовая работа [6,3 M], добавлен 12.01.2015

  • Требования к функциональным характеристикам программы, составу и параметрам технических средств, программной совместимости. Особенности программирования в среде Access. Описание интерфейса программы, ввод и редактирование данных, добавление новых книг.

    курсовая работа [1,5 M], добавлен 17.11.2010

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

    курсовая работа [381,6 K], добавлен 13.08.2013

  • Системный анализ предметной области. Требования к программе и программному изделию, к функциональным характеристикам, к надежности, составу и параметрам технических средств. Обоснование выбора средств выбора для хранения и обработки базы данных.

    реферат [403,8 K], добавлен 02.02.2014

  • Разработка игровой программы "разгадывания кроссворда". Создание схемы хранения данных, изучение возможности среды программирования. Требования к функциональным характеристикам, составу и параметрам технических средств, информационной совместимости.

    курсовая работа [403,9 K], добавлен 26.03.2015

  • Разработка системы управления базой данных "Структура ВУЗа". Требования к программе: функциональным характеристикам, надежности, эксплуатации, составу и параметрам технических средств. Требования к программной документации. Порядок контроля и приемки.

    курсовая работа [982,7 K], добавлен 08.06.2015

  • Назначение и цели создания системы. Требования к программе или программному изделию, к информационной и программной совместимости, к составу и параметрам технических средств. Алгоритм Rijndael. Назначение и условия применения программного продукта.

    дипломная работа [1,3 M], добавлен 01.03.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.