Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 сентября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Программисты долго мучаются с кодом прогаммы, изучают С++, WinAPI функции, MSDN. Потом пишут банальную систему защиты или навешивают банальный протектор, а крэкеры и реверсеры справляются с такой защитой за 5 минут. В итоге, продажи программы почти нулевые. Чтобы такого не допустить, тут самому надо немного поднабрать опыта отладки, реверсинга, тот же отладчик Ollydbg изучить или дизассемблер IDA Pro. Но где искать по крохам эти знания? Нет, конечно можно годами "методом тыка" разбираться, но куда быстрее видеокурс специальный посмотреть. Вот тут он есть: ссылка. Автор курса с большим опытом и объясняет понятно, я из этого курса много узнал про то как работает компьютер, процессор, про инструменты специальные и как с ними работать. Мои коллеги программисты на работе ничего такого и не знают, теперь я им нос утру.

Набор классов для работы с регулятором громкости.

Компилятор: Visual C++ 6

Автор: Alex Chmut

Скачать исходник - 15 Кб

Данный набор классов позволяет упростить разработку приложений, которые работают со звуком. Классы позволяют изменять и отслеживать такие значения как Output Master Volume, WaveOut Volume и Input (WaveIn) Volume.

Ниже представлены основные методы для всех классов (объявленные в IVolume.h):

bool    IsAvailable() - Доступно ли управление звуком
 void    Enable() - Разрешаем данную громкость
 void    Disable() - Блокируем данную громкость
 DWORD   GetVolumeMetric() - Получаем степень детализации громкости
 DWORD   GetMinimalVolume() - Узнаём минимальное значение
 DWORD   GetMaximalVolume() - Узнаём максимальное значение
 DWORD   GetCurrentVolume() - Узнаём текущее значение
 void    SetCurrentVolume( DWORD dwValue ) - Устанавливаем громкость
 

А следующая функция позволяет послать уведомление для изменения громкости:

void    RegisterNotificationSink( PONMICVOULUMECHANGE, DWORD )
 

В исходнике присутствуют три класса: CVolumeOutMaster (VolumeOutMaster.h/cpp), CVolumeOutWave (VolumeOutWave.h/cpp) и CVolumeInXXX (VolumeInXXX.h/cpp). Использовать их можно следующим образом:

В StdAfx.h добавьте "mmSystem.h" и убадитесь, что присутствует ссылка на "winmm.lib" (#pragma comment(lib, "winmm.lib")). Затем, если Вы, например, захотите использовать регулятор громкости Output Mater, то добавьте "VolumeOutMaster.h", скажем, в StdAfx.h.

Файлы IVolume.h, VolumeInXXX.h, VolumeInXXX.cpp необходимо добавить как файлы проекта.

...
 void CALLBACK MasterVolumeChanged( DWORD dwCurrentVolume, DWORD dwUserValue );
 ...
 // Инициализация регулятора громкости
 IVolume* pMasterVolume = (IVolume*)new CVolumeOutMaster();
 if ( !pMasterVolume || !pMasterVolume->IsAvailable() )
 {
         // обработка ошибки
 }
 pMasterVolume->Enable();
 pMasterVolume->RegisterNotificationSink( MasterVolumeChanged, dwAnyUserValue );
 ...
 pMasterVolume->SetCurrentVolume( dwVolumeToSet );
 ...
 DWORD dwCurrentVolume = pMasterVolume->SetCurrentVolume();
 ...
 void CALLBACK MasterVolumeChanged( DWORD dwCurrentVolume, DWORD dwUserValue )
 {
         // обрабатываем изменения громкости
 }
 ...
 

Класс CVolumeInXXX требует более детального объяснения. Чтобы манипулировать с громкостью входа (Input), необходимо передать номер входа в конструктор. Для этого в классе CVolumeInXXX присутствует статическая функция для определения входных линий:

bool    EnumerateInputLines( PINPUTLINEPROC, DWORD dwUserValue );
 

Допустим Вам необходимо работать с громкостью микрофона:

...
 bool CALLBACK EnumInputLineProc( UINT uLineIndex, MIXERLINE* pLineInfo, DWORD dwUserValue );
 ...
 // Инициализация
 UINT uMicrophoneLineIndex = (UINT)-1;
 if ( !CVolumeInXXX::EnumerateInputLines( EnumInputLineProc, (DWORD)&uMicrophoneLineIndex ) )
 {
         // обработка ошибки
 }
 if ( uMicrophoneLineIndex == (UINT)-1 )
 {
         // Ошибка: доступ к громкости микрофона не возможен.
 }
 IVolume* pMicrophoneVolume = (IVolume*)new CVolumeInXXX( uMicrophoneLineIndex );
 if ( !pMicrophoneVolume || !pMicrophoneVolume->IsAvailable() )
 {
         // обработка ошибки
 }
 // Далее приступаем к использованию pMicrophoneVolume для регуляции громкости
 ...
 bool CALLBACK EnumInputLineProc( UINT uLineIndex, MIXERLINE* pLineInfo, DWORD dwUserValue )
 {
         if ( pLineInfo->dwComponentType == MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE )
         {
                *((UINT*)dwUserValue) = uLineIndex;
                return false;
         }
         return true;
 }
 ...
 

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

 



<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS