ios核心音频:修改aurioTouch以保存pcm数据

作为练习,我试图修改aurioTouch,以便通过麦克风节省前60秒的PCM。 我正在避免更高级别的库,因为我想在此基础上构建一些低延迟的实时处理。 我通过简单地创建一个大的saveBuffer,然后简单地追加存储在drawBuffers []中的data_ptr [2]值为每个“inNumberFrames”每次调用PerformThru ...然后,60秒后,我转储缓冲到磁盘一次。

我通过统一点击来尝试此代码。 问题在于,当我在gnuplot中显示saveBuffer数据时,我会在非均匀时间出现峰值,从稳定点击中减少30-40%,这意味着某些峰值靠得很近,而其他峰值则相距甚远。 我可以看到输入点击.wav并且它非常平均,但saveBuffer图具有奇怪的峰值。 这让我怀疑我是否正确保存了pcm数据? 也许我不知道如何花费太长时间并因此丢失数据?

PerformThru()中的更改我有:

{//分配缓冲区static int * saveBuffer =(int *)malloc(10000000 * sizeof(int)); 。 。 。

    SInt8 *data_ptr = (SInt8 *)(ioData->mBuffers[0].mData);

    for (i=0; i<inNumberFrames; i++)
    {
        if ((i+drawBufferIdx) >= drawBufferLen)
        {
            cycleOscilloscopeLines();
            drawBufferIdx = -i;
        }
        drawBuffers[0][i + drawBufferIdx] = data_ptr[2];

        // XXXX I added this line
        if ( saveBuffer ) { saveBuffer[ saveBufferIdx++ ] = ( data_ptr[ 2 ] ); }


        data_ptr += 4;
    }

    // XXX - I added this block:  dump saveBuffer after 60 seconds
    if ( saveBuffer && ( CAHostTimeBase::HostDeltaToNanos( initialHostTime, inTimeStamp->mHostTime ) / 1000000000 ) > 60 )
    {
        std::ofstream bufferOut;
        bufferOut.open( "pcmBuffer.txt" );
        for ( UInt64 i = 0; i < saveBufferIdx; i++ )
        {
            bufferOut << saveBuffer[ i ] << std::endl;
        }
        bufferOut.close();
        free( saveBuffer );
        saveBuffer = 0;
    }
    drawBufferIdx += inNumberFrames;
}

使用CAMediaCurrentTime(媒体当前/当前媒体 - 我总是忘记哪个方向)

天哪,这个源代码屁股很丑陋,无论是谁在苹果公司编写它都有很多东西需要学习编写可读代码。 它实际上用作公共样本的事实只是一个笑话。

它看起来像你正在做的一切正确。 你为什么不尝试禁用其他所有东西,只将样本送入缓冲区?

我在写一个音高探测器时已经完成了这项工作,并且工作正常。 一旦我有30秒的样本,我就把所有东西都打印到控制台上,就像保存到文件一样。

我真的认为从头开始编码可视化器会有更多好处。 AurioTouch是一团糟,需要花费更长时间才能找出它的工作原理,然后才能真正建立一个。

链接地址: http://www.djcxy.com/p/67017.html

上一篇: ios core audio: modifying aurioTouch to save pcm data

下一篇: AudioQueue gaps in playback