Технические вопросы и ответы QA1016

Изменение объема аудиоустройств

Q: Как я изменяю объем аудиоустройства?

A: Для изменения объема аудио аппаратных средств, необходимо сначала получить AudioDevice и определить, имеет ли устройство регулятор громкости, который устанавливаем. Можно получить устройство вывода по умолчанию или системное устройство вывода при помощи метода AudioHardwareGetProperty и константы kAudioHardwarePropertyDefaultOutputDevice и kAudioHardwarePropertyDefaultSystemOutputDevice .

Перечисление 1  , Получающее устройство вывода по умолчанию

 UInt32 size;
    AudioDeviceID outputDevice;
    AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice,
                                              &size,
                                              &outputDevice);

После получения устройства необходимо проверить, имеет ли это регулятор громкости и если это свойство writeable.

Перечисление 2  , Получающее функции устройств

bool CAAudioHardwareDevice::HasProperty(
    UInt32 inChannel,
    CAAudioHardwareDeviceSectionID inSection,
    AudioHardwarePropertyID inPropertyID) const
{
    OSStatus theError = AudioDeviceGetPropertyInfo(mAudioDeviceID,
            inChannel, inSection, inPropertyID, NULL, NULL);
    return theError == 0;
}
 
bool CAAudioHardwareDevice::PropertyIsSettable(
    UInt32 inChannel,
    CAAudioHardwareDeviceSectionID inSection,
    AudioHardwarePropertyID inPropertyID) const
{
    Boolean isWritable = false;
    OSStatus theError = AudioDeviceGetPropertyInfo(mAudioDeviceID, inChannel,
        inSection, inPropertyID, NULL, &isWritable);
    ThrowIfError(theError, CAException(theError),
        "CAAudioHardwareDevice::PropertyIsSettable: got "
        "an error getting info about a property");
    return isWritable != 0;
}
 
bool CAAudioHardwareDevice::HasVolumeControl(
    UInt32 inChannel,
    CAAudioHardwareDeviceSectionID inSection) const
{
    return HasProperty(inChannel, inSection, kAudioDevicePropertyVolumeScalar);
}
 
bool CAAudioHardwareDevice::VolumeControlIsSettable(
    UInt32 inChannel,
    CAAudioHardwareDeviceSectionID inSection) const
{
    return PropertyIsSettable(inChannel, inSection, kAudioDevicePropertyVolumeScalar);
}

Тогда можно регулировать громкость устройства при помощи константы kAudioDevicePropertyVolumeScalar в AudioDeviceSetProperty. Необходимо указать значение Float32 между 0 и 1, который будет масштабировать объем устройства.

Перечисление 3  , Регулирующее громкость на основном канале

AudioDeviceSetProperty(theDevice,
                         NULL, //time stamp not needed
                         0, //channel 0 is master channel
                         false,  //for an output device
                         kAudioDevicePropertyVolumeScalar,
                         sizeof(Float32),
                         &theValue );

Ссылки



История версии документа


ДатаПримечания
04.04.2013

Передовая статья

02.05.2006

Новый документ, демонстрирующий регуляторы громкости для аудиоустройств