Конфігурування потоку і підключення до сервера

Встановлення звязку з сервером і конфігурування підходящого потоку нудна, але неминуча операція Цей потік складається з двох елементів Клієнт імпортухранітданние, отримані від клієнта, і, при необхідності, може вимагати додаткові дані Пристрій експорту передає дані одержувачу Зустрічаються пристрої експорту, призначені для роботи з декількома звуковими картами і мережевими службами B нашому випадку я просто хочу переконатися, що пристрій, на яке ми виводимо дані, є пристроєм виводавфізіческом сенсі (гучномовець) і підтримує роботу з необхідною кількістю каналів (моно або стерео) Після реєстрації потоку настає час для останнього кроку реєстрації функції зворотного виклику

Бібліотечна функція AuOpenServer переглядає кілька стандарт-

них місць у пошуках сервера, який слід використовувати Спочатку вона пробує

вважати значення змінної середовища AUDIOSERVER Якщо ця змінна відсутня, то використовується змінна середовища DISPLAY B відміну від версій, розрахованих для роботи в Mac OS або Windows, вам нема чого турбуватися про те, з якими даними зможе працювати сервер NAS 16-бітними або 8-бітними

Всі сервери NAS сприймають дані обох типів і, при необхідності, про-

водять внутрішню конвертацію

Лістинг 84 Реалізація класу NasPlayer (продовження)

void NasPlayer::OpenServer(){ AuDeviceID deviceID = AuNone

/ / Відкриваємо підключення до сервера

const char * const NullString = (const char *)NULL

char *server_message

_server = AuOpenServer(

NullString, 0, NullString, 0, NullString, / / ​​Використовуємо

/ / Значення

/ / За замовчуванням

& Server_message) / / Повідомлення

/ / Про помилку

if (server_message = (char *)NULL) {

/ / He вдалося підключитися до аудіосервер Сервер:

cerr &lt&lt &quotCould not connect to audio server\n" cerr &lt&lt &quotServer: &quot &lt&lt server_message &lt&lt &quot\n" exit(1)

}

if (_server) {

/ / He вдалося підключитися до аудіосервер

cerr &lt&lt &quotCould not connect to audio server\n"

exit(1)

}

/ / Вибираємо перше відповідне пристрій виводу for (int i = 0 i

AuDeviceAttributes *device = AuServerDevice(_server,i)

if ((AuDeviceKind(device) == AuComponentKindPhysicalOutput)

&amp&amp

(AuDeviceNumTracks(device) == Channels())) {

deviceID = AuDeviceIdentifier(device)

break

}

}

if (deviceID == AuNone) {

/ / He виявлено підходящого пристрою виводу

cerr &lt&lt &quotNo suitable audio output device found\n"

exit(1)

}

/ / Запит на організацію нового потоку на сервері

_flow = AuGetScratchFlow(_server,NULL)

if (_flow == AuNone) {

/ / He вдалося створити аудиопоток на сервері

cerr &lt&lt &quotCould not create audio flow on server\n"

exit (1)

}

/ / Необхідно повідомити сервер NAS про те, який

/ / Розмір повинен мати його буфер

long requestSize = (nasBufferSize)/Channels()/2

/ / Створення елементів для нашого потоку

AuElement elements[2]

/ / Перший елемент це клієнт імпорту (я подаю дані)

AuMakeElementImportClient (& elements [0], / / ​​Перший елемент

SamplingRate (), / / ​​Частота

/ / Дискретизації NasFormatCode (16), / / ​​Отримуємо код формату Channels (), / / ​​Число каналів

AuTrue, / / ​​При запуску –

/ / В стані паузи requestSize, / / ​​Скільки відліків запитувати requestSize / 2, / / ​​Мінімальний рівень

0, NULL) / / He діємо

/ / Останній елемент це пристрій виведення

AuMakeElementExportDevice(&ampelements[1],

0, / / ​​Ha вхід отримуємо дані

/ / Від попереднього

deviceID, / / ​​ID пристрою виводу

SamplingRate (), / / ​​Частота дискретизації AuUnlimitedSamples, / / ​​Грати вічно

0, NULL) / / He діємо

/ / Реєстрація цього потоку

/ / На сервері

AuStatus status AuSetElements(_server,_flow,AuTrue,2,elements,&ampstatus) if (status) {

/ / He вдалося конфігурувати потік

cerr &lt&lt &quotCouldnt configure flow\n"

exit(1)

}

/ / Реєстрація обробника подій

/ / Клієнта імпорту

AuEventHandlerRec *handler = AuRegisterEventHandler(_server,

reinterpret_cast (this)) / / Це

/ / Допоміжні

/ / Дані

if (handler) { AuReleaseScratchFlow(_server,_flow,NULL)

/ / He вдалося зареєструвати обробник подій

cerr &lt&lt &quotCouldnt register event handler\n"

exit(1)

}

}

Приклад програми для UNIX

B цієї елементарної програмі, що працює в текстовому режимі, функція main виглядає дуже просто Врахуйте, що ця функція не може отримувати дані з cin, так як нам необхідна функція OpenFormat для пошуку у файлі

Лістинг 85 Програма nasmaincpp

#include &quotopenh&quot

#include &quotaplayerh&quot

#include &quotnasplayrh&quot

#include &ltfstream&gt

int main(int argc, char **argv) {

while (–argc) {

++argv

cerr &lt&lt &quotFile: &quot &lt&lt *argv &lt&lt &quot…\n"

ifstream input(*argv)

if (inputis_open()) {

/ / He вдалося відкрити файл

cerr &lt&lt &quotCouldnt open file &quot &lt&lt *argv &lt&lt &quot\n"

continue

}

AudioAbstract *audioFile = OpenFormat(input)

if (audioFile) {

NasPlayer player(audioFile)

playerPlay()

delete audioFile

/ / Закінчено відтворення файлу

cerr &lt&lt &quotFinished playing &quot &lt&lt *argv &lt&lt &quot.\n"

}

cerr &lt&lt &quot\n"

}

return 0

}

Глава 9 Компресія звуку

Головна ідея, що лежить в основі будь компресії звуку, відео або електронних таблиць полягає в тому, щоб знайти таке подання даних, яке займало б менше місця Очевидно, що чим краще ви розбираєтеся в наявних у вас даних, тим більш компактно ви зможете їх записати Кращі сучасні методи компресії звуку використовують безліч фактів, що відносяться до природи звуків реального світу і тому, як людина чує

Незважаючи на те, що загальноприйнято розрізняти «стислі» і «нестислі» звукові дані, говорити просто про різні способи «кодування» звуку було б, ймовірно, доречніше Найпростіший спосіб кодування, з яким ви зіштовхнетеся при роботі з цифровим звуком, це ІКМ, описана в розділі 3 Навіть цей простий формат складніше, ніж могло б здатися, і існує, принаймні, чотири формату ІКМ, широко використовувані для запису файлів Більш докладно ці питання розглядаються в розділі 10

Більшість програмістів вважають, що звук, записаний за допомогою ІКМ, компресії не береться під Якщо ви почнете працювати з форматом ІКМ, то алгоритми компресії звуку перетворять ІКМ в більш компактний формат B ос-

тавшіе частині даної глави я приведу короткий огляд використовуваних для цього

методів Кілька наступних глав присвячені більш детальному розглянуто-

нию своєрідних алгоритмів компресії звуку, що застосовуються на практиці

Джерело: Кінтцель Т Керівництво програміста по роботі зі звуком = A Programmers Guide to Sound: Пер з англ М: ДМК Пресс, 2000 432 с, іл (Серія «Для програмістів»)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*