Робота з пультом
Для вирішення першого завдання у нас в якості апаратного забезпечення є ТВ-тюнер Behold TV H6 з пультом дистанційного керування. Для роботи з пультом призначена бібліотека BeholdRC.dll, опис експортованих функцій, а також приклад роботи на Delphi, ми можемо знайти на сайті розробника. Втім, функцій всього кілька. Отримання інформації про натискання клавіш можна реалізувати двома способами, або перевіряти стан за таймером, або використовувати окремий потік. Другий варіант видається більш ефективним і цікавим. Отже реалізований клас матиме ім'я TRemoteVolumeControl, і бути спадкоємцем TThread. На даному етапі розробки, код головної форми відповідатиме за 3 речі:- Створення об'єкта TRemoteVolumeControl при старті додатка
- Прийом повідомлень про натисканні кнопок зміни гучності (можливо для поновлення інтерфейсу програми)
- Заверешніе потоку, при закритті програми
управління звуком
Взагалі я ні разу не замислювався про те як змінювати гучність звуку в системі. Тому вирушив вивчати документацію. Втім в деталі зовсім не вдавався. Наскільки я зрозумів, починаючи з Windows Vista, методи управління звуком кардинально змінилися. Про це нам розповідає розділ MSDN Core Audio API. Управляти звуком ми можемо на глобальному рівні, або змінюючи тільки свій звуковий потік. Нас цікавить перший варіант. Для роботи нам будуть потрібні кілька інтерфейсів: IMMDeviceEnumerator, представляє колекцію мультимедіа пристроїв; IMMDevice представляє однієї пристрій, і інтерфейс IAudioEndpointVolume для управління гучністю. На жаль Delphi не містить опису інтерфейсів, тому треба буде переписати заголовки mmDeviceApi.h EndpointVolume.h (результат прикріплений в кінці статті). В гуглі ви можете знайти файл mmDevApi.pas з описом інтерфейсів на Delphi, але там описані тільки ті інтерфейси, що потрібні для зміни гучності, а не повністю відповідають заголовки. Варто зазначити, що використовуючи ці інтерфейси ми можемо не тільки керувати гучністю, а й отримувати повідомлення про те, що гучність була змінена (IAudioEndpointVolumeCallback). Тепер якщо бути коротким, то наша функція InitVolumeControl повинна отримати посилання на інтерфейс IAudioEndpointVolume, що ми і зробимо: Тепер ми можемо описати функцію RCKeyPress. По-перше ми повідомляємо форму про самій клавіші, відправляючи їй її код. Далі в залежності від натиснутоюклавіші ми або збільшуємо / зменшуємо гучність (VolumeStepUp / VolumeStepDown). При натисканні на кнопку mute, ми повинні визначити поточний стан і інвертувати його. Натиснувши на кнопку вимикання ми можемо відправити формі повідомлення WM_CLOSE, хоча ми її вже повідомили про це відправивши код кнопки. Тепер наше додаток може змінювати загальну гучність звуку в Window Vista 7. Хотілося б реалізувати який-небудь гарний інтерфейс для цього, з прозорою формою і малюнком динаміка, але я на знаю як таке зробити в Direct2D. бо зіткнувся з проблемою в минулий раз. Вихідний код описуваного класу, а також файли опису інтерфейсів MMDeviceAPI і EndpointVolume можна скачати тут.