audio commande non reconnue avec le framework CoreAudio

yodarkyodark Membre
11:31 modifié dans API UIKit #1
Bonjour a tous

j'ai une petite question j'ai inserer le framework CoreAudio a mon projet ensuite j'ai importé
#import <CoreAudio/CoreAudioTypes.h>


dans ma classe dans le fichier .m et .h

Pourtant quand je creer cette commande

SString * path=[mainBundle pathForResource:@676 ofType:@wav];
int key = 1 ;

AudioServicesCreateSystemSoundID(path, key);
AudioServicesPlaySystemSound(key);


les deux commandes AudioServicesCreateSystemSoundID et AudioServicesPlaySystemSound ne sont pas reconues... pourquoi?

Réponses

  • Philippe49Philippe49 Membre
    11:31 modifié #2
    dans 1222672988:

    j'ai une petite question j'ai inserer le framework CoreAudio a mon projet ensuite j'ai importé
    #import <CoreAudio/CoreAudioTypes.h>
    




    Ce ne serait pas #import <CoreAudio/CoreAudio.h> ?
  • yodarkyodark Membre
    11:31 modifié #3
    je viens de tester avec <CoreAudio/CoreAudio.h>
    il me dit no such file or directory...
  • Philippe49Philippe49 Membre
    11:31 modifié #4
    Vérifie dans ton arborescence de fichiers, il se trouve dans /System/Library/Frameworks/CoreAudio.framework/

    As-tu importé correctement le framework dans ton projet ?
  • yodarkyodark Membre
    11:31 modifié #5
    je vois pas vraiment comment vérifier ca ! Tu veux dire dans le dossier de mon application ?
    J'ai pas de sous dossier system (ou alors je ne sais pas ou il est)
    Par contre il apparait bien dans la liste de mes framework dans Xcode

    C'est bien <CoreAudio/CoreAudioTypes.h> que je dois importer ? car c'est bien ce fichier qui est dans le framework. par contre il n'y a pas de CoreAudio.h dans le framework
  • NoNo Membre
    septembre 2008 modifié #6
    Comme c'est pour iPhone, et que je ne me suis pas inscrit au iPhone Dev Center, je ne peux que te donner ce qui retourne google :
    Apparemment, il faut faire un #import <AudioToolbox/AudioServices.h>.
    Tente le coup pour voir...

    MAJ : bien sûr, faudra peut-être intégrer le framework de même nom dans ton projet.
  • Philippe49Philippe49 Membre
    11:31 modifié #7
    Effectivement  AudioServicesCreateSystemSoundID et AudioServicesPlaySystemSound sont dans ce framework.
  • yodarkyodark Membre
    11:31 modifié #8
    oui en effet c'est ça !

    Par contre j'obtiens un avertissement
    AudioServicesCreateSystemSoundID(path, key);
    me disant incompatible pointer type pour path et pointer from interger without cast pour key

    J'arrive plus a trouver d'ou j'ai eu ce code  :-\\
    quel est l'erreur ?
    <br /> NSBundle * mainBundle=[NSBundle mainBundle];<br />	 <br />	 NSString * path = [mainBundle pathForResource:@&quot;676&quot; ofType:@&quot;wav&quot;];<br />	 int key = 1 ;<br />	 <br />	 AudioServicesCreateSystemSoundID(path, key);<br />	 AudioServicesPlaySystemSound(key);
    



  • Philippe49Philippe49 Membre
    11:31 modifié #9
    Je te conseillerais de lire la doc au sujet de AudioServicesCreateSystemSoundID et de AudioServicesPlaySystemSound .
    Menu Help > Documentation
    Choisir iPhoneOS dans le répertoire Doc Sets
  • yodarkyodark Membre
    11:31 modifié #10
    Merci pour votre aide et désolé pour les nombreuses questions !

    J'ai un peu de peine a comprendre la doc d'apple en général... d'autant qu'il y a peu d'exemples
    ce que j'ai compris de la doc d'audio service c'est qu'il faut creer un system sound id pour identifier le son ensuite appeler cet key id pour jouer le son. Ca semble très simple :)

    Le key id ne peut donc pas être un int il doit être de type SystemSoundID ? donc dois-je l'instancier au préalable ?

    SystemSoundID *outSystemSoundID

    ou suffit-il de passer un nom dans AudioServicesCreateSystemSoundID afin d'avoir l'id creer ?
    Et pour le path ? la doc dit qu'il faut passer  CFURLRef c'est un path de type [mainBundle pathForResource:@676 ofType:@wav];

    Merci de votre patience !
  • NoNo Membre
    11:31 modifié #11
    Philippe te l'a dit : lis la doc.

    Car d'après le peu glané sur le net, la fonction AudioServicesCreateSystemSoundID a comme prototype :
    OSErr AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID *outSystemSoundID)
    Ce qui est bien loin de ce que tu as codé :
    1. le premier arg est un NSURL/CFURLREF (or tu fournis un NSString/CFStringRef),
    2. le second arg est un pointeur vers sans doute un int (pour récupérer l'ID du son venant d'être lu).
    De plus, cette fonction retourne un éventuel code erreur qu'il faut tester si le fichier son n'a pas pu être lu.

    Connais tu le C ?
  • AliGatorAliGator Membre, Modérateur
    11:31 modifié #12
    Si je ne dis pas de bétises, CFURLRef est toll-free bridged avec NSURL*
    Il suffit donc de construire une NSURL* à  partir de ton path (via [tt]fileURLWithPath:[/tt]) puis de simplement caster cette NSURL* en CFURLRef !
  • NoNo Membre
    septembre 2008 modifié #13
    dans 1222700953:

    Si je ne dis pas de bétises, CFURLRef est toll-free bridged avec NSURL*
    Il suffit donc de construire une NSURL* à  partir de ton path (via [tt]fileURLWithPath:[/tt]) puis de simplement caster cette NSURL* en CFURLRef !

    Non, pas de bétise, c'est vrai pour NSURL et CFURL (tout comme NSString et CFString).
    Mais le grios problème, c'est le 2nd argument : ça doit être un pointeur.
    Or il y met un int valant 1. Donc en toute logique, la fonction va tenter d'écrire à  l'adresse 1... Inutile de faire un dessin pour décrire ce qui se passera...

    Son problème ne semble plus être : comment fonctionne AudioServicesCreateSystemSoundID, mais connaitre un minimum la programmation  (et donc de savoir lire une doc), et surtout connaitre le C (et donc de bien mettre les bons arguments là  où il faut).
  • yodarkyodark Membre
    11:31 modifié #14
    En effet je connais pas bien le C je connait surtout le JAVA. Je me forme a l'objective C un peu sur tas en lisant des docs et des tutos
  • NoNo Membre
    11:31 modifié #15
    dans 1222776571:

    En effet je connais pas bien le C je connait surtout le JAVA. Je me forme a l'objective C un peu sur tas en lisant des docs et des tutos

    Euh, Java fait partie de la nombreuse descendance de C. Si tu sais coder en java, pondre du C ne te sera pas difficile.

    Pour ton problème précis, je te donne une piste (basée sur Foundation/AppKit du OSX, donc peut-être un peu différent de iPhone) :
    <br /> &nbsp; NSString *path;<br /> &nbsp; NSURL *url;<br /> &nbsp; int key;<br /><br /> &nbsp; // récupération du chemin du fichier 676.wav dans le bundle de l&#39;appli<br /> &nbsp; path=[[NSBundle mainBundle] pathForResource:@&quot;676&quot; ofType:@&quot;wav&quot;];<br /><br /> &nbsp; // transformation du path en url (copyright Aligator)<br /> &nbsp; url=[NSURL fileURLWithPath:path];<br /><br /> &nbsp; // chargement du fichier son<br /> &nbsp; AudioServicesCreateSystemSoundID(url, &amp;key);<br /><br /> &nbsp; // émission du son<br /> &nbsp; AudioServicesPlaySystemSound(key);<br />
    

  • AliGatorAliGator Membre, Modérateur
    11:31 modifié #16
    dans 1222814549:

    Euh, Java fait partie de la nombreuse descendance de C. Si tu sais coder en java, pondre du C ne te sera pas difficile.
    Euh... sauf, si je ne m'abuse (mon Java est loin mais bon), pour tout ce qui est relatif aux pointeurs... En java la gestion de la mémoire (faite avec le GC) et les pointeurs, on ne s'en soucie pas, on en fait souvent abstraction, et en gros dans l'idée ça n'existe pas...
    C'est sans doute ça qui perturbe yodark, cette notion de pointeur ([tt]SystemSoundID *[/tt] en l'occurence) qu'il ne connaà®t pas, donc forcément s'il pas l'entier directement au lieu de son adresse ne comprenant pas la différence... kaboum.
Connectez-vous ou Inscrivez-vous pour répondre.