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

时间:2011-05-26 23:23:21

标签: ios core-audio

作为练习,我正在尝试修改aurioTouch,以便节省通过麦克风进入的前60秒PCM。我正在避免使用更高级别的库,因为我想在此基础上构建一些低延迟的实时处理。我这样做只需创建一个大的saveBuffer,然后简单地为每个调用PerformThru的每个“inNumberFrames”附加存储在drawBuffers []中的data_ptr [2]值...然后,在经过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;
}

1 个答案:

答案 0 :(得分:0)

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

Gosh这个源代码非常难看,无论谁在Apple上编写它,在编写可读代码方面都有很多需要学习的东西。它实际上被用作公共样本的事实只是一个笑话。

看起来你做的一切都很正确。为什么不尝试禁用其他所有内容,只将样本送入缓冲区?

当我写一个音高检测器时,我已经做到了这一点并且工作正常。一旦我有30秒的样本,我就把所有内容都打印到控制台上,就像保存到文件一样。

我真的认为从头开始编写可视化器有更多好处。 AurioTouch是一个混乱,它需要更长的时间来弄清楚它是如何工作的,然后实际构建一个。