音频队列 |在 audioQueue 运行时更改音频设备
Posted
技术标签:
【中文标题】音频队列 |在 audioQueue 运行时更改音频设备【英文标题】:AudioQueue | Change audio device while audioQueue is running 【发布时间】:2013-11-18 15:30:12 【问题描述】:我正在使用音频队列在 OSX 上播放和录制 | Mac 并有一个用例, 类似于,用户可以在音频队列运行播放或记录时更改音频设备(输入和输出),
这是我到目前为止所做的,
OSStatus result = noErr;
// get the device list
AudioObjectPropertyAddress thePropertyAddress = kAudioHardwarePropertyDefaultOutputDevice, kAudioObjectPropertyScopeGlobal,
kAudioObjectPropertyElementMaster ;
UInt32 thePropSize;
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)input,
&thePropertyAddress, 0, NULL, &thePropSize, &theDeviceName);
if ( result != noErr)
log("Error while getting property");
return;
// get the uid of the device
CFStringRef theDeviceUID;
thePropertyAddress.mSelector = kAudioDevicePropertyDeviceUID;
result = AudioObjectGetPropertyData( (AudioObjectID)input,
&thePropertyAddress, 0, NULL, &thePropSize, &theDeviceUID);
try
XThrowIfError(AudioQueueSetProperty(mQueue,kAudioQueueProperty_CurrentDevice,&theDeviceUID, sizeof(CFStringRef)),"set input device");
catch (CAXException e)
char buf[256];
fprintf(stderr, "Error: %s (%s)\n", e.mOperation, e.FormatError(buf));
但是它抛出了一个异常 kAudioQueueErr_InvalidRunState ,reference说它不能在队列运行时完成;
还有其他方法可以达到同样的效果吗?
【问题讨论】:
【参考方案1】:不幸的是,没有其他方法可以实现这一点(AudioQueue 的功能太少了)。您需要首先停止音频队列,然后更改其属性,最后重新启动它。
【讨论】:
以上是关于音频队列 |在 audioQueue 运行时更改音频设备的主要内容,如果未能解决你的问题,请参考以下文章