Есть две опции. Первый шаг - определить, какое устройство вам нужно, и получить его идентификатор. Предполагая, что устройство вывода по умолчанию, код будет выглядеть примерно так:
AudioObjectPropertyAddress propertyAddress = {
kAudioHardwarePropertyDefaultOutputDevice,
kAudioObjectPropertyScopeGlobal,
kAudioObjectPropertyElementMaster
};
AudioDeviceID deviceID;
UInt32 dataSize = sizeof(deviceID);
OSStatus result = AudioObjectGetPropertyData(kAudioObjectSystemObject, &propertyAddress, 0, NULL, &dataSize, &deviceID);
if(kAudioHardwareNoError != result)
// Handle the error
Далее вы можете использовать kAudioHardwareServiceDeviceProperty_VirtualMasterVolume
свойство для получения виртуального тома главного устройства:
AudioObjectPropertyAddress propertyAddress = {
kAudioHardwareServiceDeviceProperty_VirtualMasterVolume,
kAudioDevicePropertyScopeOutput,
kAudioObjectPropertyElementMaster
};
if(!AudioHardwareServiceHasProperty(deviceID, &propertyAddress))
// An error occurred
Float32 volume;
UInt32 dataSize = sizeof(volume);
OSStatus result = AudioHardwareServiceGetPropertyData(deviceID, &propertyAddress, 0, NULL, &dataSize, &volume);
if(kAudioHardwareNoError != result)
// An error occurred
В качестве альтернативы, вы можете использовать kAudioDevicePropertyVolumeScalar
для получить объем для конкретного канала:
UInt32 channel = 1; // Channel 0 is master, if available
AudioObjectPropertyAddress propertyAddress = {
kAudioDevicePropertyVolumeScalar,
kAudioDevicePropertyScopeOutput,
channel
};
if(!AudioObjectHasProperty(deviceID, &propertyAddress))
// An error occurred
Float32 volume;
UInt32 dataSize = sizeof(volume);
OSStatus result = AudioObjectGetPropertyData(deviceID, &propertyAddress, 0, NULL, &dataSize, &volume);
if(kAudioHardwareNoError != result)
// An error occurred
разница между ними объясняется в документации компании Apple:
kAudioHardwareServiceDeviceProperty_VirtualMasterVolume
Значение float32, представляющее значение регулировки громкости. Диапазон для этого свойства равен 0,0 (тишина) до 1,0 (полный уровень ). Эффект этого свойства зависит от аппаратного устройства , связанного с аудио-объектом HAL. Если у устройства есть регулятор громкости , это свойство управляет им. Если устройство имеет регуляторы громкости отдельных каналов, это свойство применяется к тем , идентифицированным предпочтительным многоканальным расположением устройства, или предпочтительной стереопарой , если устройство является стереофоническим. Этот элемент управления поддерживает относительный баланс между каналами, на которые он влияет.
Таким образом, может быть сложно определить, что такое громкость устройства, особенно для многоканальных устройств с нестандартными канальными картами.
Существует не один «текущий уровень громкости». На устройстве есть одно устройство, часто одно * на канал *, и есть два мета-устройства (по крайней мере для вывода): «устройство вывода по умолчанию» (для большинства звуковых выходов) и «устройство вывода предупреждений», (для предупреждающих звуков, звуков интерфейса и т. д.). –