2010-08-11 3 views
0

Je souhaite générer un son DTMF personnalisé et le lire sur l'iPhone. Pour ce faire, j'ai créé et affecté un tampon mémoire avec une tonalité personnalisée (ptr). Maintenant, je veux créer un objet NSData, initialisé avec le tampon mémoire, et le passer à AVAudioPlayer en utilisant la méthode initWithData: error: instance.La génération d'une tonalité DTMF ne fonctionne pas - l'application plante!

J'ai écrit le code suivant, mais lorsque j'exécute mon application, il se bloque.

#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 

Dans la documentation, la description du procédé initWithBytesNoCopy lit:

«Un tampon contenant des données pour le nouvel objet octets doivent pointer vers un bloc de mémoire alloué avec malloc. »

Donc, je l'ai déjà fait, mais cela ne fonctionne pas.

Toute sorte d'aide sera appréciée!

Merci à l'avance,

Sagiftw

Répondre

1

Vous êtes par la taille, mais allouer de passer en longueur que la longueur. Vous avez défini SIZE comme "10" et LONGUEUR comme un nombre énorme. Il n'est pas étonnant que ça se passe comme ça à la fin de la région que vous avez choisie!

+0

Ok, vous avez raison. Je l'ai changé pour TAILLE, maintenant l'application se charge mais quand j'appuie sur le bouton "Play", il se bloque. – Sagiftw