音频队列 |在 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 运行时更改音频设备的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 上的音频混合:需要建议

iOS:使用 AudioQueue 时快进音频

使用 AudioQueue 播放 PCM 音频流音量低

在 AudioQueue 录制时播放警报声音(振动)

Objective-C - 将流数据传递到音频队列

音频队列:AudioQueueStart 返回 -50