iphone - Quartz 2d 绘图 : Perfect on simulator/bad on device. 分发与调试

标签 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函数并将其分成 block 。对于每个音频 block ,我计算每个 block 的 RMS 并跟踪最大值。完成所有这些后,我使用最大值来缩放我的均方根值以适合我的视口(viewport)。

我注意到一件奇怪的事情。如果我 NSLog getRMS 函数中“输出”变量的值,则波形在设备上绘制得很好。如果我不 NSLog 波形无法正确绘制值?!?

这对我来说很奇怪。

最佳答案

我发现的一个主要错误是您从未在 getRMS:blocksize: 方法中初始化 sqsummed,因此其初始值是垃圾。垃圾是什么取决于周围代码的细节、编译器如何为变量分配寄存器等等。添加 NSLog 语句很可能会改变下一次循环中的垃圾内容。

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

关于iphone - Quartz 2d 绘图 : Perfect on simulator/bad on device. 分发与调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6827484/

相关文章:

objective-c - 在 UIImageView 之上绘制使图像透明

iphone - 从 UIColor 获取重复图案的大小?

iphone - NSNumber 超出范围?

iphone - CALayer alpha 蒙版不起作用

ios - 性能 : UIView in a UIView or replace the UIView?

iphone - 在 IOS SDK 中更改 Cell.TextLabel 宽度

iphone - 检索 UIImage 的像素 alpha 值

iphone - 结合UIView动画 block 和OpenGL ES渲染

iphone - 如何将屏幕旋转为横向?

iPhone:如何以编程方式删除按钮背景图像?