我刚刚完成了我的应用程序的波形绘制代码。我对它非常满意,在模拟器上它看起来很棒。
我遇到的问题是,当我在 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/