我刚刚为我的应用完成了波形绘图代码。我很满意它,在模拟器上看起来很棒。
我遇到的问题是当我在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值波形不能正确绘制?!?
对我而言是奇怪的。
答案 0 :(得分:3)
我看到的一个主要错误是你永远不会在sqsummed
方法中初始化getRMS:blocksize:
,所以它的初始值是垃圾。垃圾发生的原因取决于周围代码的细节,编译器如何为变量分配寄存器等等。添加NSLog语句很可能会改变下一次循环中的垃圾。
如果垃圾总是对应一个非常小的浮点值,你会得到预期的行为,而如果碰巧总是对应一些非常大的浮点值(大到足以淹没实际样本),你会得到一个大矩形,如果它发生变化,你会得到类似噪音的输出。
答案 1 :(得分:0)
在任何情况下,请记住模拟器有你的整个mac ram和cpu电源。在iphone / ipad模拟器中,过程容量很难不模拟。