15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


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

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