Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 音频输出单元启动非常慢_C++_Ios_Core Audio - Fatal编程技术网

C++ 音频输出单元启动非常慢

C++ 音频输出单元启动非常慢,c++,ios,core-audio,C++,Ios,Core Audio,我有一个代码,播放单声道音频事件(短嘟嘟声在各种频率)。 我创建一个AudioOutputUnit,在需要播放音频时停止它。我开始了。当我播放了规定的时间后,我会停止播放 听起来很简单 然而,在我的iPhone4S(iOS5.1)上,AudioOutputUnitStart通常需要180毫秒才能恢复,这太过分了 以下是AudioOutputUnit的创建/初始化 void createAOU() { m_init = false; // find the default play

我有一个代码,播放单声道音频事件(短嘟嘟声在各种频率)。 我创建一个AudioOutputUnit,在需要播放音频时停止它。我开始了。当我播放了规定的时间后,我会停止播放

听起来很简单

然而,在我的iPhone4S(iOS5.1)上,AudioOutputUnitStart通常需要180毫秒才能恢复,这太过分了

以下是AudioOutputUnit的创建/初始化

void createAOU()
{
    m_init = false;
    // find the default playback output unit
    AudioComponentDescription defaultOutputDescription;
    defaultOutputDescription.componentType = kAudioUnitType_Output;
    defaultOutputDescription.componentSubType = kAudioUnitSubType_RemoteIO;
    defaultOutputDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
    defaultOutputDescription.componentFlags = 0;
    defaultOutputDescription.componentFlagsMask = 0;

    // Get the default playback output unit
    AudioComponent defaultOutput = AudioComponentFindNext(NULL, &defaultOutputDescription);
    if (defaultOutput == NULL)
        return;

    OSErr err = AudioComponentInstanceNew(defaultOutput, &m_toneUnit);
    if (err != noErr)
        return;

    // single channel, floating point, linear PCM
    AudioStreamBasicDescription streamFormat;
    streamFormat.mSampleRate = m_framerate;
    streamFormat.mFormatID = kAudioFormatLinearPCM;
    streamFormat.mFormatFlags =
    kLinearPCMFormatFlagIsFloat |
    kAudioFormatFlagsNativeEndian | kLinearPCMFormatFlagIsPacked;
    streamFormat.mBytesPerPacket = sizeof(float);
    streamFormat.mFramesPerPacket = 1;
    streamFormat.mBytesPerFrame = sizeof(float);
    streamFormat.mChannelsPerFrame = 1;
    streamFormat.mBitsPerChannel = sizeof(float) * 8;
    err = AudioUnitSetProperty (m_toneUnit,
                                kAudioUnitProperty_StreamFormat,
                                kAudioUnitScope_Input,
                                0,
                                &streamFormat,
                                sizeof(AudioStreamBasicDescription));
    if (err != noErr)
        return;

    // Attach callback to default output
    AURenderCallbackStruct input;
    input.inputProc = RenderTone;
    input.inputProcRefCon = this;
    err = AudioUnitSetProperty(m_toneUnit, 
                               kAudioUnitProperty_SetRenderCallback, 
                               kAudioUnitScope_Input,
                               0, 
                               &input, 
                               sizeof(input));
    if (err != noErr)
        return;

    float aBufferLength = 0.001; // In seconds
    AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, 
                            sizeof(aBufferLength), &aBufferLength);

    err = AudioUnitInitialize(m_toneUnit);
    if (err != noErr)
        return;
    reset();
    m_init = true;
}
首先,我只想说:

OSErr err = AudioOutputUnitStart(m_toneUnit);
完成后:

OSErr err = AudioOutputUnitStop(m_toneUnit);
我尝试过各种方法: 将kAudioSessionProperty_PreferredHardwareIOBufferDuration属性设置为非常小的值(如5ms) 降低帧率(48kHz、44.1kHz、8kHz)

不管我做什么。。。 首次启动audiounit时,AudioOutputUnitStart仅在160-180ms后返回。如果我立即停止并启动,那么只需要大约5米,这是可以接受的

在我的应用程序中,延迟是相当重要的,180毫秒是绝对不能接受的

有什么建议吗? 我见过一些人问类似的问题,但他们通常都没有得到答案


我希望这次情况会有所不同:)

处理音频单元启动延迟的方法是提前启动音频单元,而不是停止它。相反,只需将音频会话配置为短缓冲区,然后用静音填充音频单元渲染回调缓冲区,直到用所需的声音填充它们。然后,在您的声音结束后,返回到用静音填充缓冲区,而不是停止。

您可能已经想到了这一点-但是添加/删除renderCallback是否在这里起作用?我也看到了这一点(尽管你的缓冲区很小):我实际上没有想到删除回调;在回调中,声波实际上是生成的,因此音频缓冲区可能很小。will Tryth我所关心的问题是,你知道一直有第二个线程在运行,而且我的音频缓冲区很短(以减少延迟),这肯定会对性能产生相当大的影响。@jyavenard:IIRC,一个连续运行的带有很短缓冲区的RemoteIO音频单元在iPhone 4上使用的CPU周期不到1%。任何性能影响都可能是完全不可察觉的。