Набор классов для работы с регулятором громкости.Компилятор: 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, лучше сделать доступным один экземпляр во всём коде.
|