[RESOLU] Comment utiliser la classe CARingBuffer sur un projet iPhone ?

dabrutdabrut Membre
août 2011 modifié dans API UIKit #1
Bonjour à  tous,

je suis actuellement entrain de développer une application Audio sur iPhone et je voudrais utiliser la classe CARingBuffer disponible dans le repertoire PublicUtility dans Extras de CoreAudio.
Seulement lorsque j'include le header et que je declare un objet CARingBuffer dans le header de la viewController, j'ai plein d'erreurs de compilation.
Pouvez-vous m'aider ?

Pour reproduire le probleme, c'est assez simple, créer un nouveau projet iOS "ViewBased Application", puis d'essayer de d'inclure CARingBuffer ("#include CARingBuffer.h") dans le header de votre viewController et de declarer un objet de ce type.

Merci d'avance.

Réponses

  • muqaddarmuqaddar Administrateur
    03:42 modifié #2
    T'as ajouté le framework CoreAudio à  ton projet ?
  • dabrutdabrut Membre
    03:42 modifié #3
    Oui je l'ai fait.

    Voici le contenu de mon header testViewController :
    #import &lt;UIKit/UIKit.h&gt;<br /><br />#include &quot;CARingBuffer.h&quot;<br /><br />@interface testViewController : UIViewController {<br /><br />}<br /><br />@end<br />
    


    Le contenu de testViewController.m
    #import &quot;testViewController.h&quot;<br /><br />@implementation testViewController<br /><br />- (void)dealloc<br />{<br />&nbsp; &nbsp; [super dealloc];<br />}<br /><br />- (void)didReceiveMemoryWarning<br />{<br />&nbsp; &nbsp; // Releases the view if it doesn&#039;t have a superview.<br />&nbsp; &nbsp; [super didReceiveMemoryWarning];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Release any cached data, images, etc that aren&#039;t in use.<br />}<br /><br />#pragma mark - View lifecycle<br /><br />/*<br />// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.<br />- (void)viewDidLoad<br />{<br />&nbsp; &nbsp; [super viewDidLoad];<br />}<br />*/<br /><br />- (void)viewDidUnload<br />{<br />&nbsp; &nbsp; [super viewDidUnload];<br />&nbsp; &nbsp; // Release any retained subviews of the main view.<br />&nbsp; &nbsp; // e.g. self.myOutlet = nil;<br />}<br /><br />- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation<br />{<br />&nbsp; &nbsp; // Return YES for supported orientations<br />&nbsp; &nbsp; return (interfaceOrientation == UIInterfaceOrientationPortrait);<br />}<br /><br />@end
    


    et j'ai 4 erreurs de compile qui sont localisé dans le CARingBuffer.h etrangement :
    1) Initializer element is not a constant sur la ligne
    const UInt32 kGeneralRingTimeBoundsQueueMask = kGeneralRingTimeBoundsQueueSize - 1;
    


    2) Expected ';' after top level declarator, Expected '='... or '__atribute__' before 'CARingBuffer'
    class CARingBuffer {
    


    3) Initializer element is not a constant sur la ligne
    const UInt32 kGeneralRingTimeBoundsQueueMask = kGeneralRingTimeBoundsQueueSize - 1;
    


    4) Expected ';' after top level declarator, Expected '='... or '__atribute__' before 'CARingBuffer'
    class CARingBuffer {
    
  • SethySethy Membre
    03:42 modifié #4

    Si c'est une classe du framework, est-ce qu'il ne faut pas plutôt un include du genre :

    #include <  >  et pas #include "  " ?

    Tu n'as quand même pas copié le fichier .h dans le folder de ton appli ?

    Sethy
  • dabrutdabrut Membre
    03:42 modifié #5
    Non je n'ai pas copié le CARingBuffer.h dans mon repertoire.
    Je l'ai juste ajouté a mon projet.
    Les <> ne fonctionnent pas. Il me dit "No such file ...".

    Pour info CARingBuffer ne fait pas partie du framework mais est une classe C++ ecrite par Apple pour aider les developpeurs
  • muqaddarmuqaddar Administrateur
    03:42 modifié #6
    T'es sûr d'avoir la dernière version de la classe ?
    http://developer.apple.com/library/ios/#qa/qa1665/_index.html
  • dabrutdabrut Membre
    03:42 modifié #7
    Yep.

    C'est vraiment bizarre car j'include des classes en C et ça fonctionne impec.
    Y a t'il des specificités au C++ ?
  • CéroceCéroce Membre, Modérateur
    03:42 modifié #8
    Est-ce que tes fichiers sources portent l'extension .mm ?
    C'est une condition sine qua non pour utiliser Objective-C++.
  • dabrutdabrut Membre
    03:42 modifié #9
    Merci Ceroce.
    Tu m'as en partie aider.

    Par contre je ne comprends pourquoi ça fonctionne maintenant.

    Disons que dans mon projet j'ai
    -> mon AppDelegate
    -> Classe A dans laquel j'include le "CARingBuffer.h" et qui etait bien en .mm
    -> Classe B qui include mon appDelegate et qui etait en .m
    -> classe C qui include mon appDelegate et qui etait en .m

    Pour que ça fonctionne j'ai du mettre toute les classes en .mm

    Je n'ai pas compris pourquoi ?
    Avez-vous une idée ?

  • CéroceCéroce Membre, Modérateur
    03:42 modifié #10
    Lis le guide sur Objective-C, il explique les limitations d'Objective-C++.
    Mais en gros, ça te permet d'instancier des objets C++ à  partir d'ObjC et faire des appels de méthodes C++, et réciproquement, mais pas plus.
  • dabrutdabrut Membre
    03:42 modifié #11
    Effectivement, ça fonctionne maintenant.
    J'ai déclaré une structure opaque dans le header.
    Et je n'ai inclue le CARingBuffer.h que dans le .mm ce qui m'évite de mettre toutes les autres classe en .mm.
    Et donc je declare ma struct dans le .mm.

    Merci a vous deux pour votre aide
Connectez-vous ou Inscrivez-vous pour répondre.