gpt4 book ai didi

objective-c - 无法从 cocoa Objective-C 的任何音频设备获取输出音量

转载 作者:行者123 更新时间:2023-12-03 16:38:17 26 4
gpt4 key购买 nike

我正在尝试在 macOS 应用程序中实现音量控制。当我运行循环遍历 MacBook Pro 中安装的音频设备并查询其主音量(或单个 channel 音量 - 我也尝试过)的代码时,我无法得到任何结果。

这是我正在运行的代码:

- (NSArray*)getAudioDevices
{
AudioObjectPropertyAddress propertyAddress = {
kAudioHardwarePropertyDevices,
kAudioObjectPropertyScopeGlobal,
kAudioObjectPropertyElementMaster
};

UInt32 dataSize = 0;
OSStatus status = AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &propertyAddress, 0, NULL, &dataSize);
if(kAudioHardwareNoError != status)
{
NSLog(@"Unable to get number of audio devices. Error: %d",status);
return NULL;
}

UInt32 deviceCount = dataSize / sizeof(AudioDeviceID);

AudioDeviceID *audioDevices = malloc(dataSize);

status = AudioObjectGetPropertyData(kAudioObjectSystemObject, &propertyAddress, 0, NULL, &dataSize, audioDevices);
if(kAudioHardwareNoError != status)
{
NSLog(@"AudioObjectGetPropertyData failed when getting device IDs. Error: %d",status);
free(audioDevices), audioDevices = NULL;
return NULL;
}

NSMutableArray* devices = [NSMutableArray array];

for(UInt32 i = 0; i < deviceCount; i++)
{

// Query device name
CFStringRef deviceName = NULL;
dataSize = sizeof(deviceName);
propertyAddress.mSelector = kAudioDevicePropertyDeviceNameCFString;
status = AudioObjectGetPropertyData(audioDevices[i], &propertyAddress, 0, NULL, &dataSize, &deviceName);
if(kAudioHardwareNoError != status) {
fprintf(stderr, "AudioObjectGetPropertyData (kAudioDevicePropertyDeviceNameCFString) failed: %i\n", status);
continue;
}

// Query device output volume
Float32 volume;
propertyAddress.mSelector = kAudioHardwareServiceDeviceProperty_VirtualMasterVolume;
status = AudioHardwareServiceHasProperty(audioDevices[i], &propertyAddress);
if(status) {
fprintf(stderr, "AudioObjectGetPropertyData (kAudioHardwareServiceDeviceProperty_VirtualMasterVolume) failed: %i\n", status);
} else {
dataSize = sizeof(volume);
status = AudioObjectGetPropertyData(audioDevices[i], &propertyAddress, 0, NULL, &dataSize, &volume);
if (status) {
// handle error
}
}

NSLog(@"device found: %d - %@ || Vol: %f || status %i",audioDevices[i], deviceName, volume, status);

[devices addObject:[NSNumber numberWithInt:audioDevices[i]]];
}

free(audioDevices);

return [NSArray arrayWithArray:devices];
}

以及我从日志中获得的输出:

device found: 58 - Built-in Microphone || Vol: 0.000000 || status 2003332927
device found: 78 - Built-in Input || Vol: 0.000000 || status 2003332927
device found: 68 - Built-in Output || Vol: 0.000000 || status 2003332927
device found: 54 - Microsoft LifeCam VX-5000 || Vol: 0.000000 || status 2003332927
device found: 87 - Microsoft LifeChat LX-3000 || Vol: 0.000000 || status 2003332927

我正在运行 OS X 10.7.3/Xcode 4.3.2

设备上的音量实际上并未设置为零。谁能告诉我为什么我无法获得任何值?

最佳答案

我不确定仅通过更改 mSelector 即可正确形成您的 propertyAddress。尝试使用以下值创建一个新的 propertyAddress:

AudioObjectPropertyAddress propertyAddress = { 
kAudioDevicePropertyVolumeScalar,
kAudioDevicePropertyScopeOutput,
1
};

并在最终的 AudioObjectGetPropertyData 调用中使用它。

关于objective-c - 无法从 cocoa Objective-C 的任何音频设备获取输出音量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9998839/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com