0

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

我尝试使用 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");
    }
}

在尺寸检索过程中我一直出错。(所有其他数据,如音量、通道数等都被正确检索)。

感谢您提供任何解决方案。

4

1 回答 1

2

我通过检查设备是否支持该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
于 2013-10-11T00:24:35.760 回答