石英2d绘图:完美的模拟器/坏设备。分布与调试

时间:2011-07-26 08:50:39

标签: iphone quartz-graphics

我刚刚为我的应用完成了波形绘图代码。我很满意它,在模拟器上看起来很棒。

我遇到的问题是当我在ipad上运行时它没有正确绘制。在模拟器上,绘图看起来像一个漂亮的常规波形图,而在ipad上,波形看起来就像一个大矩形。

我非常不确定如何开始解决问题和解决这类问题。

您能否就其在模拟器上工作的原因提出任何建议?不是ipad?

如果我可以提交任何可能有用的信息,请告诉我。

计算

-(void) plotwaveform:(AudioSourceOBJ )source
{

    int count =source->framecount;
    int blocksize= count/resolution;
    currentmaxvalue=0;


    int readindex=0;
    CGRect *addrects= malloc(resolution * sizeof(CGRect));
    float *heights=malloc(resolution * sizeof(float));

    for (int i=0; i<resolution;i++) {

        AudioUnitSampleType *blockofaudio;
        blockofaudio =malloc(blocksize * sizeof(AudioUnitSampleType));

        memcpy(blockofaudio, &source->leftoutput[readindex],(blocksize * sizeof(AudioUnitSampleType)));

        float sample= [self getRMS:blockofaudio blocksize:blocksize];
        heights[i]=sample;
        readindex+=blocksize;

    }

    for (int scale=0; scale<resolution; scale++) {


        float h= heights[scale];

        h= (h/currentmaxvalue)* 45;
        addrects[scale]=CGRectMake(scale, 0, 1, h);


    }



    if (waveform) {

        [waveform release];

        [waveform removeFromSuperview];
        waveform=nil;
    }



    CGMutablePathRef halfpath=CGPathCreateMutable();
    CGPathAddRects(halfpath, NULL, addrects, resolution);



    CGMutablePathRef path= CGPathCreateMutable();


   CGAffineTransform xf = CGAffineTransformIdentity;
    xf= CGAffineTransformTranslate(xf, 0.0,45);


    CGPathAddPath(path,&xf, halfpath);


    xf= CGAffineTransformIdentity;
    xf= CGAffineTransformTranslate(xf, 0.0, 45);
    xf=CGAffineTransformScale(xf, 1.0, -1);

    CGPathAddPath(path, &xf, halfpath);


    CGPathRelease(halfpath);

    free(addrects);
    waveform = [[Waveform alloc] initWithFrameAndPlotdata:CGRectMake(0, 0, 400,90) thepoints:path];
    [self.view addSubview:waveform];



}

-(float ) getRMS:(AudioUnitSampleType *)blockofaudio blocksize:(int)blocksize


{

    float output;
    float sqsummed;
    float sqrootofsum;
    float val;

    for (int i=0;i<blocksize; i++) {
        val= blockofaudio[i];
        sqsummed+= val* val;

    }

    sqrootofsum=sqsummed / blocksize;

    output = sqrt(sqrootofsum);

    // find the max
    if(output> currentmaxvalue)
    {
        currentmaxvalue=output;
    }
    return output;

}

图纸

- (void)drawRect:(CGRect)rect
{

    CGContextRef ctx= UIGraphicsGetCurrentContext();
    CGContextSetRGBFillColor(ctx, 0, 0, 0, .5);
    CGContextBeginPath(ctx);
    CGContextAddPath(ctx, mutatablepath);
    //CGContextStrokePath(ctx);
    CGContextFillPath(ctx);
    CFRelease(mutatablepath);

}

DESC编辑

我将一堆音频数据传递给plotwaveform函数并将其分成块。对于每个音频块,我计算每个块的RMS并保持跟踪最大值。完成所有操作后,我使用最大值来缩放我的rms值以适合我的视口。

我注意到了一件奇怪的事情。如果我在getRMS函数中对“输出”变量的值进行NSLog,则波形会在设备上正常显示。如果我没有NSLog值波形不能正确绘制?!?

对我而言是奇怪的。

2 个答案:

答案 0 :(得分:3)

我看到的一个主要错误是你永远不会在sqsummed方法中初始化getRMS:blocksize:,所以它的初始值是垃圾。垃圾发生的原因取决于周围代码的细节,编译器如何为变量分配寄存器等等。添加NSLog语句很可能会改变下一次循环中的垃圾。

如果垃圾总是对应一个非常小的浮点值,你会得到预期的行为,而如果碰巧总是对应一些非常大的浮点值(大到足以淹没实际样本),你会得到一个大矩形,如果它发生变化,你会得到类似噪音的输出。

答案 1 :(得分:0)

在任何情况下,请记住模拟器有你的整个mac ram和cpu电源。在iphone / ipad模拟器中,过程容量很难模拟。