我想生成一个自定义的DTMF音调并在iPhone上播放。 为了做到这一点,我创建并分配了一个带有自定义音调(ptr)的内存缓冲区。 现在我想创建一个NSData对象,使用内存缓冲区初始化,并使用initWithData将其传递给AVAudioPlayer:error:instance method。
我编写了以下代码,但是当我按下“播放”按钮时,它会崩溃。
#import "AudioPlayerViewController.h"
#include <stdlib.h>
#include <math.h>
#define SIZE 10
#define LENGTH 65535
const int PLAYBACKFREQ = 44100;
const float PI2 = 3.14159265359f * 2;
const int freq1 = 697;
const int freq2 = 1209;
@implementation AudioPlayerViewController
@synthesize playButton, stopButton;
- (void)viewDidLoad {
[super viewDidLoad];
// Allocate space for an array with ten elements of type int.
int *ptr = malloc(SIZE * sizeof(int));
if (ptr == NULL) NSLog(@"Error: Memory buffer could not be allocated.");
else NSLog(@"Allocation succeeded.");
// The formula for the tone, the content of the buffer.
for(int i=0; i<SIZE; i++) ptr[i] = (sin(i*(PI2*(PLAYBACKFREQ/freq1))) + sin(i* (PI2*(PLAYBACKFREQ/freq2)))) * 16383;
NSData *myData = [[NSData alloc] initWithBytesNoCopy:ptr length:SIZE];
free(ptr);
ptr = NULL;
audioPlayer = [[AVAudioPlayer alloc] initWithData:myData error:&error];
audioPlayer.numberOfLoops = -1;
}
-(IBAction) playAudio: (id) sender {
if (audioPlayer == nil) NSLog([error description]);
else [audioPlayer play];
}
-(IBAction) stopAudio: (id) sender { [audioPlayer stop]; }
- (void)dealloc {
[audioPlayer release];
[myData release];
[super dealloc];
}
@end
在文档中,initWithBytesNoCopy方法的描述如下:
包含新对象数据的缓冲区。 bytes必须指向使用malloc分配的内存块。
所以我已经这样做了,但它不起作用。
任何形式的帮助将不胜感激!
答案 0 :(得分:2)
您创建NSData而不复制数据然后释放数据,因此NSData现在有一个悬空指针。删除free(ptr);
行并再次尝试。完成后,NSData将自行释放数据。