CoreAudio查找音频设备是否可以更改音量

时间:2013-07-07 16:29:58

标签: macos core-audio

目前我正在寻找方法来确定音频设备是否可以进行音量配置。

我尝试使用kAudioDevicePropertyVolumeRangeDecibels属性获取范围,如果最小值和最大值等于确认为不可更改的音量。但不幸的是,我根本无法获得这个价值。

AudioObjectPropertyAddress addr;
addr.mSelector = kAudioDevicePropertyVolumeRangeDecibels;
addr.mScope = kAudioDevicePropertyScopeOutput;
addr.mElement = kAudioDevicePropertyScopeOutput;

UInt32 size;
AudioValueRange range;

OSStatus status = AudioObjectGetPropertyDataSize(self.audioDeviceID, &addr, 0, NULL, &size);
if (status != noErr)
{
    NSLog(@"error during size retrieval");
}else {
    status = AudioObjectGetPropertyData(self.audioDeviceID, &addr, 0, NULL, &size, &range);
    if (status != noErr)
    {
        NSLog(@"error during value retrieval");
    }
}

在尺寸检索过程中我总是遇到错误。 (正确检索所有其他数据,如音量,通道数等)。

感谢任何解决方案。

1 个答案:

答案 0 :(得分:1)

我通过检查设备是否支持kAudioDevicePropertyVolumeScalar属性来完成此操作。有些设备(但不是很多)支持主通道,因此请先检查kAudioObjectPropertyElementMaster。如果失败,请检查您要使用的各个频道:

AudioObjectPropertyAddress propertyAddress = { 
    kAudioDevicePropertyVolumeScalar, 
    kAudioDevicePropertyScopeOutput,
    kAudioObjectPropertyElementMaster 
};

if(AudioObjectHasProperty(deviceID, &propertyAddress))
    // YES

// Assume stereoChannels is a 2-deep array of the device's preferred stereo channels

propertyAddress.mElement = stereoChannels[0];
if(!AudioObjectHasProperty(deviceID, &propertyAddress))
    // NO

propertyAddress.mElement = stereoChannels[1];
if(!AudioObjectHasProperty(deviceID, &propertyAddress))
    // NO

// YES