2

在 NSSound 被证明无法胜任这项任务之后,我在上周计划外进行了一次深入 Macintosh 音响系统的深入探索。我终于用音频队列服务播放了我的文件,现在只剩下一件小事要做了:切换输出设备。

不幸的是,似乎我做错了什么,或者您应该通过的设备 UID CFStringRef 不是 Core Audio 给出的那个..

下面的代码检索标准输出设备(默认情况下音频队列将播放到该设备,但它拒绝更改设备:

UInt32 thePropSize;
AudioDeviceID defaultAudioDevice;

OSStatus result = noErr;

// get the device list  
AudioObjectPropertyAddress thePropertyAddress = { kAudioHardwarePropertyDefaultOutputDevice, kAudioObjectPropertyScopeGlobal, 
    kAudioObjectPropertyElementMaster };

result = AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &thePropertyAddress, 0, NULL, &thePropSize);

result = AudioObjectGetPropertyData(kAudioObjectSystemObject, &thePropertyAddress, 0, NULL, &thePropSize, &defaultAudioDevice);

CFStringRef theDeviceName;      

// get the device name
thePropSize = sizeof(CFStringRef);
thePropertyAddress.mSelector = kAudioObjectPropertyName;
thePropertyAddress.mScope = kAudioObjectPropertyScopeGlobal;
thePropertyAddress.mElement = kAudioObjectPropertyElementMaster;

// get the name of the device
result = AudioObjectGetPropertyData( (AudioObjectID)defaultAudioDevice, 
                                    &thePropertyAddress, 0, NULL, &thePropSize, &theDeviceName);

// get the uid of the device
CFStringRef theDeviceUID;
thePropertyAddress.mSelector = kAudioDevicePropertyDeviceUID;
result = AudioObjectGetPropertyData( (AudioObjectID)defaultAudioDevice, 
                                    &thePropertyAddress, 0, NULL, &thePropSize, &theDeviceUID);


result = AudioQueueSetProperty( playerState.mQueue,
                                        kAudioQueueProperty_CurrentDevice,
                                        &theDeviceUID,
                                        sizeof(theDeviceUID));

如果队列正在播放,我会收到错误 kAudioQueueErr_InvalidRunState,告诉我在队列正在播放时无法设置此属性。如果队列没有播放,我会得到 -50 参数错误。

我的指针有问题吗?还是某处有不同的设备uid!?

任何帮助将不胜感激。

4

1 回答 1

2

我想出了一个解决方案,并将其发布在这里以供存档:

Apple Developer Services 在一个单独的项目中测试了我的代码,它对他们来说运行得很好。不同之处在于他们设置了设备 uid,没有所有繁琐的音频缓冲区和音量设置等。我将设备 uid 更改从队列设置结束后立即创建队列和宾果游戏!它工作得很好。

我不是 100% 确定,但我认为由于某些硬件驱动程序限制,您在设置队列增益后无法更改设备。“参数错误”似乎并不完全指向那个方向,但我认为“更改设备为时已晚”错误会更合适。

于 2010-09-01T22:03:54.943 回答