Генерация тона с использованием DTMF и воспроизведение его с помощью AVAudioPlayer - PullRequest
1 голос
/ 11 августа 2010

Я хочу создать собственный тон DTMF и воспроизвести его на iPhone. Для этого я создал и выделил буфер памяти с пользовательским тоном (ptr). Теперь я хочу создать объект NSData, инициализированный с буфером памяти, и передать его AVAudioPlayer, используя initWithData: error: метод экземпляра.

Я написал следующий код, но при нажатии кнопки «Воспроизвести» он вылетает.

#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 гласит:

Буфер, содержащий данные для нового объекта. байты должны указывать на блок памяти, выделенный с помощью malloc.

Так что я уже сделал это, но это не работает.

Буду признателен за любую помощь!

1 Ответ

2 голосов
/ 11 августа 2010

Вы создаете NSData без копирования данных, а затем освобождаете данные, поэтому NSData теперь имеет висячий указатель. Удалите строку free(ptr); и попробуйте снова. NSData освободит данные самостоятельно, когда это будет сделано.

...