我正在使用音频单元服务来设置输出渲染回调,因此我可以将合成音频混合在一起。我的代码似乎完全适用于我的设备(iPod Touch,iPhone 3G和iPad),但无法在模拟器上运行。
在模拟器上,AudioUnitInitialise函数失败并返回值-10851(根据Apple文档,kAudioUnitErr_InvalidPropertyValue)。
这是我的初始化代码..任何对此API有更多经验的人比我看到的任何内容都不正确吗?
#define kOutputBus 0
#define kInputBus 1
...
static OSStatus playbackCallback(void *inRefCon,
AudioUnitRenderActionFlags* ioActionFlags,
const AudioTimeStamp* inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList* ioData)
{
// Mix audio here - but it never gets here on the simulator
return noErr;
}
...
{
OSStatus status;
// Describe audio component
AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_RemoteIO;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
// Get component
AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc);
// Get audio units
status = AudioComponentInstanceNew(inputComponent, &m_audio_unit);
if(status != noErr) {
NSLog(@"Failed to get audio component instance: %d", status);
}
// Enable IO for playback
UInt32 flag = 1;
status = AudioUnitSetProperty(m_audio_unit,
kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Output,
kOutputBus,
&flag,
sizeof(flag));
if(status != noErr) {
NSLog(@"Failed to enable audio i/o for playback: %d", status);
}
// Describe format
AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = 44100.00;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 2;
audioFormat.mBitsPerChannel = 16;
audioFormat.mBytesPerPacket = 4;
audioFormat.mBytesPerFrame = 4;
// Apply format
status = AudioUnitSetProperty(m_audio_unit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
kOutputBus,
&audioFormat,
sizeof(audioFormat));
if(status != noErr) {
NSLog(@"Failed to set format descriptor: %d", status);
}
// Set output callback
AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = playbackCallback;
callbackStruct.inputProcRefCon = self;
status = AudioUnitSetProperty(m_audio_unit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Global,
kOutputBus,
&callbackStruct,
sizeof(callbackStruct));
if(status != noErr) {
NSLog(@"Failed to set output callback: %d", status);
}
// Initialize (This is where it fails on the simulator)
status = AudioUnitInitialize(m_audio_unit);
if(status != noErr) {
NSLog(@"Failed to initialise audio unit: %d", status);
}
}
我的XCode版本是3.2.2(64位) 我的模拟器版本是3.2(虽然在3.1.3调试或发布中出现相同的问题)
谢谢,我很感激!
答案 0 :(得分:1)
为设备和模拟器进行编译是完全不同的。最常见的事情具有相同的预期结果。例如,在它们之间加载视图切换播放声音等等。然而,当谈到其他一些事情,比如用OpenAL加载10个缓冲区播放声音然后在它们之间切换时,模拟器无法处理,但设备可以。
我看到它的方式只要它在设备上工作就是我所关心的。当它在设备上正常工作时,不要只是为了让应用程序在模拟器上工作而不拔毛。
希望有所帮助
PK
答案 1 :(得分:0)
在调用RemoteIO初始化代码之前,您是否配置并启用了音频会话?
答案 2 :(得分:0)
将流属性设置为输入总线时,您使用kOutputBus
作为输入范围。这可能不太好。此外,您可能不需要将渲染回调应用于全局范围,因为您只需要输出。此外,我认为您对kOutputBus
和kInputBus
的定义是错误的...当我查看工作的iPhone音频代码时,它使用0表示输入总线,1表示输出总线。
我还可以想到关于AudioStreamBasicDescription的一些小问题,虽然我不认为这些会产生很大的不同:
kAudioFormatFlagsNativeEndian
属性添加到格式标记mReserved
字段显式设置为0。