Передача звука по локальной сети (стр. 4 из 5)

– исправность сетевого соединения;

– режим работы: полу или полнодуплексный;

– скорость передачи данных 10 или 100 Мбит/с;

– идет передача данных или нет.

Для отображения режима работы и скорости передачи могут использоваться не два индикатора, а один. Например, компания 3Com для демонстрации скорости передачи использует два индикатора, a SMC – один, цвет которого меняется в зависимости от значения скорости – 10 или 100 Мбит/с.

Существует еще ряд характеристик, которые в ряде случаев следует учитывать при выборе сетевых карт. К ним относятся: наличие Boot ROM, то есть возможность загрузки с сетевой карты (а не, например, с винчестера); наличие режима Bus master, то есть возможность независимой работы с шиной; поддержка удаленного управления и администрирования (например, SNMP). Кроме того, многие производители сетевого оборудования и ПО, разработали программные средства, позволяющие увеличить производительность работы сетевых адаптеров: DynamicAccess 3Com, AdaptiveTechnologyIntel и т. д.

2.2 Решение поставленной задачи

Вы, возможно, не знали о том, что компоненты, которые устанавливаются вместе с Windows Media Player 9 (и более поздними версиями) содержат встроенные средства широковещательной передачи аудио-данных. Фактически каждый подключенный к сети компьютер, на котором установлен Windows Media Player, может быть превращен в сетевую радиостанцию. Для этого можно воспользоваться готовыми программами. Можно написать собственную программу, используя напрямую интерфейсы, предоставляемые Windows Media System (такие как IWMWriterNetworkSink, IWMProfile, IWMCodecInfo) и еще десяток функций и интерфейсов (их описание содержится в Windows Media SDK).

2.3 Практическая реализация передачи звука по сети

Мы рассмотрим другое решение - создание собственной Интернет-радиостанции с помощью Delphi и компонентов New Audio Components (NewAC). Мы увидим, что в простейшем примере нам будет достаточно соединить два компонента и настроить их свойства.

Что дает нам написание собственной программы передачи аудио-данных? Прежде всего - свободу. Можно организовать передачу аудио с помощью микрофона, подключенного к вашему компьютеру.

Можно передавать содержимое аудио-записей с вашего компьютера (для этого надо будет задействовать компоненты чтения аудио-данных из различных форматов, входящие в состав NewAC). Можно просто транслировать все, что звучит в вашей системе.

Поскольку передача данных выполняется в формате Windows Media Audio, ее можно будет прослушивать с любого компьютера, на котором установлен Windows Media Player, или совместимый проигрыватель. Стоит отметить, что за последние годы качество потокового аудио-формата Windows Media Audio заметно улучшилось, так что даже при скорости передачи данных 16 кбит/сек мы можем получить звук вполне приемлемого радио-качества. При этом передача данных создаст незначительную нагрузку на локальную сеть. Разумеется, ничто не мешает нам организовать передачу данных с более высоким битрейтом, (а, следовательно, - качеством), но нагрузка на сеть в этом случае, естественно, возрастет. При наличии DSL-модема и видимого из внешней сети IP-адреса вы даже можете организовать трансляцию в глобальную сеть, хотя число клиентов, способных принимать вашу радиопередачу будет не очень велико.


3 Разработка программного продукта

3.1 Общая схема взаимодействия программы и звуковой подсистем

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

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

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

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

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

Дождавшись завершения обработки очередного буфера или получив его в результате уведомления от драйвера, программа обрабатывает записанные данные, определяя их размер по полю dwBytesRecorded в заголовке буфера. Затем освобожденный буфер может быть вновь передан драйверу функцией AddBuffer.

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

При необходимости приостановить движение потока вызывается функция Stop/Pause. При этом устройство ввода сразу же возвращает очередной буфер приложению - возможно, заполненный лишь частично. Не полностью проигранный буфер устройства вывода остается в очереди. Остальные буферы устройств обоих типов также остаются в очереди и включаются в работу только после перезапуска потока функциями Start/Restart.

