- •Обробка виключних ситуацій
- •6.0804 “Комп’ютерні науки”
- •1. Мета роботи
- •2.Основні теоретичні відомості
- •2.1. Оператори мови java
- •15.1. Модель обробки "поставщик-споживач"
- •15.2. Класи-фільтри
- •15.6. Модель обробки прямим доступом
- •15.7. Перетворення зображення в Java 2d
- •15.8. Афінне перетворення зображення
- •15.9. Зміна інтенсивности зображення
- •Import java.Awt.*;
- •Import java.Awt.Image.*;
- •Import java.Awt.Event.*;
- •15.10. Зміна складових кольору
- •15.11. Створення різних эфектів
- •Import java.Awt.*;
- •Import java.Awt.Event.*;
- •15.13. Покращення зображення подвійною буферизацією
- •50, 50, 0, 360, Arc2d.Open));
- •15.14. Звук
- •Import java.Applet.* ;
- •Import java.Net.*;
- •15.15. Програвання звуку в Java 2
- •Import javax.Sound.Sampled.*;
- •Import java.Io.*;
- •If (!AudioSystem.IsLineSupported(info)){
- •Import javax.Sound.Sampled.*;
- •Import java.Io.*;
- •If (!AudioSystem.IsLineSupported(info)){
- •Import javax.Sound.Midi.*;
- •Import java.Io.*;
- •15.16. Синтез і запис звуку в Java 2
- •Import javax.Sound.Midi.*;
- •Import java.Io.*;
- •3.Контрольні запитання
- •4.Лабораторне завдання
- •Мета роботи.
- •Список рекомендованої літератури
15.14. Звук
Як було указано в попередньому уроці, в аплетах реалізується інтерфейс AudioСlip. Екземпляр обєкта, реалізуючого цей інтерфейс можна отримати методом getAudioClip(), котрий, крім того, завантажує звуковий файл, а потім користуватися методами play(), loop() і stop() цього інтерфейса для програвання музики. Для застосування даного ж прийому в додатках в класс Applet введено статичний метод newAudioclіp(URL address), завантажуючий звуковий файл, що знаходиться по адресу address, і повертаючий обєкт, реалізуючий інтерфейс AudioСlip. Його можна використовувать для програвання звуку в додатку, якщо звичайно звукова система компютера уже настроєна.
В лістинзі 15.14 приведено найпростіший консольний додаток, нескінчено програючий звуковий файл doom.mid, що знаходиться в поточному каталозі. Для завершення додатку треба застосувати засоби операційної системи, наприклад, комбінацію клавіш <Ctrl>+<C>.
Лістинг 15.14. Найпростіший аудіододаток
Import java.Applet.* ;
Import java.Net.*;
class SimpleAudio{
SimpleAudio () {
try{
AudioClip ac = Applet.newAudioClip(new URL("file:doom.mid"));
ac.loop();
}catch(Exception e){}
}
public static void main(String[] args){
new SimpleAudio();
}
}
Таким способом можна пргравати звукові файли типів AU, WAVE, AIFF, MIDI без стискання. В склад віртуальної машины Java, що входить в SUN J2SDK починаючи з версії 1.3, включено пристрій, програваючий звук, записаний в одному із форматів AU, WAVE, AIFF, MIDI, перетворюючий, мікшуючий і записуючий звук в тих же форматах. Для роботи з цим пристроєм створені класи, зібрані в пакети javax.sound.sampled, javax.sound.midi, javax.sound.sampled.spi і javax.sound.midi.spi. Перечислений набір класів для роботи із звуком отримав назву Java Sound API.
15.15. Програвання звуку в Java 2
Програвач звуку, вбудований в JVM, розрахований на два способи запису звуку: моно і стерео оцифровку (digital audio) з частотою дискретизації (sample rate) від 8 000 до 48 000 Гц і апроксимацією (quantization) 8 і 16 бітів, і MIDI-послідовності (sequences) типу 0 і 1. Оцифрований звук повинен зберігатися в файлах типу AU, WAVE і AIFF. Його можна програвати двома способами. Перший спосіб описаний в інтерфейсі clip. Він розрахований на відтворення невеликих файлів або неодноразового програвання файла і заключається в тому, що весь файл цілком завантажується в оперативну память, а потім проигррається. Другий спосіб описаний в інтерфейсі SourceDataLine. Згідно цьому способу файл завантажується в оперативну память по частинах в буфер, розмір якого можна задати довільно. Перед завантаженням файла треба задати формат запису звуку в обєкті класу AudioFormat. Конструктор цього класу:
AudioFormat(float sampleRate, int sampleSize, int channels, boolean signed, boolean bigEndian)
вимагає знання частоти дискретизації sampleRate (по замовчуванню 44 100 Гц), аппроксимації sampleSize, заданої в бітах (по замовчуванню 16), числа каналів channels (1 — моно, по замовчуванню 2 — стерео), запис чисел із знаком, signed == true, або без знака, і порядка розташування байтів в числі bigEndian. Такі дані звичайно невідомі, тому їх отримують із самого файла. Це відбувається в два кроки. На першому кроці отримуємо формат файла статичним методом getAudioFiІeFormat() класу AudioSystem, на другому — формат запису звуку методом getFormat() класу AudioFiІeFormat. Це описано в лістинзі 15.15. Після того як формат запису визначено і занесено в обєкт класу AudioFormat, в обєкті класу DataLine.infо збирається інформація про вхідну лінію (line) і способі програвання clip або SourceDataLine. Далі треба перевірити, чи зможе проигравач обслуговувати лінію з таким форматом. Потім треба звязати лінію з програвачем статичним методом getLine() класу AudioSystem. Потім створюємо потік даних із файла — обєкт класу AudioІnputstream. Із цього потоку теже можна отримати обєкт класу AudioFormat методом getFormat(). Даний варіант вибраний в лістинзі 15.16. Відкриваємо створений потік методом ореn(). У-фф! Все готово, тепер можна почати програвання методом start(), завершити методом stop(), "перемотать" в початок методом setFramePosition(0) або setMillisecondPosition(0).
Можна задати пргравання n раз підряд методом loop(n) або нескінчене число раз методом loop (Clip.LOOP_CONTINUOUSLY) . Перед цим необхідно установити початкову n і кінцеву m позиції повторення методом setLoopPoints(n, m). По закінченню програвання треба закрити лінію методом close (). Вся ця послідовність дій показана в лістинзі 15.15.
Лістинг 15.15. Програвання аудіокліпа