Bonnes feuilles : Développer pour l'Iphone et l'Ipad Lire et enregistrer des sons

AVAudioPlayer

La classe AVAudioPlayer fournit un moyen simple de jouer de la musique. L'exemple AddMusic montre l'utilisation de cette classe.

Il convient tout d'abord d'instancier la classe, comme dans la méthode awakeFromNib de la classe avTouchController dans l'exemple avTouch :

 - (void)awakeFromNib
{
...
self._player = [[AVAudioPlayer alloc]
initWithContentsOfURL:fileURL error:nil];
if (self._player) {
...
}
OSStatus result = AudioSessionInitialize(NULL, NULL, NULL, NULL);
if (result) printf("Error initializing audio session! %d\n", result);
UInt32 category = kAudioSessionCategory_SoloAmbientSound;
result = AudioSessionSetProperty(
kAudioSessionProperty_AudioCategory
sizeof(category), &category);
if (result) printf("Error setting audio category! %d\n", result);
...
}

Cet exemple montre aussi l'initialisation d'une session audio avec les réglages par défaut. La catégorie kAudioSessionCategory_SoloAmbientSound signifie que le
son joué par une application extérieure (typiquement iPod) est coupé, que le son de l'application est coupé si l'utilisateur place l'appareil en position silence ou si l'écran est verrouillé (par l'utilisateur ou automatiquement).

La méthode prepareToPlay demande au player de précharger son buffer et d'acquérir les ressources physiques nécessaires pour la lecture.

La méthode play lance la lecture, la méthode pause l'interrompt et la méthode stop l'arrête.

La propriété currentTime indique combien de temps (en secondes) s'est écoulé depuis le début de la lecture. En modifiant cette propriété, on peut déclencher la lecture à partir d'un point précis dans la piste audio.

La méthode setDelegate permet d'indiquer au player un objet implémentant le protocole AVAudioPlayerDelegate. Cette instance est automatiquement notifiée si une erreur survient lors du décodage des données, si un appel entrant interrompt la lecture du son ou lorsque celle-ci est achevée.

Les méthodes déclarées dans le protocole AVAudioPlayerDelegate sont :

 audioPlayerBeginInterruption, appelée lorsque la lecture du son est interrompue par exemple par un appel entrant.

 audioPlayerEndInterruption, appelée lorsque l'interruption se termine, par exemple lorsque l'utilisateur décide de ne pas répondre à l'appel entrant.

 audioPlayerDidFinishPlaying:successfully:, appelée lorsque la lecture se termine. Le premier paramètre est un pointeur sur l'instance de AVAudioPlayer qui a achevé sa lecture, le deuxième est YES si la lecture s'est achevée normalement, NO si la lecture s'est achevée parce que le système n'a pas pu décoder les données.

 audioPlayerDecodeErrorDidOccur:error: appelée lorsque le player rencontre une erreur en décodant les données.

Ces méthodes sont implémentées par la classe avTouchController de l'exemple avTouch :

 - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player
successfully:(BOOL)flag
{
if (flag == NO)
NSLog(@"Playback finished unsuccessfully");
[player setCurrentTime:0.];
[self updateViewForPlayerState:player];
}
- (void)playerDecodeErrorDidOccur:(AVAudioPlayer *)player
error:(NSError *)error
{
NSLog(@"ERROR IN DECODE: %@\n", error);
}
- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player
{
// the object has already been paused, we just need to update UI
[self updateViewForPlayerState:player];
}
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player
{
[self startPlaybackForPlayer:player];

AVAudioRecorder

La classe AVAudioRecorder fournit les services équivalents pour l'enregistrement de son. Au lieu de la méthode play, elle possède les méthodes record et recordForDuration: qui indique le nombre maximum de secondes que doit durer l'enregistrement.

L'argument url de initWithURL:settings:error: indique l'emplacement dans le système de fichiers où enregistrer le son capturé. Le type de fichier est déduit de l'extension utilisée dans l'URL.