Для устройств вывода, поддерживающих расширенные функции управления, программа может регулировать громкость звука функцией SetVolume, а также изменять высоту тона и скорость воспроизведения функциями SetPitch/SetPlaybackRate. Более общим способом регулировки громкости является обращение к микшеру (mixer), который является устройством класса Aux.

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

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

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

3.2 Постановка задачи по разработке программного продукта

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

Приложения оформить в виде визуальных приложений.

Входные данные: параметры сети.

Выходные данные: выведенная найденная информация.

Функции:

– определение портов сети;

– вывод времени радиовещания.

3.3 Создание приложения передачи звука. Программная реализация приложения «транслятор»

Класс программы «Транс»– «Form1». Его описание – на рисунке 1.

Класс «Form1»
Открытые поля
public string dan
public string ip
StartButton.Enabled := True;
Открытые методы
TForm1.StopButtonClick
TForm1.Timer1Timer
TForm1.WMStreamedOut1ThreadException
TForm1.FormCreate

Рисунок 1 – описание класса Form1

Поле ip используется для обращения ip-адреса приложения. Метод Timer1 используется для посчета интервала времени. В нём производится сбор информации об адаптерах, остальная информация собирается с помощью методов, вызванных в коде этого метода.

Листинг метода OSNMET() с комментариями:

unit Main;

interface

uses

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

Dialogs, ACS_Classes, StdCtrls, ComCtrls, ACS_DXAudio, Spin, ExtCtrls, ACS_Wave,

ACS_WinMedia;

type

TForm1 = class(TForm)

StartButton: TButton;

StatusBar1: TStatusBar;

StopButton: TButton;

Timer1: TTimer;

Label2: TLabel;

SpinEdit2: TSpinEdit;

Label3: TLabel;

Label4: TLabel;

PauseButton: TButton;

DXAudioIn1: TDXAudioIn;

WMStreamedOut1: TWMStreamedOut;

procedure StartButtonClick(Sender: TObject);

procedure OutputDone(Sender: TComponent);

procedure StopButtonClick(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure SpinEdit2Change(Sender: TObject);

procedure PauseButtonClick(Sender: TObject);

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

procedure WMStreamedOut1ThreadException(Sender: TComponent);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.StartButtonClick(Sender: TObject);

begin

StartButton.Enabled := False;

SpinEdit2.Enabled := False;

WMStreamedOut1.Run;

Timer1.Interval := 1000;

end;

procedure TForm1.OutputDone(Sender: TComponent);

begin

StartButton.Enabled := True;

SpinEdit2.Enabled := True;

end;

procedure TForm1.StopButtonClick(Sender: TObject);

begin

WMStreamedOut1.Stop;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

Label2.Caption := Format('Продолжительность: %d секунд', [WMStreamedOut1.TimeElapsed]);

end;

procedure TForm1.WMStreamedOut1ThreadException(Sender: TComponent);

begin

Self.StatusBar1.Panels[0].Text := WMStreamedOut1.ExceptionMessage;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

SpinEdit2.MaxValue := DXAudioIn1.DeviceCount - 1;

SpinEdit2.MinValue := 0;

SpinEdit2.Value := 0;

Label4.Caption := DXAudioIn1.DeviceName[SpinEdit2.Value];

end;

procedure TForm1.SpinEdit2Change(Sender: TObject);

begin

Label4.Caption := DXAudioIn1.DeviceName[SpinEdit2.Value];

DXAudioIn1.DeviceNumber := SpinEdit2.Value;

end;

procedure TForm1.PauseButtonClick(Sender: TObject);

begin

if WMStreamedOut1.Status = tosPlaying then WMStreamedOut1.Pause;

if WMStreamedOut1.Status = tosPaused then WMStreamedOut1.Resume;

end;

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

begin