Salutations,
A notre niveau je pense qu'on peut se permettre d'aller un peu plus loin dans la découverte de l'utilisation des frameworks, et surtout dans l'utilisation des fonctionnalités de l'iPhone. Dans ce présent tutoriel, tu vas apprendre à réaliser un petit lecteur audio (petit car seulement Play et Stop). Mais, pour compliquer un peu la chose, j'ai eu la brillante idée de te montrer comment utiliser l'accéléromètre pour commander ton lecteur.

Je tiens tout de suite à préciser que certaines méthodes que je vais t'enseigner, notamment pour l'accéléromètre, ne seront plus utiles avec l'OSX 3.0 : mais en attendant, on s'amuse ! 
1) Réalisation d'un Lecteur Audio : AVFoundation.framework
Dans la première partie de ce tutoriel, tu vas d'abord réaliser un petit lecteur audio qui fonctionne grâce à deux boutons Play et Stop. Pour cela, ouvre un nouveau projet : pour ma part j'ai choisi un simple View-Based Application.
Ensuite, importer dans ton projet le fichier audio que tu souhaites lire (ma musique s'appelle "sonnerie iphone.m4r" en ce qui me concerne. Tu peux aussi importer un fond d'écran pour ton application : ça ne coûte rien et ça embellit un peu le tout.
Comme vu dans les précédents tutoriels, tu peux supprimer le nomdetontutoViewController.xib et ne garder que le mainWindow.xib ... mais ça c'est juste pour que ton projet colle exactement avec le mien.
En dernier lieu, ajouter le fameux framework, AVFoundation.framework (clic droit
add existing framework : /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.1.sdk/System/Library/Frameworks/AVFoundation.framework).
Super, ton projet est fin prêt à recevoir le code, il devrait ressembler à cela pour le moment.

Attelons nous à présent au squelette de notre projet à éditer dans Interface Builder (double clic sur mainWindow.xib).
Je te laisse créer nos 2 boutons, 1 label et 1 UIImageView afin que le résultat ressemble à ceci :



Passons au code ... 
tutoriel11ViewController.h :
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <AVFoundation/AVAudioPlayer.h>
@interface tutoriel11ViewController : UIViewController {
IBOutlet UILabel *labelPlay;
AVAudioPlayer* theAudio;
}
@property (nonatomic, retain) IBOutlet UILabel *labelPlay;
- (IBAction)buttonPlay;
- (IBAction)buttonStop;
@endIci, on a déclaré notre label et nos 2 IBAction pour nos boutons.
tutoriel11ViewController.m :
#import "tutoriel11ViewController.h"
@implementation tutoriel11ViewController
@synthesize labelPlay;
int lectureOn = 0;
- (IBAction)buttonPlay
{
[theAudio play]; // lancer la lecture du fichier audio
[labelPlay setText:@"Play"];
lectureOn = 1;
}
- (IBAction)buttonStop
{
[theAudio stop]; // arreter la lecture du fichier audio
[labelPlay setText:@"Stop"];
lectureOn = 0;
}
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
[labelPlay setText:@"iPuP Audio Device"];
// configure le lecteur audio
NSString *path = [[NSBundle mainBundle] pathForResource:@"sonnerie iphone" ofType:@"m4r"]; //indiquer le chemin de notre son en donnant le nom du fichier et son extension
theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; //declarer un objet AVAudioPlayer
theAudio.delegate = self;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
// Release anything that's not essential, such as cached data
}
- (void)dealloc {
[super dealloc];
}
@endA noter que le lecteur accepte les formats audio .m4r, .mp3, .wav, ...
Logiquement, si les connections dans IB sont correctes, ça devrait compiler et fonctionner sur simulateur.

