Набор классов для работы с регулятором
громкости.
Компилятор: 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() )
{
}
...
bool CALLBACK EnumInputLineProc( UINT uLineIndex, MIXERLINE* pLineInfo, DWORD dwUserValue )
{
if ( pLineInfo->dwComponentType == MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE )
{
*((UINT*)dwUserValue) = uLineIndex;
return false;
}
return true;
}
...
Для большей производительности лучше
ограничиться одним экземпляром класса для
каждого регулятора громкости. Поэтому не стоит
создавать много объектов CVolumeInXXX, лучше сделать
доступным один экземпляр во всём коде.
|