Nous en avons terminé avec notre première partie, et avons très largement posé les bases pour notre accéléromètre.
2) Initiation à l'utilisation de l'Accéléromètre
Utiliser l'accéléromètre nécessite quelques notions techniques. Donc sans trop rentrer dans les détails et les théories, je vais te donner un premier aperçu de ce que l'on peut faire avec l'accéléromètre : du moins tu sauras comment l'initialiser, avec les bons paramètres.
Complétons notre code ... 
tutoriel11ViewController.h :
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <AVFoundation/AVAudioPlayer.h>
// attention, ici on "delegue" la fonction accelerometre a notre viewController
@interface tutoriel11ViewController : UIViewController<UIAccelerometerDelegate> {
//parametres de l'accelerometre
UIAccelerationValue myAccelerometer[3];
CFTimeInterval lastTime;
AVAudioPlayer* theAudio;
BOOL lectureOn;
IBOutlet UILabel *labelPlay;
}
@property (nonatomic, retain) IBOutlet UILabel *labelPlay;
- (IBAction)buttonPlay;
- (IBAction)buttonStop;
- (void) accelerometer:(UIAccelerometer *)accelerometre didAccelerate:(UIAcceleration *)acceleration; //méthode contenue dans le SDK d'Apple
@endtutoriel11ViewController.m :
#define kAccelerometerFrequency 40 // nombre de fois par seconde (hertz) qu'on "sample" l'accelerometre
#define kFilteringFactor 0.1 // constante utilisee pour un filtre passe haut
#define kMinEraseInterval 0.5 // intervalle minimal entre deux "samples" pour declencher la fonction "secouer"
#define kEraseAccelerationThreshold 2.0 // seuil d'acceleration
#import "tutoriel11ViewController.h"
@implementation tutoriel11ViewController
@synthesize labelPlay;
int lectureOn = 0;
- (IBAction)buttonPlay
{
[theAudio play];
[labelPlay setText:@"Play"];
lectureOn = 1;
}
- (IBAction)buttonStop
{
[theAudio stop];
[labelPlay setText:@"Stop"];
lectureOn = 0;
}
// cette methode est deja definie dans le SDK
- (void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
UIAccelerationValue length,x,y,z; // ce sont les paramètres de notre accelerometre
//on utilise un filtre passe-haut pour compenser l'influence de la gravite : on retrouve nos constantes declarees plus haut dans les #define
myAccelerometer[0] = acceleration.x * kFilteringFactor + myAccelerometer[0] * (1.0 - kFilteringFactor);
myAccelerometer[1] = acceleration.y * kFilteringFactor + myAccelerometer[1] * (1.0 - kFilteringFactor);
myAccelerometer[2] = acceleration.z * kFilteringFactor + myAccelerometer[2] * (1.0 - kFilteringFactor);
// on calcule les valeurs pour nos 3 axes de l'accelerometre
x = acceleration.x - myAccelerometer[0];
y = acceleration.y - myAccelerometer[0];
z = acceleration.z - myAccelerometer[0];
// on calcule l'intensite de l'acceleration courante
length = sqrt(x * x + y * y + z * z);
// si l'iphone est secoue, on fait quelque chose (ici play ou stop)
// on peut jouer sur les paramètres pour accommoder la sensibilité du detecteur de "secousse", c'est a l'appreciation de chacun
// pour utiliser l'accelerometre, on scrute la difference de deplacement ou/et d'acceleration entre deux instants donnes : la methode CFAbsoluteTimeGetCurrent() permet d'obtenir la date de l'instant t2, qu'on compare a l'instant t1 donne par lastTime
if((length >= kEraseAccelerationThreshold) && (CFAbsoluteTimeGetCurrent() > lastTime + kMinEraseInterval))
if(!lectureOn)
{
[theAudio play];
[labelPlay setText:@"Play"];
lectureOn = YES;
lastTime = CFAbsoluteTimeGetCurrent();
}
else
{
[theAudio stop];
[labelPlay setText:@"Stop"];
lectureOn = NO;
lastTime = CFAbsoluteTimeGetCurrent();
}
}
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
[labelPlay setText:@"iPuP Audio Device"];
// Configure l'accelerometre et démarre la scrutation d'intervalle
[[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0 / kAccelerometerFrequency)];
[[UIAccelerometer sharedAccelerometer] setDelegate:self];
// configure le lecteur audio
NSString *path = [[NSBundle mainBundle] pathForResource:@"sonnerie iphone" ofType:@"m4r"];
theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
theAudio.delegate = self;
lectureOn = NO;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
// Release anything that's not essential, such as cached data
}
- (void)dealloc {
[super dealloc];
// Ne pas oublier le delegate de l'accéléromètre pour éviter qu'il soit actif lorsqu'on ne le souhaite pas
[[UIAccelerometer sharedAccelerometer] setDelegate:nil];
}
@endNous avons terminé l'implémentation de notre code. Il ne reste plus qu'à le compiler sur DEVICE seulement. Certains aspects de l'accéléromètre peuvent te sembler trop techniques, mais il suffit de s'exercer un petit peu pour en apprendre les ficelles.
Nous avons donc vu comment paramétrer l'accéléromètre et comment utiliser une fonction "secouer". Pour ceux qui voudraient aller plus loin, un bon exercice serait d'implémenter une fonction "translation" ou "rotation" : autrement dit des fonctions qui font quelque chose lorsqu'on tourne ou translate l'iPhone.
Par ailleurs, à partir de ce tutoriel, il est assez simple de réaliser des applications avec une balle qui bouge dans l'espace en fonction de l'inclinaison de l'iphone ... il suffit de modifier la position de ta balle en fonction des données de UIAccelerationValue myAccelerometer[3].
sources
heyfeel
Copyright © 2009 - ipup.fr • création de Jérémy Lagrue • design de Loann Fraillon • contact